Submitted URL: http://www.ecreativeworks.com/
Effective URL: https://www.ecreativeworks.com/
Submission: On May 07 via manual from US

Summary

This website contacted 15 IPs in 5 countries across 14 domains to perform 100 HTTP transactions. The main IP is 52.15.252.66, located in Columbus, United States and belongs to AMAZON-02, US. The main domain is www.ecreativeworks.com.
TLS certificate: Issued by Sectigo RSA Domain Validation Secure ... on February 19th 2020. Valid for: 2 years.
This is the only time www.ecreativeworks.com was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

Domain Requested by
75 www.ecreativeworks.com 1 redirects www.ecreativeworks.com
6 d10lpsik1i8c69.cloudfront.net www.ecreativeworks.com
d10lpsik1i8c69.cloudfront.net
3 fonts.gstatic.com www.ecreativeworks.com
3 www.google-analytics.com 2 redirects www.googletagmanager.com
2 www.facebook.com www.ecreativeworks.com
2 connect.facebook.net www.ecreativeworks.com
connect.facebook.net
2 px.ads.linkedin.com 1 redirects www.ecreativeworks.com
2 stats.g.doubleclick.net www.ecreativeworks.com
2 koi-3q3g4nfwrm.marketingautomation.services www.ecreativeworks.com
koi-3q3g4nfwrm.marketingautomation.services
1 settings.luckyorange.net d10lpsik1i8c69.cloudfront.net
1 fonts.googleapis.com www.ecreativeworks.com
1 app.upcity.com www.ecreativeworks.com
1 www.linkedin.com 1 redirects
1 snap.licdn.com www.googletagmanager.com
1 www.googletagmanager.com www.ecreativeworks.com
100 15
Subject Issuer Validity Valid
*.ecreativeworks.com
Sectigo RSA Domain Validation Secure Server CA
2020-02-19 -
2022-03-07
2 years crt.sh
*.google-analytics.com
GTS CA 1O1
2020-04-15 -
2020-07-08
3 months crt.sh
*.marketingautomation.services
Sectigo RSA Organization Validation Secure Server CA
2020-03-12 -
2022-06-10
2 years crt.sh
*.licdn.com
DigiCert SHA2 Secure Server CA
2019-04-01 -
2021-05-07
2 years crt.sh
*.g.doubleclick.net
GTS CA 1O1
2020-04-15 -
2020-07-08
3 months crt.sh
px.ads.linkedin.com
DigiCert SHA2 Secure Server CA
2020-03-04 -
2020-09-04
6 months crt.sh
*.upcity.com
RapidSSL RSA CA 2018
2018-03-08 -
2020-06-06
2 years crt.sh
upload.video.google.com
GTS CA 1O1
2020-04-15 -
2020-07-08
3 months crt.sh
*.gstatic.com
GTS CA 1O1
2020-04-15 -
2020-07-08
3 months crt.sh
*.cloudfront.net
DigiCert Global CA G2
2019-07-17 -
2020-07-05
a year crt.sh
*.facebook.com
DigiCert SHA2 High Assurance Server CA
2020-04-15 -
2020-07-14
3 months crt.sh
sni.cloudflaressl.com
CloudFlare Inc ECC CA-2
2020-03-19 -
2020-10-09
7 months crt.sh

This page contains 2 frames:

Primary Page: https://www.ecreativeworks.com/
Frame ID: 81D3E394F3431553B71C38621BF15BA4
Requests: 100 HTTP requests in this frame

Frame: https://d10lpsik1i8c69.cloudfront.net/js/clickstream.js?v=b92c44e
Frame ID: 0B35B69660C4A1B7A55182B3C3B17C95
Requests: 3 HTTP requests in this frame

Screenshot


Page URL History Show full URLs

  1. http://www.ecreativeworks.com/ HTTP 301
    https://www.ecreativeworks.com/ Page URL

Detected technologies

Overall confidence: 100%
Detected patterns
  • headers server /(?:Apache(?:$|\/([\d.]+)|[^/-])|(?:^|\b)HTTPD)/i

Overall confidence: 100%
Detected patterns
  • script /\/\/connect\.facebook\.net\/[^/]*\/[a-z]*\.js/i

Overall confidence: 100%
Detected patterns
  • script /google-analytics\.com\/(?:ga|urchin|analytics)\.js/i

Overall confidence: 100%
Detected patterns
  • html /<!-- (?:End )?Google Tag Manager -->/i

Page Statistics

100
Requests

98 %
HTTPS

67 %
IPv6

14
Domains

15
Subdomains

15
IPs

5
Countries

2565 kB
Transfer

4401 kB
Size

8
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://www.ecreativeworks.com/ HTTP 301
    https://www.ecreativeworks.com/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 4
  • https://www.google-analytics.com/r/collect?v=1&_v=j81&a=1206852451&t=pageview&_s=1&dl=https%3A%2F%2Fwww.ecreativeworks.com%2F&ul=en-us&de=UTF-8&dt=Industrial%20Website%20Development%20%26%20Digital%20Marketing%20Services&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&_u=YEBAAEAB~&jid=568638772&gjid=742775188&cid=38553523.1588894283&tid=UA-20900321-2&_gid=2007189148.1588894283&_r=1&gtm=2wg4t0TVBMRCG&z=99026856 HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-20900321-2&cid=38553523.1588894283&jid=568638772&_gid=2007189148.1588894283&gjid=742775188&_v=j81&z=99026856
Request Chain 5
  • https://px.ads.linkedin.com/collect?v=2&fmt=js&pid=1987052&url=https%3A%2F%2Fwww.ecreativeworks.com%2F&time=1588894282707 HTTP 302
  • https://www.linkedin.com/px/li_sync?redirect=https%3A%2F%2Fpx.ads.linkedin.com%2Fcollect%3Fv%3D2%26fmt%3Djs%26pid%3D1987052%26url%3Dhttps%253A%252F%252Fwww.ecreativeworks.com%252F%26time%3D1588894282707%26liSync%3Dtrue HTTP 302
  • https://px.ads.linkedin.com/collect?v=2&fmt=js&pid=1987052&url=https%3A%2F%2Fwww.ecreativeworks.com%2F&time=1588894282707&liSync=true
Request Chain 97
  • https://www.google-analytics.com/r/collect?v=1&_v=j81&a=1206852451&t=event&ni=1&_s=1&dl=https%3A%2F%2Fwww.ecreativeworks.com%2F&ul=en-us&de=UTF-8&dt=Industrial%20Website%20Development%20%26%20Digital%20Marketing%20Services&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Scroll%20Tracking&ea=25&el=%2F&_u=aEBAAEAB~&jid=924454338&gjid=282581561&cid=1667767785.1588894285&tid=UA-20900321-2&_gid=891407496.1588894285&_r=1&gtm=2wg4t0TVBMRCG&z=448121348 HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-20900321-2&cid=1667767785.1588894285&jid=924454338&_gid=891407496.1588894285&gjid=282581561&_v=j81&z=448121348

100 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.ecreativeworks.com/
Redirect Chain
  • http://www.ecreativeworks.com/
  • https://www.ecreativeworks.com/
1 MB
313 KB
Document
General
Full URL
https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
9cc3ca263fc9fcacaccba927c3ddf8a04d665d15c896fd1794530198d84d0ca3

Request headers

:method
GET
:authority
www.ecreativeworks.com
: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/74.0.3729.169 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,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/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Thu, 07 May 2020 23:31:22 GMT
server
Apache
expires
Thu, 19 Nov 1981 08:52:00 GMT
cache-control
no-store, no-cache, must-revalidate
pragma
no-cache
set-cookie
ecreativesid=7q329371f7h79kna0fosooc7eh; path=/; domain=www.ecreativeworks.com REFERER_DOMAIN=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/ ecw_vtrk=medium%3D%28none%29%26keyword%3D; expires=Sat, 07-May-2022 23:31:22 GMT; Max-Age=63072000; path=/
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html; charset=UTF-8

Redirect headers

Date
Thu, 07 May 2020 23:31:22 GMT
Server
Apache
Upgrade
h2,h2c
Connection
Upgrade, Keep-Alive
Location
https://www.ecreativeworks.com/
Cache-Control
max-age=2592000
Expires
Sat, 06 Jun 2020 23:31:22 GMT
Content-Length
0
Keep-Alive
timeout=5, max=100
Content-Type
text/html; charset=UTF-8
gtm.js
www.googletagmanager.com/
75 KB
26 KB
Script
General
Full URL
https://www.googletagmanager.com/gtm.js?id=GTM-TVBMRCG
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
53e89c047f52fd0eca6fad064498e5d599d0e75a59a1a98f670c167f2d24e059
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains
X-Xss-Protection 0

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:22 GMT
content-encoding
br
vary
Accept-Encoding
status
200
alt-svc
h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
27024
x-xss-protection
0
last-modified
Thu, 07 May 2020 21:00:00 GMT
server
Google Tag Manager
strict-transport-security
max-age=31536000; includeSubDomains
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
private, max-age=900
access-control-allow-credentials
true
access-control-allow-headers
Cache-Control
expires
Thu, 07 May 2020 23:31:22 GMT
ss.js
koi-3q3g4nfwrm.marketingautomation.services/client/
12 KB
5 KB
Script
General
Full URL
https://koi-3q3g4nfwrm.marketingautomation.services/client/ss.js?ver=1.1.1
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
130.211.21.179 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
179.21.211.130.bc.googleusercontent.com
Software
openresty /
Resource Hash
80f1f18e199fb25e0eae6ca63cd7d090492ba7fe835e476a5a2eb1a9f14ff755

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:22 GMT
content-encoding
gzip
last-modified
Thu, 07 May 2020 13:09:24 GMT
server
openresty
etag
W/"5eb40884-2e12"
vary
Accept-Encoding
content-type
application/javascript
status
200
cache-control
max-age=604800, public
alt-svc
clear
via
1.1 google
expires
Thu, 14 May 2020 23:31:22 GMT
analytics.js
www.google-analytics.com/
44 KB
18 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-TVBMRCG
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

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

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 06 Feb 2020 00:21:02 GMT
server
Golfe2
age
3167
date
Thu, 07 May 2020 22:38:35 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
alt-svc
h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
18174
expires
Fri, 08 May 2020 00:38:35 GMT
insight.min.js
snap.licdn.com/li.lms-analytics/
3 KB
2 KB
Script
General
Full URL
https://snap.licdn.com/li.lms-analytics/insight.min.js
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-TVBMRCG
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:6c00:296::25ea , Ascension Island, ASN20940 (AKAMAI-ASN1, EU),
Reverse DNS
Software
/
Resource Hash
41dd5e421fe221a7d2921d6fa2b36e8b01a9f2c054aaef5fad866fe896c1d1e0

Request headers

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

Response headers

Date
Thu, 07 May 2020 23:31:22 GMT
Content-Encoding
gzip
Last-Modified
Mon, 07 Oct 2019 16:41:31 GMT
X-CDN
AKAM
Vary
Accept-Encoding
Content-Type
application/x-javascript;charset=utf-8
Cache-Control
max-age=63753
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1576
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://www.google-analytics.com/r/collect?v=1&_v=j81&a=1206852451&t=pageview&_s=1&dl=https%3A%2F%2Fwww.ecreativeworks.com%2F&ul=en-us&de=UTF-8&dt=Industrial%20Website%20Development%20%26%20Digital...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-20900321-2&cid=38553523.1588894283&jid=568638772&_gid=2007189148.1588894283&gjid=742775188&_v=j81&z=99026856
35 B
102 B
Image
General
Full URL
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-20900321-2&cid=38553523.1588894283&jid=568638772&_gid=2007189148.1588894283&gjid=742775188&_v=j81&z=99026856
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c08::9b Brussels, Belgium, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

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

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
Thu, 07 May 2020 23:31:22 GMT
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Thu, 07 May 2020 23:31:22 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
302
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-20900321-2&cid=38553523.1588894283&jid=568638772&_gid=2007189148.1588894283&gjid=742775188&_v=j81&z=99026856
content-type
text/html; charset=UTF-8
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
414
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
px.ads.linkedin.com/
Redirect Chain
  • https://px.ads.linkedin.com/collect?v=2&fmt=js&pid=1987052&url=https%3A%2F%2Fwww.ecreativeworks.com%2F&time=1588894282707
  • https://www.linkedin.com/px/li_sync?redirect=https%3A%2F%2Fpx.ads.linkedin.com%2Fcollect%3Fv%3D2%26fmt%3Djs%26pid%3D1987052%26url%3Dhttps%253A%252F%252Fwww.ecreativeworks.com%252F%26time%3D15888942...
  • https://px.ads.linkedin.com/collect?v=2&fmt=js&pid=1987052&url=https%3A%2F%2Fwww.ecreativeworks.com%2F&time=1588894282707&liSync=true
0
80 B
Image
General
Full URL
https://px.ads.linkedin.com/collect?v=2&fmt=js&pid=1987052&url=https%3A%2F%2Fwww.ecreativeworks.com%2F&time=1588894282707&liSync=true
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a05:f500:11:101::b93f:9005 , Ireland, ASN14413 (LINKEDIN, US),
Reverse DNS
Software
Play /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
server
Play
linkedin-action
1
x-li-fabric
prod-lor1
status
200
x-li-proto
http/2
x-li-pop
prod-tln1
content-type
application/javascript
content-length
0
x-li-uuid
HQsxqu7iDBbwgLTdGisAAA==

Redirect headers

date
Thu, 07 May 2020 23:31:23 GMT
x-content-type-options
nosniff
linkedin-action
1
status
302
x-li-pop
prod-tln1
content-length
0
x-li-uuid
erIum+7iDBaA+6I8kSsAAA==
pragma
no-cache
server
Play
cache-control
no-cache, no-store
x-frame-options
sameorigin
expect-ct
max-age=86400, report-uri="https://www.linkedin.com/platform-telemetry/ct"
strict-transport-security
max-age=2592000
x-li-fabric
prod-lor1
location
https://px.ads.linkedin.com/collect?v=2&fmt=js&pid=1987052&url=https%3A%2F%2Fwww.ecreativeworks.com%2F&time=1588894282707&liSync=true
x-xss-protection
1; mode=block
x-li-proto
http/2
content-security-policy
default-src *; connect-src 'self' https://media-src.linkedin.com/media/ www.linkedin.com s.c.lnkd.licdn.com m.c.lnkd.licdn.com s.c.exp1.licdn.com s.c.exp2.licdn.com m.c.exp1.licdn.com m.c.exp2.licdn.com wss://*.linkedin.com dms.licdn.com https://dpm.demdex.net/id https://lnkd.demdex.net/event blob: static.licdn.com static-exp1.licdn.com static-exp2.licdn.com static-exp3.licdn.com media.licdn.com media-exp1.licdn.com media-exp2.licdn.com media-exp3.licdn.com; img-src data: blob: *; font-src data: *; style-src 'unsafe-inline' 'self' static-src.linkedin.com *.licdn.com; script-src 'report-sample' 'unsafe-inline' 'unsafe-eval' 'self' spdy.linkedin.com static-src.linkedin.com *.ads.linkedin.com *.licdn.com static.chartbeat.com www.google-analytics.com ssl.google-analytics.com bcvipva02.rightnowtech.com www.bizographics.com sjs.bizographics.com js.bizographics.com d.la4-c1-was.salesforceliveagent.com slideshare.www.linkedin.com https://snap.licdn.com/li.lms-analytics/insight.min.js platform.linkedin.com platform-akam.linkedin.com platform-ecst.linkedin.com platform-azur.linkedin.com; object-src 'none'; media-src blob: *; child-src blob: lnkd-communities: voyager: *; frame-ancestors 'self'
expires
Thu, 01 Jan 1970 00:00:00 GMT
koi
koi-3q3g4nfwrm.marketingautomation.services/
126 B
596 B
Script
General
Full URL
https://koi-3q3g4nfwrm.marketingautomation.services/koi?rf=&hn=www.ecreativeworks.com&lg=en-US&sr=1600x1200&cd=24&vr=2.4.0&se=1588894282816&tk=null&ac=KOI-1H3OR2GF6&ts=1588894283&pt=0&pl=0&loc=https%3A%2F%2Fwww.ecreativeworks.com%2F&tp=page&ti=Industrial%20Website%20Development%20%26%20Digital%20Marketing%20Services
Requested by
Host: koi-3q3g4nfwrm.marketingautomation.services
URL: https://koi-3q3g4nfwrm.marketingautomation.services/client/ss.js?ver=1.1.1
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
130.211.21.179 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
179.21.211.130.bc.googleusercontent.com
Software
openresty /
Resource Hash
318babccb01c2a5eebfa9de29e487356f57c5b35557d090327c3bba6de4bcd5a
Security Headers
Name Value
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
content-encoding
gzip
p3p
CP='This is not a P3P policy! See http://sharpspring.com/privacy for more info.'
status
200
pod-hostname
koi-7f4c66b88d-4gldm
alt-svc
clear
x-xss-protection
1; mode=block
pragma
no-cache
x-clacks-overhead
GNU Terry Pratchett
last-modified
Thu, 07 May 2020 23:31:22 GMT
server
openresty
vary
Accept-Encoding
content-type
application/javascript
via
1.1 google
cache-control
no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0
expires
Sat, 26 Jul 1997 05:00:00 GMT
327a8c324526757cfe6fca7897df20ef.thumb.png
www.ecreativeworks.com/includes/work/image_cache/png/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/png/327a8c324526757cfe6fca7897df20ef.thumb.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
c04ca1ced1436aa83d224d32d327465fd12f78ef846e78ce10bfb81547e129a4

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 18 Sep 2019 18:25:32 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
4197
expires
Sat, 1 Jan 2270 00:00:00 GMT
web-design-process.png
www.ecreativeworks.com/images/menu_icons/
6 KB
6 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/web-design-process.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
7b07d2dd503c0a45a5c845583aa4c8c60d0518cbda034d78381ddf66f37509ee

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Mon, 08 Jul 2019 14:09:50 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
6238
expires
Sat, 1 Jan 2270 00:00:00 GMT
ecommerce.png
www.ecreativeworks.com/images/menu_icons/
3 KB
3 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/ecommerce.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
1090ff45b6becb6c9bba38b60e28490f1179ede3e15c8e4846e5cc1f0f9abb01

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:47:41 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
3336
expires
Sat, 1 Jan 2270 00:00:00 GMT
rfq-cart.png
www.ecreativeworks.com/images/menu_icons/
3 KB
3 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/rfq-cart.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
fc48ffc5fb3c0d64e0137a32f3f14e3f2c5cda4dad45918ea69b01ed91040ec7

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:47:01 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
3352
expires
Sat, 1 Jan 2270 00:00:00 GMT
base-features.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/base-features.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
371b10b23f14610e0ef2f044409f4df8d1b25db7b16554df68d855035e558f33

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:34:07 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
4165
expires
Sat, 1 Jan 2270 00:00:00 GMT
cms.png
www.ecreativeworks.com/images/menu_icons/
3 KB
3 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/cms.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
ae8dbbf0cb37d107246836d58c2631d5b8bb9a83edcb6ca26eabc8fcf70338d8

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Mon, 09 Dec 2019 15:19:47 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
3123
expires
Sat, 1 Jan 2270 00:00:00 GMT
turnkey.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/turnkey.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
5fe92ebf69a0c3dc25ed351fef072cf1ad0d2d9626a76404388192e80aa1be1f

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Mon, 09 Dec 2019 15:20:52 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
4141
expires
Sat, 1 Jan 2270 00:00:00 GMT
mobile.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/mobile.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
e2949ddde471e83bd3653e22184e8a796f94cdc4b5df92a01daa07df343a6333

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Mon, 09 Dec 2019 15:20:02 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
3739
expires
Sat, 1 Jan 2270 00:00:00 GMT
seo.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/seo.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
6fdd2332ca88e2faaa5531fd1efd4eac8853874b6737722b48db0e13131ca2a5

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Mon, 09 Dec 2019 15:20:12 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
4297
expires
Sat, 1 Jan 2270 00:00:00 GMT
paid-search.png
www.ecreativeworks.com/images/menu_icons/
4 KB
5 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/paid-search.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
7d59a2f9aa73b9422ac5ee230b5fbd842b44d0c01d7fcb08db90666d561b2a09

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:44:58 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
4575
expires
Sat, 1 Jan 2270 00:00:00 GMT
copywriting.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/copywriting.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
b656a39b06929bf2677a3f977a177802483c409f6e251d89a01759944ec9cd10

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:45:53 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
4504
expires
Sat, 1 Jan 2270 00:00:00 GMT
user-experience.png
www.ecreativeworks.com/images/menu_icons/
5 KB
5 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/user-experience.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
75d794cc3c600b261fbe69d246fe70095ae42ec5baa058b54c9a212cad7e8f4b

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:44:46 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
5311
expires
Sat, 1 Jan 2270 00:00:00 GMT
analytics-services.png
www.ecreativeworks.com/images/menu_icons/
5 KB
5 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/analytics-services.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
d8b7fb75bb30bf2c228d9786d99fc3fb14471aca4529fc1c205f5e464d1f5086

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:45:11 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
4679
expires
Sat, 1 Jan 2270 00:00:00 GMT
consulting-services.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/consulting-services.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
f40ef454b97664010baf3237b8839fac360733cfeb955301fed2a141d2dd90a8

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:47:29 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
4295
expires
Sat, 1 Jan 2270 00:00:00 GMT
social.png
www.ecreativeworks.com/images/menu_icons/
6 KB
6 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/social.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
7ae2262558d82df8584cfb59dce27500ede202480bca653e0e4c719c7acfa24e

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:33:24 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
6240
expires
Sat, 1 Jan 2270 00:00:00 GMT
standard-products.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/standard-products.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
31802e55f4df3d79ef1420db9ae3099a240eb9bfba7b9228efcb43e40be4068a

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:46:07 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
3619
expires
Sat, 1 Jan 2270 00:00:00 GMT
custom-products.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/custom-products.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
62e8b597c89925ebedba3ba1a94b473cd5567f659b4d84251e2bcfeffb0768d9

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:35:24 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
3673
expires
Sat, 1 Jan 2270 00:00:00 GMT
config.png
www.ecreativeworks.com/images/menu_icons/
8 KB
8 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/config.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
7658be1a132f9b08d801dd1673981fa6ea0599c4721524e25244fb6009cb69bc

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:30:37 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
7733
expires
Sat, 1 Jan 2270 00:00:00 GMT
design-products.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/design-products.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
e7cd20153a4f0498ba4b708f622e9274b54b3b7042eeb770e9ea69ad0be0aa89

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:45:39 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
3770
expires
Sat, 1 Jan 2270 00:00:00 GMT
digital-marketing.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/digital-marketing.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
27fa747fc887357ebb7eed88e9fc71fc92bfd897ae340a930f0b24e35efaae03

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:46:48 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
4465
expires
Sat, 1 Jan 2270 00:00:00 GMT
oem.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/oem.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
5804dc77e75f1256342cb0b663cbdd01dcac3b625b370120373db2d167c5a5ab

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Mon, 09 Dec 2019 15:20:32 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
4400
expires
Sat, 1 Jan 2270 00:00:00 GMT
custom-contract-manufacturer.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/custom-contract-manufacturer.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
bd0237ffcaabcf21233577376aea37b6229e67f7a1627b8b8738d5a37b0bf5a8

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:45:25 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
4448
expires
Sat, 1 Jan 2270 00:00:00 GMT
distributors.png
www.ecreativeworks.com/images/menu_icons/
5 KB
5 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/distributors.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
75ef0b2d1635509eca8209eb48a32e1d97806a049b469cea711156ddaa3af4fb

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:44:33 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
5442
expires
Sat, 1 Jan 2270 00:00:00 GMT
fasteners.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/fasteners.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
8c5a67eac3d977dcdccde320917e3a9f668de7d99224914a84af13cb94ca9b57

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:43:45 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
3787
expires
Sat, 1 Jan 2270 00:00:00 GMT
b2c.png
www.ecreativeworks.com/images/menu_icons/
6 KB
6 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/b2c.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
ad9dc6e8d18248de5769e12ea8a472680f34b0f3eb251d32bdaa7da45e9cc635

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:33:11 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
6267
expires
Sat, 1 Jan 2270 00:00:00 GMT
portfolio.png
www.ecreativeworks.com/images/menu_icons/
3 KB
3 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/portfolio.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
77b4e68bf4dc87f0467a3d4a79bafeeb19bfb3024e12f1c8a64513659f9db7b8

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:46:35 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
3379
expires
Sat, 1 Jan 2270 00:00:00 GMT
our-team.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/our-team.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
8180e17668d32cec8b6c253a475cb7558c00e19ef9978d3cf5c3bfc4d2b110cd

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:32:49 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
4447
expires
Sat, 1 Jan 2270 00:00:00 GMT
partnerships.png
www.ecreativeworks.com/images/menu_icons/
5 KB
5 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/partnerships.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
94e2c78cc48c176bc7ca009256eba3a076b0002c96e04f4fad4313db9c2bfde7

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:44:15 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
5134
expires
Sat, 1 Jan 2270 00:00:00 GMT
employment.png
www.ecreativeworks.com/images/menu_icons/
4 KB
4 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/employment.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
79c8384e3b86b9ea99d87d72c37e76eafc4e6140e8ad275e04c46012241f01e5

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:47:15 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
4112
expires
Sat, 1 Jan 2270 00:00:00 GMT
newsletters.png
www.ecreativeworks.com/images/menu_icons/
4 KB
5 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/newsletters.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
ae30c0806fd7bf4719dd5a1f55b9f5e9c875f2187770970d42ea26693b0daf77

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Mon, 09 Dec 2019 15:20:22 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
4559
expires
Sat, 1 Jan 2270 00:00:00 GMT
service.png
www.ecreativeworks.com/images/menu_icons/
5 KB
5 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/menu_icons/service.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
00b98a610223c6c8bd4999f2bf0fbf955c80402e5653470a626854afa0fead4d

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:46:21 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
4956
expires
Sat, 1 Jan 2270 00:00:00 GMT
truncated
/
261 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
030a504f6af242025b83d7d4529ed81b65bb28f57c7ed0e0c678bdd2ff255c85

Request headers

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

Response headers

Content-Type
text/javascript
spritelg.png
www.ecreativeworks.com/images/site/
6 KB
6 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/site/spritelg.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
26083d50e6708d4eb990d1ea835efaffaf3cee261fbf456149e6d88183ae9b47

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Fri, 13 Dec 2019 15:29:18 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
6285
expires
Sat, 1 Jan 2270 00:00:00 GMT
6a0237e98d41da4a7b77ea50aceb21b5.thumb.png
www.ecreativeworks.com/includes/work/image_cache/png/
727 KB
731 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/png/6a0237e98d41da4a7b77ea50aceb21b5.thumb.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
6dfbb3a5977d5ee77885bf535c809055e6a8601ce8f1e96895a675726a29e0cc

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 18 Sep 2019 19:22:44 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
744387
expires
Sat, 1 Jan 2270 00:00:00 GMT
google-partner.png
www.ecreativeworks.com/images/site/
6 KB
6 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/site/google-partner.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
8adefcf5ddde7c959d91ba5cd7940e19aad6b5fafaca8cb5e77d157ff93f15bc

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Thu, 24 Oct 2019 16:12:18 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
5665
expires
Sat, 1 Jan 2270 00:00:00 GMT
adwords-certified.png
www.ecreativeworks.com/images/site/
7 KB
7 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/site/adwords-certified.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
5c640d204f4479aed5e52ac6cfae68b884246b06254cd667fc114abc9f4ac9c5

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Thu, 24 Oct 2019 16:12:18 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
7369
expires
Sat, 1 Jan 2270 00:00:00 GMT
analytics-qualified.png
www.ecreativeworks.com/images/site/
6 KB
6 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/site/analytics-qualified.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
8a78db525aefef993f014828cac3ebfc02fa7e3d6dace3b3681f4de392f6d657

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Thu, 24 Oct 2019 16:12:18 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
6431
expires
Sat, 1 Jan 2270 00:00:00 GMT
bbb.png
www.ecreativeworks.com/images/site/
9 KB
9 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/site/bbb.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
8f13f24eae9473fab6b7697e2940c8ccd4ae6825988fbef504f051210650553f

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Thu, 24 Oct 2019 16:12:18 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
8980
expires
Sat, 1 Jan 2270 00:00:00 GMT
fde5fbb93469961e9f0fae7ffb34d913.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
7 KB
7 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/fde5fbb93469961e9f0fae7ffb34d913.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
a0d8555dedb7c0a98b7f8d878fc97eb21fe47bb0675077b8f39e29c716e20ba1

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:40 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
7405
expires
Sat, 1 Jan 2270 00:00:00 GMT
6e92b0ff0845852c15d46d78ba3965c8.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
8 KB
8 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/6e92b0ff0845852c15d46d78ba3965c8.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
cf3966b5901d6a3090495028e940ab2dc2d43ebbcb2b8155fc46be1e27620674

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:40 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
8307
expires
Sat, 1 Jan 2270 00:00:00 GMT
f7516e62379d20099d72c9e27840e7f2.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
9 KB
9 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/f7516e62379d20099d72c9e27840e7f2.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
4c918e69b9ebde59259f77706135564aca9743ae030d4cde4ac7441f09b56a55

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:40 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
9371
expires
Sat, 1 Jan 2270 00:00:00 GMT
226270824e0f978d230e795bc7bf6d42.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
10 KB
10 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/226270824e0f978d230e795bc7bf6d42.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
0f98f6cbfe4db40cefe20f56786aaf7b081c9f932f89d0ae151819ad99522a40

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:40 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
10069
expires
Sat, 1 Jan 2270 00:00:00 GMT
fbd8d8efd77fe42fccf6396cfed7fc9f.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
9 KB
9 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/fbd8d8efd77fe42fccf6396cfed7fc9f.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
3301b7e73c1d28f4d0d674a7b8b1b5301054c4681412e72ad04db5378fae1c4b

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:40 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
9208
expires
Sat, 1 Jan 2270 00:00:00 GMT
5af7ea631cd275ac68cf58d96560ccd0.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
12 KB
12 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/5af7ea631cd275ac68cf58d96560ccd0.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
6f898d04d9e4516c95aeaea50806b22d14c1db61e33c459cd1d86e777ef78a2c

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:40 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
11908
expires
Sat, 1 Jan 2270 00:00:00 GMT
fd11f9f513298145b414f6c8749a0b72.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
11 KB
11 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/fd11f9f513298145b414f6c8749a0b72.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
ff759fa7898573742f87010d78054f31ab1fb1f678e9a6134c7de4cea28ea6eb

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:41 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
10945
expires
Sat, 1 Jan 2270 00:00:00 GMT
8281abdc5c632caee4c8a5342a8af961.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
11 KB
11 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/8281abdc5c632caee4c8a5342a8af961.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
f8edc759de929c9234f027a7f92755cdb807150604aa32f85466f76f60945fcc

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:41 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
11720
expires
Sat, 1 Jan 2270 00:00:00 GMT
0b0f8ee88ff0851c6fbefe1585576263.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
12 KB
12 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/0b0f8ee88ff0851c6fbefe1585576263.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
1c5da31374e600dcd21e71e2e4516bdebcc503939696b7ec7bb938c07eaf44e3

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:41 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
11871
expires
Sat, 1 Jan 2270 00:00:00 GMT
db96a19f84897cd72535941e3b21c255.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
10 KB
10 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/db96a19f84897cd72535941e3b21c255.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
25cde4db7efe2cd1075740dcf1124af203222f46004983aa19e5fa3a015b2ad3

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:41 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
10662
expires
Sat, 1 Jan 2270 00:00:00 GMT
99f8dee186870f46d42e4776ae6d8116.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
9 KB
9 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/99f8dee186870f46d42e4776ae6d8116.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
45b141a1c45b34684bc774f75fe8dcb21aa3d16318b0656589fae7b67bfa1b9d

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:41 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
8705
expires
Sat, 1 Jan 2270 00:00:00 GMT
8a933cb76c64112be51aebbc8418ef8a.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
8 KB
8 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/8a933cb76c64112be51aebbc8418ef8a.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
2f9bda49eeb48e49c5c35766ed5fa3451f0e702263bc4f8d461eb15217330930

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:42 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
8470
expires
Sat, 1 Jan 2270 00:00:00 GMT
1738ae59151b17539c8e4575bd6d70b2.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
8 KB
8 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/1738ae59151b17539c8e4575bd6d70b2.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
14030d4f41b7a841cec79a6e3c8964b022e170d0a8f5f575a0242f27768a9a54

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:42 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
8446
expires
Sat, 1 Jan 2270 00:00:00 GMT
c7e1f50c8b5e41f26a597a0c4c85ca62.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
8 KB
8 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/c7e1f50c8b5e41f26a597a0c4c85ca62.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
5e36b29f89695999bed52411619edfbfba42def33ca81ad923e164929b08f47a

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:42 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
8423
expires
Sat, 1 Jan 2270 00:00:00 GMT
341fc04a8590d230aaab1b4a0dc2764d.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
10 KB
10 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/341fc04a8590d230aaab1b4a0dc2764d.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
aa9312e541dd4cc5544a647cb45ed3156983f886171ca8b5e87cf4d7abae7eb9

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:42 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
9780
expires
Sat, 1 Jan 2270 00:00:00 GMT
6caa55420d5529dd362c8b70481a8ff9.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
11 KB
11 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/6caa55420d5529dd362c8b70481a8ff9.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
9429a652e87bd60be9d098d8e0eb918967da03d3e80b82ca12c79cfde202aef0

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:43 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
11714
expires
Sat, 1 Jan 2270 00:00:00 GMT
af32a24ff01c4bce22094828cd7aa701.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
9 KB
9 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/af32a24ff01c4bce22094828cd7aa701.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
c0061950f346f58694af1252d09cd10d94feacf507f4bf190e0c48c2c1146cad

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:43 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
9118
expires
Sat, 1 Jan 2270 00:00:00 GMT
d0752abacb9ff8c395425775c312c10b.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
12 KB
12 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/d0752abacb9ff8c395425775c312c10b.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
e5e04552d8c5ad293c0718d48b927dd58995459abc92d45294c4040d2b6af63c

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:43 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
11996
expires
Sat, 1 Jan 2270 00:00:00 GMT
74734e466c49a74b9462f52669a61dce.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
11 KB
11 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/74734e466c49a74b9462f52669a61dce.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
29cdb278cf4344fd438e1da49b4f63178f5956b47c2a4b0be48d8ef32bafaf4a

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:43 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
11137
expires
Sat, 1 Jan 2270 00:00:00 GMT
432674076e04111c7d8b3f9f51374831.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
9 KB
9 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/432674076e04111c7d8b3f9f51374831.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
648d4df909cfa33329e74f8c7998a53c6ccf24dda8e9227cf97f3fd20d352367

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:44 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
9652
expires
Sat, 1 Jan 2270 00:00:00 GMT
52719259508021b7312bef57d146f261.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
9 KB
9 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/52719259508021b7312bef57d146f261.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
3ada23c286df06e50efd4dca6e891def40ac276b448ab0cdfb0e598e40891941

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:44 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
9041
expires
Sat, 1 Jan 2270 00:00:00 GMT
92592e74b0414e23862ebdb12966670b.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
9 KB
9 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/92592e74b0414e23862ebdb12966670b.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
2d5cc6472080ff74d56ba0b097db640a80a5ec9db5db8f88483e907dd2de43ad

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:44 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
9011
expires
Sat, 1 Jan 2270 00:00:00 GMT
75de34dfbab46973d48a5a5df9e2785b.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
10 KB
10 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/75de34dfbab46973d48a5a5df9e2785b.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
3fabc7bfc1e38f6ce4eef18236a9248540991742e1826b8dfa87dabdebdd7fb0

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:44 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
9815
expires
Sat, 1 Jan 2270 00:00:00 GMT
da9f9d9f079808862a75dd080924fc89.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
11 KB
11 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/da9f9d9f079808862a75dd080924fc89.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
27db729de5779173be0b867986ea683bf2e775febf232133c8a6cf73d6b4eb41

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:44 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
11275
expires
Sat, 1 Jan 2270 00:00:00 GMT
eeee8468c048808fac13ea6a13fb54cc.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
8 KB
8 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/eeee8468c048808fac13ea6a13fb54cc.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
ffe05ec2ca4c2ced4c935db89dd5b255922cb5af0a0eebd56fa1b40ec35b8f0e

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:44 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
8227
expires
Sat, 1 Jan 2270 00:00:00 GMT
1d02d027919b7cfa25c55e743928416c.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
8 KB
8 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/1d02d027919b7cfa25c55e743928416c.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
102ab6fc2905309e46856f1de126e7d04cd65e47e0598fdea09ab65d05b4511d

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:45 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
8493
expires
Sat, 1 Jan 2270 00:00:00 GMT
dfc203ca9e3aed23fa8f4d23845d33a1.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
11 KB
11 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/dfc203ca9e3aed23fa8f4d23845d33a1.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
dc4fd4f42225faf069ded1c10c56974109d3433f5dfb816c56df2f43050dab7a

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:45 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
10799
expires
Sat, 1 Jan 2270 00:00:00 GMT
636fceae587a543b4edbb14bf51ec626.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
9 KB
9 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/636fceae587a543b4edbb14bf51ec626.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
8f359bc7c2d05637f97b500ce90841e277ae98f04ebdd1955a24035255cd8567

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:45 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
9654
expires
Sat, 1 Jan 2270 00:00:00 GMT
c4813cd1129cbb4f3669ba5a05ce5892.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
8 KB
8 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/c4813cd1129cbb4f3669ba5a05ce5892.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
cda5d73b2545c303a5ad596345c5124bf743f07e7484f5d4c852b54cb7e74fe5

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:45 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
8105
expires
Sat, 1 Jan 2270 00:00:00 GMT
03444c94bc2d569b0b3e4b780d4db5bd.thumb.jpg
www.ecreativeworks.com/includes/work/image_cache/jpg/
11 KB
11 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/jpg/03444c94bc2d569b0b3e4b780d4db5bd.thumb.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
4e485ca0517ad6447256d97ba190f99ac89a72ae0ea3f2be5e2e4bf746bf7b2e

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 23 Oct 2019 17:25:45 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
10978
expires
Sat, 1 Jan 2270 00:00:00 GMT
42d8020071784489c53ff19d3a6a8ec0.thumb.png
www.ecreativeworks.com/includes/work/image_cache/png/
90 KB
90 KB
Image
General
Full URL
https://www.ecreativeworks.com/includes/work/image_cache/png/42d8020071784489c53ff19d3a6a8ec0.thumb.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
f5e4bda8c0d819c31b13e9dd4305a1ca1759c79cf78ca9039f7bff1de3c3b02e

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 18 Sep 2019 18:25:32 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, public, must-revalidate
accept-ranges
bytes
content-length
91654
expires
Sat, 1 Jan 2270 00:00:00 GMT
featured.png
app.upcity.com/images/badges/
14 KB
14 KB
Image
General
Full URL
https://app.upcity.com/images/badges/featured.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.201.62.231 Ashburn, United States, ASN14618 (AMAZON-AES, US),
Reverse DNS
ec2-52-201-62-231.compute-1.amazonaws.com
Software
nginx/1.16.1 /
Resource Hash
3a2936103fb579714922878f9219badd0af8bb8b5bba1183f31300245150a4b2

Request headers

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

Response headers

Date
Thu, 07 May 2020 23:31:23 GMT
Last-Modified
Wed, 06 May 2020 23:21:31 GMT
Server
nginx/1.16.1
ETag
"5eb3467b-3672"
Content-Type
image/png
Cache-Control
max-age=315360000
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
13938
Expires
Thu, 31 Dec 2037 23:55:55 GMT
css
fonts.googleapis.com/
6 KB
735 B
Stylesheet
General
Full URL
https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700&display=swap
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
ESF /
Resource Hash
1f19b04d453c734bff0822a3f3f1b3c0425326c23c5fa63f5dab297932819527
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

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

Response headers

strict-transport-security
max-age=31536000
content-encoding
gzip
x-content-type-options
nosniff
status
200
alt-svc
h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
x-xss-protection
0
last-modified
Thu, 07 May 2020 23:31:23 GMT
server
ESF
date
Thu, 07 May 2020 23:31:23 GMT
x-frame-options
SAMEORIGIN
content-type
text/css; charset=utf-8
access-control-allow-origin
*
cache-control
private, max-age=86400, stale-while-revalidate=604800
timing-allow-origin
*
link
<https://fonts.gstatic.com>; rel=preconnect; crossorigin
expires
Thu, 07 May 2020 23:31:23 GMT
pxiEyp8kv8JHgFVrJJfecnFHGPc.woff2
fonts.gstatic.com/s/poppins/v9/
8 KB
8 KB
Font
General
Full URL
https://fonts.gstatic.com/s/poppins/v9/pxiEyp8kv8JHgFVrJJfecnFHGPc.woff2
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:825::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
fab32ccef85408b763c899ad7c0b910c96c76dc9ed7158ce304fdcd3c0bf8388
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700&display=swap
Origin
https://www.ecreativeworks.com

Response headers

date
Tue, 05 May 2020 23:12:54 GMT
x-content-type-options
nosniff
last-modified
Tue, 08 Oct 2019 21:22:04 GMT
server
sffe
age
173909
status
200
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
7968
x-xss-protection
0
expires
Wed, 05 May 2021 23:12:54 GMT
pxiByp8kv8JHgFVrLEj6Z1xlFd2JQEk.woff2
fonts.gstatic.com/s/poppins/v9/
8 KB
8 KB
Font
General
Full URL
https://fonts.gstatic.com/s/poppins/v9/pxiByp8kv8JHgFVrLEj6Z1xlFd2JQEk.woff2
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:825::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
07d2b7c2df967b7820b8ce99be3f7db1a1db5a82797826cd9a06e6489e89f71a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700&display=swap
Origin
https://www.ecreativeworks.com

Response headers

date
Thu, 23 Apr 2020 17:38:55 GMT
x-content-type-options
nosniff
last-modified
Tue, 08 Oct 2019 21:22:13 GMT
server
sffe
age
1230748
status
200
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
7836
x-xss-protection
0
expires
Fri, 23 Apr 2021 17:38:55 GMT
pxiByp8kv8JHgFVrLCz7Z1xlFd2JQEk.woff2
fonts.gstatic.com/s/poppins/v9/
8 KB
8 KB
Font
General
Full URL
https://fonts.gstatic.com/s/poppins/v9/pxiByp8kv8JHgFVrLCz7Z1xlFd2JQEk.woff2
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:825::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
56a522e79770e488da6015ed10f8c2bdafbcd87a7c6d443f7a293579bd0ef58d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700&display=swap
Origin
https://www.ecreativeworks.com

Response headers

date
Wed, 06 May 2020 05:20:10 GMT
x-content-type-options
nosniff
last-modified
Tue, 08 Oct 2019 21:22:29 GMT
server
sffe
age
151873
status
200
content-type
font/woff2
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
7924
x-xss-protection
0
expires
Thu, 06 May 2021 05:20:10 GMT
home-links-sprite.png
www.ecreativeworks.com/images/site/
60 KB
60 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/site/home-links-sprite.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
ccf5e45be41f49ebc05783c77b1a11d918f3d66f10d7113c9ab617ac940654be

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Thu, 24 Oct 2019 16:12:18 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
61408
expires
Sat, 1 Jan 2270 00:00:00 GMT
home-green-bg.jpg
www.ecreativeworks.com/images/site/
117 KB
117 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/site/home-green-bg.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
9d8c3917c05233409d54343c05da3fe2d973da798527c48853a09f61852a08e2

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Thu, 24 Oct 2019 16:12:18 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
120102
expires
Sat, 1 Jan 2270 00:00:00 GMT
meet-the-team-carousel-bg.png
www.ecreativeworks.com/images/site/
183 KB
183 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/site/meet-the-team-carousel-bg.png
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
1f27d96616132cf8ed47c92b3ada7a95e436fad94a6e1d9fbdefc8b971a0b886

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Wed, 18 Sep 2019 18:18:46 GMT
server
Apache
content-type
image/png
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
187221
expires
Sat, 1 Jan 2270 00:00:00 GMT
map-bg.jpg
www.ecreativeworks.com/images/site/
199 KB
199 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/site/map-bg.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
9ebe2ebd3cfa6ec47b06e567271056e03ca765fe134eba9a407e05501ae2c74a

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Thu, 24 Oct 2019 16:12:18 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
203751
expires
Sat, 1 Jan 2270 00:00:00 GMT
truncated
/
499 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
bf777a4155086d6d4adc9aca654041a288eb55e7e788f0c547682917e288f080

Request headers

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

Response headers

Content-Type
image/png
sub-footer-bg.jpg
www.ecreativeworks.com/images/site/
67 KB
67 KB
Image
General
Full URL
https://www.ecreativeworks.com/images/site/sub-footer-bg.jpg
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
52.15.252.66 Columbus, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
cart03-awsoh.ecreativeworks.com
Software
Apache /
Resource Hash
97ca49770524f0b673605e2ed55081f74de1ee492f4bb53a6640aa676f5e3ea6

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
last-modified
Thu, 24 Oct 2019 16:12:18 GMT
server
Apache
content-type
image/jpeg
status
200
cache-control
max-age=31536000, must-revalidate
accept-ranges
bytes
content-length
68106
expires
Sat, 1 Jan 2270 00:00:00 GMT
truncated
/
182 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
ab2ef76dffeae79cf8924b6e69368c855af10f35510888e098143971b3a62ed1

Request headers

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

Response headers

Content-Type
image/png
w.js
d10lpsik1i8c69.cloudfront.net/
5 KB
3 KB
Script
General
Full URL
https://d10lpsik1i8c69.cloudfront.net/w.js
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.230.182.218 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-54-230-182-218.ham50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
cd8f07b8ecb499dca7b70ebd7aef530872a3a41f401ec317a6f7f2c3b39fff1b

Request headers

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

Response headers

date
Thu, 07 May 2020 22:40:01 GMT
content-encoding
gzip
last-modified
Thu, 02 Apr 2020 19:13:24 GMT
server
AmazonS3
age
3083
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=3600
x-amz-cf-pop
HAM50-C3
x-amz-cf-id
IXcGKJrrz9S1Y6p__AgXALiPsM8qbt4sjRS9lQeB2ZchwMp8idounA==
via
1.1 d801ae07b5a25e1b54be4791dba41742.cloudfront.net (CloudFront)
fbevents.js
connect.facebook.net/en_US/
131 KB
32 KB
Script
General
Full URL
https://connect.facebook.net/en_US/fbevents.js
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:8012:face:b00c:0:3 , Ireland, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
4cb61e44bf63a9e090e666898cd04d382e4c33b55b62cc5e9ff7dab055fbf787
Security Headers
Name Value
Content-Security-Policy default-src * data: blob:;script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' *;connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* https://fb.scanandcleanlocal.com:* attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;
Strict-Transport-Security max-age=31536000; preload; includeSubDomains
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 0

Request headers

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

Response headers

strict-transport-security
max-age=31536000; preload; includeSubDomains
content-encoding
gzip
x-content-type-options
nosniff
status
200
alt-svc
h3-27=":443"; ma=3600
content-length
31766
x-xss-protection
0
pragma
public
x-fb-debug
n/4FGeqJN1Nc20O5CcP5piiZQWRn70U56kf1rLSQCmGMg1t34IwsBBCQ5eg7hVLXWvdanZXtVxdcobq1WZdfVA==
x-fb-trip-id
1814657579
x-frame-options
DENY
date
Thu, 07 May 2020 23:31:23 GMT, Thu, 07 May 2020 23:31:23 GMT
vary
Accept-Encoding
content-type
application/x-javascript; charset=utf-8
cache-control
public, max-age=1200
content-security-policy
default-src * data: blob:;script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' *;connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* https://fb.scanandcleanlocal.com:* attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;
expires
Sat, 01 Jan 2000 00:00:00 GMT
583512115707033
connect.facebook.net/signals/config/
475 KB
120 KB
Script
General
Full URL
https://connect.facebook.net/signals/config/583512115707033?v=2.9.18&r=stable
Requested by
Host: connect.facebook.net
URL: https://connect.facebook.net/en_US/fbevents.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:8012:face:b00c:0:3 , Ireland, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
f968a340bc76c476577ec1d41088f8d4f7a19a941adf66c20dfbeba9953c9cbc
Security Headers
Name Value
Content-Security-Policy default-src * data: blob:;script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' *;connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* https://fb.scanandcleanlocal.com:* attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;
Strict-Transport-Security max-age=31536000; preload; includeSubDomains
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 0

Request headers

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

Response headers

strict-transport-security
max-age=31536000; preload; includeSubDomains
content-encoding
gzip
x-content-type-options
nosniff
status
200
alt-svc
h3-27=":443"; ma=3600
x-xss-protection
0
pragma
public
x-fb-debug
BgsL3aDfmBYSSiioLHjvPGg4JaxoBG+qyb8lIUdfpMEDO9MWQQQiueUPsPQcN5DirZTvi4K09JYWK0I49A6OqA==
x-fb-trip-id
1814657579
x-frame-options
DENY
date
Thu, 07 May 2020 23:31:23 GMT, Thu, 07 May 2020 23:31:23 GMT
vary
Accept-Encoding
content-type
application/x-javascript; charset=utf-8
cache-control
public, max-age=1200
content-security-policy
default-src * data: blob:;script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' *;connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* https://fb.scanandcleanlocal.com:* attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;
expires
Sat, 01 Jan 2000 00:00:00 GMT
/
settings.luckyorange.net/
2 KB
1 KB
Fetch
General
Full URL
https://settings.luckyorange.net/?u=https%3A%2F%2Fwww.ecreativeworks.com%2F&s=173852
Requested by
Host: d10lpsik1i8c69.cloudfront.net
URL: https://d10lpsik1i8c69.cloudfront.net/w.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.26.10.16 , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
1809b0ddee97a4c3f0e0d8bbdd0746c7f8392cdd7c6ae922e8b6f96506688e73
Security Headers
Name Value
X-Frame-Options SAMEORIGIN

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
DYNAMIC
server
cloudflare
status
200
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
x-frame-options
SAMEORIGIN
access-control-allow-methods
GET, POST, OPTIONS
content-type
application/json
access-control-allow-origin
https://www.ecreativeworks.com
access-control-allow-credentials
true
cf-ray
58febbf94aa7fa30-AMS
access-control-allow-headers
Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,Keep-Alive,X-Requested-With,If-Modified-Since
cf-request-id
029313cfca0000fa3056a86200000001
/
www.facebook.com/tr/
44 B
350 B
Image
General
Full URL
https://www.facebook.com/tr/?id=583512115707033&ev=PageView&dl=https%3A%2F%2Fwww.ecreativeworks.com%2F&rl=&if=false&ts=1588894283789&sw=1600&sh=1200&v=2.9.18&r=stable&ec=0&o=30&fbp=fb.1.1588894283787.1346797360&it=1588894283626&coo=false&rqm=GET
Requested by
Host: www.ecreativeworks.com
URL: https://www.ecreativeworks.com/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:23 GMT, Thu, 07 May 2020 23:31:23 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
status
200
cache-control
no-cache, must-revalidate, max-age=0
alt-svc
h3-27=":443"; ma=3600
content-length
44
expires
Thu, 07 May 2020 23:31:23 GMT
clickstream.js
d10lpsik1i8c69.cloudfront.net/js/ Frame 0B35
286 KB
92 KB
Script
General
Full URL
https://d10lpsik1i8c69.cloudfront.net/js/clickstream.js?v=b92c44e
Requested by
Host: d10lpsik1i8c69.cloudfront.net
URL: https://d10lpsik1i8c69.cloudfront.net/w.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.230.182.218 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-54-230-182-218.ham50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
668b8d096532cab4d44d1fcddc49954f4eaa5592c4c30570bac6cbba0f16b9da

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:25 GMT
content-encoding
gzip
last-modified
Thu, 02 Apr 2020 19:13:23 GMT
server
AmazonS3
x-amz-cf-pop
HAM50-C3
status
200
vary
Accept-Encoding,Origin,Access-Control-Request-Headers,Access-Control-Request-Method
access-control-allow-methods
GET
content-type
application/javascript
access-control-allow-origin
*
access-control-max-age
3000
cache-control
max-age=31536000
x-cache
Miss from cloudfront
x-amz-cf-id
BnumU-iFcPsUHeCTQywfIIQuMzPrPhFoEh871LhUpvs6cuwEZcQAeA==
via
1.1 c46d7c5a8bf0a3035249184c40b6aea4.cloudfront.net (CloudFront)
blink_green.png
d10lpsik1i8c69.cloudfront.net/graphics/
1 KB
2 KB
Image
General
Full URL
https://d10lpsik1i8c69.cloudfront.net/graphics/blink_green.png
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.230.182.218 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-54-230-182-218.ham50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
9746bbc8be1eacd912bb90f2226b3f9141b15938f7b0281825c74999c0040c9b

Request headers

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

Response headers

date
Wed, 29 Apr 2020 16:28:32 GMT
via
1.1 d801ae07b5a25e1b54be4791dba41742.cloudfront.net (CloudFront)
last-modified
Thu, 02 Apr 2020 19:13:23 GMT
server
AmazonS3
age
716574
etag
"2e4ff7ec8bf18d247ee942621e0f9d65"
x-cache
Hit from cloudfront
content-type
image/png
status
200
cache-control
max-age=31536000
x-amz-cf-pop
HAM50-C3
accept-ranges
bytes
content-length
1283
x-amz-cf-id
zhlVthcqBwJ8yRUGeviUue76LD1cevFxmzD8botQpT6gi52DAtevMQ==
logo-light.png
d10lpsik1i8c69.cloudfront.net/graphics/
1 KB
1 KB
Image
General
Full URL
https://d10lpsik1i8c69.cloudfront.net/graphics/logo-light.png
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.230.182.218 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-54-230-182-218.ham50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
8c34bc7bc1985e63394c3c2afff88cdcfc06e501320432dd23eaff83ea6754eb

Request headers

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

Response headers

date
Wed, 29 Apr 2020 16:28:32 GMT
via
1.1 d801ae07b5a25e1b54be4791dba41742.cloudfront.net (CloudFront)
last-modified
Thu, 02 Apr 2020 19:13:24 GMT
server
AmazonS3
age
716574
etag
"35ce74c31e3ef54462a234340af702d7"
x-cache
Hit from cloudfront
content-type
image/png
status
200
cache-control
max-age=31536000
x-amz-cf-pop
HAM50-C3
accept-ranges
bytes
content-length
1143
x-amz-cf-id
a6u6ssycOyKz2BY1fURUrvWSn060bBcZGADeQKjDeASZqjeKQo7umg==
sound-on-white.png
d10lpsik1i8c69.cloudfront.net/graphics/
277 B
628 B
Image
General
Full URL
https://d10lpsik1i8c69.cloudfront.net/graphics/sound-on-white.png
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.230.182.218 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-54-230-182-218.ham50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
da0c1bc51d4ebfa2570f3e7546d9d3ccfb3f9d3c1199b1ca49869510aa79392a

Request headers

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

Response headers

date
Wed, 29 Apr 2020 16:28:32 GMT
via
1.1 d801ae07b5a25e1b54be4791dba41742.cloudfront.net (CloudFront)
last-modified
Thu, 02 Apr 2020 19:13:24 GMT
server
AmazonS3
age
716574
etag
"76f1993de0fd323f67cece8d8e63bfa2"
x-cache
Hit from cloudfront
content-type
image/png
status
200
cache-control
max-age=31536000
x-amz-cf-pop
HAM50-C3
accept-ranges
bytes
content-length
277
x-amz-cf-id
RSfNXrnItXdYXvUFemUM0Y_-mAb8QD5VgcyPbcsjPMi-vPBw94G7OA==
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://www.google-analytics.com/r/collect?v=1&_v=j81&a=1206852451&t=event&ni=1&_s=1&dl=https%3A%2F%2Fwww.ecreativeworks.com%2F&ul=en-us&de=UTF-8&dt=Industrial%20Website%20Development%20%26%20Digit...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-20900321-2&cid=1667767785.1588894285&jid=924454338&_gid=891407496.1588894285&gjid=282581561&_v=j81&z=448121348
35 B
102 B
Image
General
Full URL
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-20900321-2&cid=1667767785.1588894285&jid=924454338&_gid=891407496.1588894285&gjid=282581561&_v=j81&z=448121348
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c08::9b Brussels, Belgium, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

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

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
Thu, 07 May 2020 23:31:25 GMT
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Thu, 07 May 2020 23:31:25 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
302
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-20900321-2&cid=1667767785.1588894285&jid=924454338&_gid=891407496.1588894285&gjid=282581561&_v=j81&z=448121348
content-type
text/html; charset=UTF-8
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
416
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
www.facebook.com/tr/
44 B
249 B
Image
General
Full URL
https://www.facebook.com/tr/?id=583512115707033&ev=Microdata&dl=https%3A%2F%2Fwww.ecreativeworks.com%2F&rl=&if=false&ts=1588894285296&cd[DataLayer]=%5B%5D&cd[Meta]=%7B%22title%22%3A%22Industrial%20Website%20Development%20%26%20Digital%20Marketing%20Services%22%7D&cd[OpenGraph]=%7B%7D&cd[Schema.org]=%5B%5D&cd[JSON-LD]=%5B%5D&sw=1600&sh=1200&v=2.9.18&r=stable&ec=1&o=30&fbp=fb.1.1588894285294.1414670823&it=1588894283626&coo=false&es=automatic&tm=3&rqm=GET
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

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

Response headers

date
Thu, 07 May 2020 23:31:25 GMT, Thu, 07 May 2020 23:31:25 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
status
200
cache-control
no-cache, must-revalidate, max-age=0
alt-svc
h3-27=":443"; ma=3600
content-length
44
expires
Thu, 07 May 2020 23:31:25 GMT
reset.css
d10lpsik1i8c69.cloudfront.net/css/
2 KB
1 KB
Stylesheet
General
Full URL
https://d10lpsik1i8c69.cloudfront.net/css/reset.css
Requested by
Host: d10lpsik1i8c69.cloudfront.net
URL: https://d10lpsik1i8c69.cloudfront.net/js/clickstream.js?v=b92c44e
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.230.182.218 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-54-230-182-218.ham50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
401f533697cfb484598d2da76b5f4708bbca985a1fab42dbcfaa0741374d3245

Request headers

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

Response headers

date
Wed, 29 Apr 2020 16:28:33 GMT
content-encoding
gzip
last-modified
Thu, 02 Apr 2020 19:13:23 GMT
server
AmazonS3
age
716573
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
text/css
status
200
cache-control
max-age=31536000
x-amz-cf-pop
HAM50-C3
x-amz-cf-id
mmyeKIl4GapC4xUnI7C6E5BY-bKoY6sQqHFbMQ9egwhwNY8mgJHW0g==
via
1.1 d801ae07b5a25e1b54be4791dba41742.cloudfront.net (CloudFront)
928e6138-4ed9-4abf-85f0-d9046052bf26
https://www.ecreativeworks.com/ Frame 0B35
0
0
Other
General
Full URL
blob:https://www.ecreativeworks.com/928e6138-4ed9-4abf-85f0-d9046052bf26
Requested by
Host: d10lpsik1i8c69.cloudfront.net
URL: https://d10lpsik1i8c69.cloudfront.net/js/clickstream.js?v=b92c44e
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Content-Length
0
ac41674d-32b7-4d85-a515-9284ccb73151
https://www.ecreativeworks.com/ Frame 0B35
30 KB
0
Other
General
Full URL
blob:https://www.ecreativeworks.com/ac41674d-32b7-4d85-a515-9284ccb73151
Requested by
Host: d10lpsik1i8c69.cloudfront.net
URL: https://d10lpsik1i8c69.cloudfront.net/js/clickstream.js?v=b92c44e
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
64d79d0dacbda4605cc4034285043bd51205b3592234041e2aaa92434236e089

Request headers

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

Response headers

Content-Length
31219

Verdicts & Comments Add Verdict or Comment

161 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| onformdata object| onpointerrawupdate object| dataLayer object| _ss string| BASE_HREF boolean| floatHead number| DEBUG_LVL boolean| listingAboveContent boolean| autocomplete undefined| calcPrice boolean| mobileLocalLeft boolean| customTabsEnabled object| google_tag_manager string| GoogleAnalyticsObject function| ga string| _linkedin_data_partner_id object| google_tag_data object| gaplugins object| gaGlobal object| gaData function| lintrk boolean| _already_called_lintrk boolean| sharpspring_tracking_installed function| _extends function| $ function| jQuery function| yall boolean| loadedBool boolean| thisCartIsResponsive number| minWidth boolean| rfqCart function| checkAndUpdateStateFormField function| setupLabelClick function| help function| isFraction function| convertFractionToDecimal function| responsifyTables function| setNavigation function| hideNavigation function| showNavigation function| touchIsEnabled function| dumpObjectToConsole function| getUrlVars function| submit_rfq function| setQty function| setTotal function| textCounter function| submit_convert_cart function| printReceipt function| writeSessionCookie function| getCookieValue function| deleteCookie function| toggleSearch function| toggleSearchMobile boolean| mobileHeaderIsShowing function| setHeader function| setCurrentYearInFooter function| handleCategoryListingItemHover function| removePageSectionBreaks function| setUpHoverOnHeaderIcons function| openSearch function| responsifyIframes function| updateLayoutOfRFQFormItems string| keyStr function| encode64 function| decode64 function| unserialize function| serialize boolean| resetPage boolean| adaptive number| count number| prevCount boolean| back string| responsiveParameters string| gridParameters string| breakPoint string| boxes boolean| changed boolean| moved boolean| multipleFacetedSearch object| pageHistory number| index number| facetedSearchMultipleCount undefined| unwrappedParameters boolean| redirectIfOneProduct function| checkProductListingState function| updateFilters function| editVariable function| checkCartQuantities function| hideColumns function| setFilterHeight function| triggerPB function| updatePricing function| placeFacetedSearch function| closeResponsiveFacetedSearch function| changeCheckbox function| unwrapParameters function| wrapParameters function| loadParameters function| submitFilters function| clearMinMax function| checkMinMax function| clearCheckboxes function| clearUpdate function| selectAllFilters function| updateMin function| updateMax function| savePDF function| saveMPDF number| menuDelay function| setMenuPosition function| handleTopNavItemHover function| changePage object| addrTypes_map object| addr number| choseAddr function| clear_fieldSet function| clear_aType_fieldSet function| toggle_req undefined| origCountry string| origState function| selectCountry function| toggle_otherState function| selectState function| togglePasswords function| toggle_sAddr_enabled function| showAddrEditor function| closeEditors function| loadAddress function| selectAddress function| processAddress function| draw_validateErrorMsg function| captchaValidated function| captchaExpired function| validateEmail function| validate_fldVal function| chk_ok2submit function| validateForm function| init_validation number| windowWidth boolean| blogPostMetaAtBottom function| placeBlogPostMeta object| jQBrowser function| jAlert function| jConfirm function| jPrompt function| Class function| JSListBox boolean| documentIsReady string| _url number| winW number| winH number| winX number| winY number| __lo_site_id function| fbq function| _fbq boolean| __lo_csr_added object| WTW_Watcher object| LO object| _loq

8 Cookies

Domain/Path Name / Value
.ecreativeworks.com/ Name: _gat_UA-20900321-2
Value: 1
.ecreativeworks.com/ Name: _gid
Value: GA1.2.891407496.1588894285
.ecreativeworks.com/ Name: __lotl
Value: https%3A%2F%2Fwww.ecreativeworks.com%2F
.ecreativeworks.com/ Name: _lo_v
Value: 1
.ecreativeworks.com/ Name: _fbp
Value: fb.1.1588894285294.1414670823
.ecreativeworks.com/ Name: _lo_uid
Value: 173852-1588894283792-4466f703c6794467
.ecreativeworks.com/ Name: _lorid
Value: 173852-1588894283792-9b0846326f41a864
.ecreativeworks.com/ Name: _ga
Value: GA1.2.1667767785.1588894285

6 Console Messages

Source Level URL
Text
console-api log URL: data:text/javascript;base64,KGZ1bmN0aW9uKCQpe3ZhciBEQVRBX09SSUdJTkFMX0RPTV9LRVk9J2NvbHVtbml6ZXItb3JpZ2luYWwtZG9tJzskLmZuLmNvbHVtbml6ZT1mdW5jdGlvbihvcHRpb25zKXt0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgJGVsPSQodGhpcyk7JGVsLmRhdGEoREFUQV9PUklHSU5BTF9ET01fS0VZLCRlbC5jbG9uZSghMCwhMCkpfSk7dGhpcy5jb2xzPVtdO3RoaXMub2Zmc2V0PTA7dGhpcy5iZWZvcmU9W107dGhpcy5sYXN0T3RoZXI9MDt0aGlzLnByZXZNYXg9MDt0aGlzLmRlYnVnPTA7dGhpcy5zZXRDb2x1bW5TdGFydD1udWxsO3RoaXMuZWxpcHNpc1RleHQ9Jyc7dmFyIGRlZmF1bHRzPXt3aWR0aDo0MDAsY29sdW1uczohMSxidWlsZE9uY2U6ITEsb3ZlcmZsb3c6ITEsZG9uZUZ1bmM6ZnVuY3Rpb24oKXt9LHRhcmdldDohMSxpZ25vcmVJbWFnZUxvYWRpbmc6ITAsY29sdW1uRmxvYXQ6ImxlZnQiLGxhc3ROZXZlclRhbGxlc3Q6ITEsYWNjdXJhY3k6ITEscHJlY2lzZTohMSxtYW51YWxCcmVha3M6ITEsZGlzYWJsZVNpbmdsZTohMSxjc3NDbGFzc1ByZWZpeDoiIixlbGlwc2lzVGV4dDonLi4uJyxkZWJ1ZzowfTtvcHRpb25zPSQuZXh0ZW5kKGRlZmF1bHRzLG9wdGlvbnMpO3ZhciB0YWJsZXM9bmV3IEFycmF5KCk7JCgndGFibGUnKS5lYWNoKGZ1bmN0aW9uKCl7aWYoISQodGhpcykuaGFzQ2xhc3MoJ3RhYmxlU2F2ZWQnKSl7JCh0aGlzKS5hZGRDbGFzcygndGFibGVTYXZlZCcpCiQodGhpcykuYWRkQ2xhc3MoJ3RhYmxlSUQtJyt0YWJsZXMubGVuZ3RoKQp0YWJsZXMucHVzaCh7dGFibGVJRDondGFibGVJRC0nK3RhYmxlcy5sZW5ndGgsdGhlYWQ6JCh0aGlzKS5maW5kKCd0aGVhZDpmaXJzdCcpLmNsb25lKCksdGZvb3Q6JCh0aGlzKS5maW5kKCd0Zm9vdDpmaXJzdCcpLmNsb25lKCl9KX19KTtmdW5jdGlvbiBmaXhUYWJsZXMoJHB1bGxPdXRIZXJlKXtmb3IoaT0wO2k8dGFibGVzLmxlbmd0aDtpKyspe2lmKCRwdWxsT3V0SGVyZS5pcygidGFibGUiKSl7aWYoJHB1bGxPdXRIZXJlLmNoaWxkcmVuKCd0Zm9vdCcpLmxlbmd0aD09MCYmJHB1bGxPdXRIZXJlLmhhc0NsYXNzKHRhYmxlc1tpXS50YWJsZUlEKSl7JCh0YWJsZXNbaV0udGZvb3QpLmNsb25lKCkucHJlcGVuZFRvKCRwdWxsT3V0SGVyZSl9CmlmKCRwdWxsT3V0SGVyZS5jaGlsZHJlbigndGhlYWQnKS5sZW5ndGg9PTAmJiRwdWxsT3V0SGVyZS5oYXNDbGFzcyh0YWJsZXNbaV0udGFibGVJRCkpeyQodGFibGVzW2ldLnRoZWFkKS5jbG9uZSgpLnByZXBlbmRUbygkcHVsbE91dEhlcmUpfX0KJHB1bGxPdXRIZXJlLmZpbmQoJ3RhYmxlIC4nK3RhYmxlc1tpXS50YWJsZUlEKS5lYWNoKGZ1bmN0aW9uKCl7aWYoJCh0aGlzKS5jaGlsZHJlbigndGZvb3QnKS5sZW5ndGg9PTApeyQodGFibGVzW2ldLnRmb290KS5jbG9uZSgpLnByZXBlbmRUbyh0aGlzKX0KaWYoJCh0aGlzKS5jaGlsZHJlbigndGhlYWQnKS5sZW5ndGg9PTApeyQodGFibGVzW2ldLnRoZWFkKS5jbG9uZSgpLnByZXBlbmRUbyh0aGlzKX19KX19CmlmKHR5cGVvZihvcHRpb25zLndpZHRoKT09InN0cmluZyIpe29wdGlvbnMud2lkdGg9cGFyc2VJbnQob3B0aW9ucy53aWR0aCwxMCk7aWYoaXNOYU4ob3B0aW9ucy53aWR0aCkpe29wdGlvbnMud2lkdGg9ZGVmYXVsdHMud2lkdGh9fQppZih0eXBlb2Ygb3B0aW9ucy5zZXRDb2x1bW5TdGFydD09J2Z1bmN0aW9uJyl7dGhpcy5zZXRDb2x1bW5TdGFydD1vcHRpb25zLnNldENvbHVtblN0YXJ0fQppZih0eXBlb2Ygb3B0aW9ucy5lbGlwc2lzVGV4dD09J3N0cmluZycpe3RoaXMuZWxpcHNpc1RleHQ9b3B0aW9ucy5lbGlwc2lzVGV4dH0KaWYob3B0aW9ucy5kZWJ1Zyl7dGhpcy5kZWJ1Zz1vcHRpb25zLmRlYnVnfQppZighb3B0aW9ucy5zZXRXaWR0aCl7aWYob3B0aW9ucy5wcmVjaXNlKXtvcHRpb25zLnNldFdpZHRoPWZ1bmN0aW9uKG51bUNvbHMpe3JldHVybiAxMDAvbnVtQ29sc319ZWxzZXtvcHRpb25zLnNldFdpZHRoPWZ1bmN0aW9uKG51bUNvbHMpe3JldHVybiBNYXRoLmZsb29yKDEwMC9udW1Db2xzKX19fQpmdW5jdGlvbiBhcHBlbmRTYWZlKCR0YXJnZXQsJGVsZW0pe3RyeXskdGFyZ2V0LmFwcGVuZCgkZWxlbSl9Y2F0Y2goZSl7JHRhcmdldFswXS5hcHBlbmRDaGlsZCgkZWxlbVswXSl9fQpyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyICRpbkJveD1vcHRpb25zLnRhcmdldD8kKG9wdGlvbnMudGFyZ2V0KTokKHRoaXMpO3ZhciBtYXhIZWlnaHQ9JCh0aGlzKS5oZWlnaHQoKTt2YXIgJGNhY2hlPSQoJzxkaXY+PC9kaXY+Jyk7dmFyIGxhc3RXaWR0aD0wO3ZhciBjb2x1bW5pemluZz0hMTt2YXIgbWFudWFsQnJlYWtzPW9wdGlvbnMubWFudWFsQnJlYWtzO3ZhciBjc3NDbGFzc1ByZWZpeD1kZWZhdWx0cy5jc3NDbGFzc1ByZWZpeDtpZih0eXBlb2Yob3B0aW9ucy5jc3NDbGFzc1ByZWZpeCk9PSJzdHJpbmciKXtjc3NDbGFzc1ByZWZpeD1vcHRpb25zLmNzc0NsYXNzUHJlZml4fQp2YXIgYWRqdXN0bWVudD0wO2FwcGVuZFNhZmUoJGNhY2hlLCQodGhpcykuY29udGVudHMoKS5jbG9uZSghMCkpO2lmKCFvcHRpb25zLmlnbm9yZUltYWdlTG9hZGluZyYmIW9wdGlvbnMudGFyZ2V0KXtpZighJGluQm94LmRhdGEoImltYWdlTG9hZGVkIikpeyRpbkJveC5kYXRhKCJpbWFnZUxvYWRlZCIsITApO2lmKCQodGhpcykuZmluZCgiaW1nIikubGVuZ3RoPjApe3ZhciBmdW5jPWZ1bmN0aW9uKCRpbkJveCwkY2FjaGUpe3JldHVybiBmdW5jdGlvbigpe2lmKCEkaW5Cb3guZGF0YSgiZmlyc3RJbWFnZUxvYWRlZCIpKXskaW5Cb3guZGF0YSgiZmlyc3RJbWFnZUxvYWRlZCIsInRydWUiKTthcHBlbmRTYWZlKCRpbkJveC5lbXB0eSgpLCRjYWNoZS5jaGlsZHJlbigpLmNsb25lKCEwKSk7JGluQm94LmNvbHVtbml6ZShvcHRpb25zKX19fSgkKHRoaXMpLCRjYWNoZSk7JCh0aGlzKS5maW5kKCJpbWciKS5vbmUoImxvYWQiLGZ1bmMpOyQodGhpcykuZmluZCgiaW1nIikub25lKCJhYm9ydCIsZnVuYyk7cmV0dXJufX19CiRpbkJveC5lbXB0eSgpO2NvbHVtbml6ZUl0KCk7aWYoIW9wdGlvbnMuYnVpbGRPbmNlKXskKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCl7aWYoIW9wdGlvbnMuYnVpbGRPbmNlKXtpZigkaW5Cb3guZGF0YSgidGltZW91dCIpKXtjbGVhclRpbWVvdXQoJGluQm94LmRhdGEoInRpbWVvdXQiKSl9CiRpbkJveC5kYXRhKCJ0aW1lb3V0IixzZXRUaW1lb3V0KGNvbHVtbml6ZUl0LDIwMCkpfX0pfQpmdW5jdGlvbiBwcmVmaXhUaGVDbGFzc05hbWUoY2xhc3NOYW1lLHdpdGhEb3Qpe3ZhciBkb3Q9d2l0aERvdD8iLiI6IiI7aWYoY3NzQ2xhc3NQcmVmaXgubGVuZ3RoKXtyZXR1cm4gZG90K2Nzc0NsYXNzUHJlZml4KyItIitjbGFzc05hbWV9CnJldHVybiBkb3QrY2xhc3NOYW1lfQpmdW5jdGlvbiBjb2x1bW5pemUoJHB1dEluSGVyZSwkcHVsbE91dEhlcmUsJHBhcmVudENvbHVtbix0YXJnZXRIZWlnaHQpe3doaWxlKChtYW51YWxCcmVha3N8fCRwYXJlbnRDb2x1bW4uaGVpZ2h0KCk8dGFyZ2V0SGVpZ2h0KSYmJHB1bGxPdXRIZXJlWzBdLmNoaWxkTm9kZXMubGVuZ3RoKXt2YXIgbm9kZT0kcHVsbE91dEhlcmVbMF0uY2hpbGROb2Rlc1swXTtpZigkKG5vZGUpLmZpbmQocHJlZml4VGhlQ2xhc3NOYW1lKCJjb2x1bW5icmVhayIsITApKS5sZW5ndGgpe3JldHVybn0KaWYoJChub2RlKS5oYXNDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImNvbHVtbmJyZWFrIikpKXtyZXR1cm59CmFwcGVuZFNhZmUoJHB1dEluSGVyZSwkKG5vZGUpKX0KaWYoJHB1dEluSGVyZVswXS5jaGlsZE5vZGVzLmxlbmd0aD09PTApcmV0dXJuO3ZhciBraWRzPSRwdXRJbkhlcmVbMF0uY2hpbGROb2Rlczt2YXIgbGFzdEtpZD1raWRzW2tpZHMubGVuZ3RoLTFdOyRwdXRJbkhlcmVbMF0ucmVtb3ZlQ2hpbGQobGFzdEtpZCk7dmFyICRpdGVtPSQobGFzdEtpZCk7aWYoJGl0ZW1bMF0ubm9kZVR5cGU9PTMpe3ZhciBvVGV4dD0kaXRlbVswXS5ub2RlVmFsdWU7dmFyIGNvdW50ZXIyPW9wdGlvbnMud2lkdGgvMTg7aWYob3B0aW9ucy5hY2N1cmFjeSkKY291bnRlcjI9b3B0aW9ucy5hY2N1cmFjeTt2YXIgY29sdW1uVGV4dDt2YXIgbGF0ZXN0VGV4dE5vZGU9bnVsbDt3aGlsZSgkcGFyZW50Q29sdW1uLmhlaWdodCgpPHRhcmdldEhlaWdodCYmb1RleHQubGVuZ3RoKXt2YXIgaW5kZXhPZlNwYWNlPW9UZXh0LmluZGV4T2YoJyAnLGNvdW50ZXIyKTtpZihpbmRleE9mU3BhY2UhPS0xKXtjb2x1bW5UZXh0PW9UZXh0LnN1YnN0cmluZygwLGluZGV4T2ZTcGFjZSl9ZWxzZXtjb2x1bW5UZXh0PW9UZXh0fQpsYXRlc3RUZXh0Tm9kZT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2x1bW5UZXh0KTthcHBlbmRTYWZlKCRwdXRJbkhlcmUsJChsYXRlc3RUZXh0Tm9kZSkpO2lmKG9UZXh0Lmxlbmd0aD5jb3VudGVyMiYmaW5kZXhPZlNwYWNlIT0tMSl7b1RleHQ9b1RleHQuc3Vic3RyaW5nKGluZGV4T2ZTcGFjZSl9ZWxzZXtvVGV4dD0iIn19CmlmKCRwYXJlbnRDb2x1bW4uaGVpZ2h0KCk+PXRhcmdldEhlaWdodCYmbGF0ZXN0VGV4dE5vZGUhPT1udWxsKXskcHV0SW5IZXJlWzBdLnJlbW92ZUNoaWxkKGxhdGVzdFRleHROb2RlKTtvVGV4dD1sYXRlc3RUZXh0Tm9kZS5ub2RlVmFsdWUrb1RleHR9CmlmKG9UZXh0Lmxlbmd0aCl7JGl0ZW1bMF0ubm9kZVZhbHVlPW9UZXh0fWVsc2V7cmV0dXJuITF9fQppZigkcHVsbE91dEhlcmUuY29udGVudHMoKS5sZW5ndGgpeyRwdWxsT3V0SGVyZS5wcmVwZW5kKCRpdGVtKX1lbHNle2FwcGVuZFNhZmUoJHB1bGxPdXRIZXJlLCRpdGVtKX0KcmV0dXJuICRpdGVtWzBdLm5vZGVUeXBlPT0zfQpmdW5jdGlvbiBzcGxpdCgkcHV0SW5IZXJlLCRwdWxsT3V0SGVyZSwkcGFyZW50Q29sdW1uLHRhcmdldEhlaWdodCl7aWYoJHB1dEluSGVyZS5jb250ZW50cygiOmxhc3QiKS5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uYnJlYWsiLCEwKSkubGVuZ3RoKXtmaXhUYWJsZXMoJHB1bGxPdXRIZXJlKTtyZXR1cm59CmlmKCRwdXRJbkhlcmUuY29udGVudHMoIjpsYXN0IikuaGFzQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJjb2x1bW5icmVhayIpKSl7Zml4VGFibGVzKCRwdWxsT3V0SGVyZSk7cmV0dXJufQppZigkcHVsbE91dEhlcmUuY29udGVudHMoKS5sZW5ndGgpe3ZhciAkY2xvbmVNZT0kcHVsbE91dEhlcmUuY29udGVudHMoIjpmaXJzdCIpO2lmKHR5cGVvZiAkY2xvbmVNZS5nZXQoMCk9PSd1bmRlZmluZWQnfHwkY2xvbmVNZS5nZXQoMCkubm9kZVR5cGUhPTEpcmV0dXJuO3ZhciAkY2xvbmU9JGNsb25lTWUuY2xvbmUoITApO2lmKCRjbG9uZU1lLmhhc0NsYXNzKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uYnJlYWsiKSkpe2FwcGVuZFNhZmUoJHB1dEluSGVyZSwkY2xvbmUpOyRjbG9uZU1lLnJlbW92ZSgpfWVsc2UgaWYobWFudWFsQnJlYWtzKXthcHBlbmRTYWZlKCRwdXRJbkhlcmUsJGNsb25lKTskY2xvbmVNZS5yZW1vdmUoKX1lbHNlIGlmKCRjbG9uZS5nZXQoMCkubm9kZVR5cGU9PTEmJiEkY2xvbmUuaGFzQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJkb250ZW5kIikpKXthcHBlbmRTYWZlKCRwdXRJbkhlcmUsJGNsb25lKTtpZigkY2xvbmUuaXMoImltZyIpJiYkcGFyZW50Q29sdW1uLmhlaWdodCgpPHRhcmdldEhlaWdodCsyMCl7JGNsb25lTWUucmVtb3ZlKCl9ZWxzZSBpZigkY2xvbmVNZS5oYXNDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImRvbnRzcGxpdCIpKSYmJHBhcmVudENvbHVtbi5oZWlnaHQoKTx0YXJnZXRIZWlnaHQrMjApeyRjbG9uZU1lLnJlbW92ZSgpfWVsc2UgaWYoJGNsb25lLmlzKCJpbWciKXx8JGNsb25lTWUuaGFzQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJkb250c3BsaXQiKSkpeyRjbG9uZS5yZW1vdmUoKX1lbHNleyRjbG9uZS5lbXB0eSgpO2lmKCFjb2x1bW5pemUoJGNsb25lLCRjbG9uZU1lLCRwYXJlbnRDb2x1bW4sdGFyZ2V0SGVpZ2h0KSl7JGNsb25lTWUuYWRkQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJzcGxpdCIpKTtpZigkY2xvbmVNZS5nZXQoMCkudGFnTmFtZT09J09MJyl7dmFyIHN0YXJ0V2l0aD0kY2xvbmUuZ2V0KDApLmNoaWxkRWxlbWVudENvdW50KyRjbG9uZS5nZXQoMCkuc3RhcnQ7JGNsb25lTWUuYXR0cignc3RhcnQnLHN0YXJ0V2l0aCsxKX0KaWYoJGNsb25lTWUuY2hpbGRyZW4oKS5sZW5ndGgpe3NwbGl0KCRjbG9uZSwkY2xvbmVNZSwkcGFyZW50Q29sdW1uLHRhcmdldEhlaWdodCl9fWVsc2V7JGNsb25lTWUuYWRkQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJzcGxpdCIpKX0KaWYoJGNsb25lLmdldCgwKS5jaGlsZE5vZGVzLmxlbmd0aD09PTApeyRjbG9uZS5yZW1vdmUoKTskY2xvbmVNZS5yZW1vdmVDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoInNwbGl0IikpfWVsc2UgaWYoJGNsb25lLmdldCgwKS5jaGlsZE5vZGVzLmxlbmd0aD09MSl7dmFyIG9ubHlOb2RlPSRjbG9uZS5nZXQoMCkuY2hpbGROb2Rlc1swXTtpZihvbmx5Tm9kZS5ub2RlVHlwZT09Myl7dmFyIG5vbndoaXRlc3BhY2U9L1xTLzt2YXIgc3RyPW9ubHlOb2RlLm5vZGVWYWx1ZTtpZighbm9ud2hpdGVzcGFjZS50ZXN0KHN0cikpeyRjbG9uZS5yZW1vdmUoKTskY2xvbmVNZS5yZW1vdmVDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoInNwbGl0IikpfX19fX19CmZpeFRhYmxlcygkcHVsbE91dEhlcmUpfQpmdW5jdGlvbiBzaW5nbGVDb2x1bW5pemVJdCgpe2lmKCRpbkJveC5kYXRhKCJjb2x1bW5pemVkIikmJiRpbkJveC5jaGlsZHJlbigpLmxlbmd0aD09MSl7cmV0dXJufQokaW5Cb3guZGF0YSgiY29sdW1uaXplZCIsITApOyRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIsITApOyRpbkJveC5lbXB0eSgpOyRpbkJveC5hcHBlbmQoJCgiPGRpdiBjbGFzcz0nIitwcmVmaXhUaGVDbGFzc05hbWUoImZpcnN0IikrIiAiK3ByZWZpeFRoZUNsYXNzTmFtZSgibGFzdCIpKyIgIitwcmVmaXhUaGVDbGFzc05hbWUoImNvbHVtbiIpKyIgIisiJyBzdHlsZT0nd2lkdGg6MTAwJTsgZmxvYXQ6ICIrb3B0aW9ucy5jb2x1bW5GbG9hdCsiOyc+PC9kaXY+IikpOyRjb2w9JGluQm94LmNoaWxkcmVuKCkuZXEoJGluQm94LmNoaWxkcmVuKCkubGVuZ3RoLTEpOyRkZXN0cm95YWJsZT0kY2FjaGUuY2xvbmUoITApO2lmKG9wdGlvbnMub3ZlcmZsb3cpe3RhcmdldEhlaWdodD1vcHRpb25zLm92ZXJmbG93LmhlaWdodDtjb2x1bW5pemUoJGNvbCwkZGVzdHJveWFibGUsJGNvbCx0YXJnZXRIZWlnaHQpO2lmKCEkZGVzdHJveWFibGUuY29udGVudHMoKS5maW5kKCI6Zmlyc3QtY2hpbGQiKS5oYXNDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImRvbnRlbmQiKSkpe3NwbGl0KCRjb2wsJGRlc3Ryb3lhYmxlLCRjb2wsdGFyZ2V0SGVpZ2h0KX0Kd2hpbGUoJGNvbC5jb250ZW50cygiOmxhc3QiKS5sZW5ndGgmJmNoZWNrRG9udEVuZENvbHVtbigkY29sLmNvbnRlbnRzKCI6bGFzdCIpLmdldCgwKSkpe3ZhciAkbGFzdEtpZD0kY29sLmNvbnRlbnRzKCI6bGFzdCIpOyRsYXN0S2lkLnJlbW92ZSgpOyRkZXN0cm95YWJsZS5wcmVwZW5kKCRsYXN0S2lkKX0KdmFyIGh0bWw9IiI7dmFyIGRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTt3aGlsZSgkZGVzdHJveWFibGVbMF0uY2hpbGROb2Rlcy5sZW5ndGg+MCl7dmFyIGtpZD0kZGVzdHJveWFibGVbMF0uY2hpbGROb2Rlc1swXTtpZihraWQuYXR0cmlidXRlcyl7Zm9yKHZhciBpPTA7aTxraWQuYXR0cmlidXRlcy5sZW5ndGg7aSsrKXtpZihraWQuYXR0cmlidXRlc1tpXS5ub2RlTmFtZS5pbmRleE9mKCJqUXVlcnkiKT09PTApe2tpZC5yZW1vdmVBdHRyaWJ1dGUoa2lkLmF0dHJpYnV0ZXNbaV0ubm9kZU5hbWUpfX19CmRpdi5pbm5lckhUTUw9IiI7ZGl2LmFwcGVuZENoaWxkKCRkZXN0cm95YWJsZVswXS5jaGlsZE5vZGVzWzBdKTtodG1sKz1kaXYuaW5uZXJIVE1MfQp2YXIgb3ZlcmZsb3c9JChvcHRpb25zLm92ZXJmbG93LmlkKVswXTtvdmVyZmxvdy5pbm5lckhUTUw9aHRtbH1lbHNle2FwcGVuZFNhZmUoJGNvbCwkZGVzdHJveWFibGUuY29udGVudHMoKSl9CiRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIsITEpO2lmKG9wdGlvbnMub3ZlcmZsb3cmJm9wdGlvbnMub3ZlcmZsb3cuZG9uZUZ1bmMpe29wdGlvbnMub3ZlcmZsb3cuZG9uZUZ1bmMoKX0Kb3B0aW9ucy5kb25lRnVuYygpfQpmdW5jdGlvbiBjaGVja0RvbnRFbmRDb2x1bW4oZG9tKXtpZihkb20ubm9kZVR5cGU9PTMpe2lmKC9eXHMrJC8udGVzdChkb20ubm9kZVZhbHVlKSl7aWYoIWRvbS5wcmV2aW91c1NpYmxpbmcpcmV0dXJuITE7cmV0dXJuIGNoZWNrRG9udEVuZENvbHVtbihkb20ucHJldmlvdXNTaWJsaW5nKX0KcmV0dXJuITF9CmlmKGRvbS5ub2RlVHlwZSE9MSlyZXR1cm4hMTtpZigkKGRvbSkuaGFzQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJkb250ZW5kIikpKXJldHVybiEwO2lmKGRvbS5jaGlsZE5vZGVzLmxlbmd0aD09PTApcmV0dXJuITE7cmV0dXJuIGNoZWNrRG9udEVuZENvbHVtbihkb20uY2hpbGROb2Rlc1tkb20uY2hpbGROb2Rlcy5sZW5ndGgtMV0pfQpmdW5jdGlvbiBjb2x1bW5pemVJdCgpe2FkanVzdG1lbnQ9MDtpZihsYXN0V2lkdGg9PSRpbkJveC53aWR0aCgpKXJldHVybjtsYXN0V2lkdGg9JGluQm94LndpZHRoKCk7dmFyIG51bUNvbHM9TWF0aC5yb3VuZCgkaW5Cb3gud2lkdGgoKS9vcHRpb25zLndpZHRoKTt2YXIgb3B0aW9uV2lkdGg9b3B0aW9ucy53aWR0aDt2YXIgb3B0aW9uSGVpZ2h0PW9wdGlvbnMuaGVpZ2h0O2lmKG9wdGlvbnMuY29sdW1ucyludW1Db2xzPW9wdGlvbnMuY29sdW1ucztpZihtYW51YWxCcmVha3Mpe251bUNvbHM9JGNhY2hlLmZpbmQocHJlZml4VGhlQ2xhc3NOYW1lKCJjb2x1bW5icmVhayIsITApKS5sZW5ndGgrMTtvcHRpb25XaWR0aD0hMX0KaWYobnVtQ29sczw9MSYmIW9wdGlvbnMuZGlzYWJsZVNpbmdsZSl7cmV0dXJuIHNpbmdsZUNvbHVtbml6ZUl0KCl9CmlmKCRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIpKXJldHVybjskaW5Cb3guZGF0YSgiY29sdW1uaXplZCIsITApOyRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIsITApOyRpbkJveC5lbXB0eSgpOyRpbkJveC5hcHBlbmQoJCgiPGRpdiBzdHlsZT0nd2lkdGg6IitvcHRpb25zLnNldFdpZHRoKG51bUNvbHMpKyIlOyBmbG9hdDogIitvcHRpb25zLmNvbHVtbkZsb2F0KyI7Jz48L2Rpdj4iKSk7JGNvbD0kaW5Cb3guY2hpbGRyZW4oIjpsYXN0Iik7YXBwZW5kU2FmZSgkY29sLCRjYWNoZS5jbG9uZSgpKTttYXhIZWlnaHQ9JGNvbC5oZWlnaHQoKTskaW5Cb3guZW1wdHkoKTt2YXIgdGFyZ2V0SGVpZ2h0PW1heEhlaWdodC9udW1Db2xzO3ZhciBmaXJzdFRpbWU9ITA7dmFyIG1heExvb3BzPTM7dmFyIHNjcm9sbEhvcml6b250YWxseT0hMTtpZihvcHRpb25zLm92ZXJmbG93KXttYXhMb29wcz0xO3RhcmdldEhlaWdodD1vcHRpb25zLm92ZXJmbG93LmhlaWdodH1lbHNlIGlmKG9wdGlvbkhlaWdodCYmb3B0aW9uV2lkdGgpe21heExvb3BzPTE7dGFyZ2V0SGVpZ2h0PW9wdGlvbkhlaWdodDtzY3JvbGxIb3Jpem9udGFsbHk9ITB9CmZvcih2YXIgbG9vcENvdW50PTA7bG9vcENvdW50PG1heExvb3BzJiZsb29wQ291bnQ8MjA7bG9vcENvdW50KyspeyRpbkJveC5lbXB0eSgpO3ZhciAkZGVzdHJveWFibGUsY2xhc3NOYW1lLCRjb2wsJGxhc3RLaWQ7dHJ5eyRkZXN0cm95YWJsZT0kY2FjaGUuY2xvbmUoITApfWNhdGNoKGUpeyRkZXN0cm95YWJsZT0kY2FjaGUuY2xvbmUoKX0KJGRlc3Ryb3lhYmxlLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpO2Zvcih2YXIgaT0wO2k8bnVtQ29scztpKyspe2NsYXNzTmFtZT0oaT09PTApP3ByZWZpeFRoZUNsYXNzTmFtZSgiZmlyc3QiKToiIjtjbGFzc05hbWUrPSIgIitwcmVmaXhUaGVDbGFzc05hbWUoImNvbHVtbiIpO2NsYXNzTmFtZT0oaT09bnVtQ29scy0xKT8ocHJlZml4VGhlQ2xhc3NOYW1lKCJsYXN0IikrIiAiK2NsYXNzTmFtZSk6Y2xhc3NOYW1lOyRpbkJveC5hcHBlbmQoJCgiPGRpdiBjbGFzcz0nIitjbGFzc05hbWUrIicgc3R5bGU9J3dpZHRoOiIrb3B0aW9ucy5zZXRXaWR0aChudW1Db2xzKSsiJTsgZmxvYXQ6ICIrb3B0aW9ucy5jb2x1bW5GbG9hdCsiOyc+PC9kaXY+IikpfQppPTA7d2hpbGUoaTxudW1Db2xzLShvcHRpb25zLm92ZXJmbG93PzA6MSl8fHNjcm9sbEhvcml6b250YWxseSYmJGRlc3Ryb3lhYmxlLmNvbnRlbnRzKCkubGVuZ3RoKXtpZigkaW5Cb3guY2hpbGRyZW4oKS5sZW5ndGg8PWkpeyRpbkJveC5hcHBlbmQoJCgiPGRpdiBjbGFzcz0nIitjbGFzc05hbWUrIicgc3R5bGU9J3dpZHRoOiIrb3B0aW9ucy5zZXRXaWR0aChudW1Db2xzKSsiJTsgZmxvYXQ6ICIrb3B0aW9ucy5jb2x1bW5GbG9hdCsiOyc+PC9kaXY+IikpfQokY29sPSRpbkJveC5jaGlsZHJlbigpLmVxKGkpO2lmKHNjcm9sbEhvcml6b250YWxseSl7JGNvbC53aWR0aChvcHRpb25XaWR0aCsicHgiKX0KY29sdW1uaXplKCRjb2wsJGRlc3Ryb3lhYmxlLCRjb2wsdGFyZ2V0SGVpZ2h0KTtzcGxpdCgkY29sLCRkZXN0cm95YWJsZSwkY29sLHRhcmdldEhlaWdodCk7d2hpbGUoJGNvbC5jb250ZW50cygiOmxhc3QiKS5sZW5ndGgmJmNoZWNrRG9udEVuZENvbHVtbigkY29sLmNvbnRlbnRzKCI6bGFzdCIpLmdldCgwKSkpeyRsYXN0S2lkPSRjb2wuY29udGVudHMoIjpsYXN0Iik7JGxhc3RLaWQucmVtb3ZlKCk7JGRlc3Ryb3lhYmxlLnByZXBlbmQoJGxhc3RLaWQpfQppKys7aWYoJGNvbC5jb250ZW50cygpLmxlbmd0aD09PTAmJiRkZXN0cm95YWJsZS5jb250ZW50cygpLmxlbmd0aCl7JGNvbC5hcHBlbmQoJGRlc3Ryb3lhYmxlLmNvbnRlbnRzKCI6Zmlyc3QiKSl9ZWxzZSBpZihpPT1udW1Db2xzLShvcHRpb25zLm92ZXJmbG93PzA6MSkmJiFvcHRpb25zLm92ZXJmbG93KXtpZigkZGVzdHJveWFibGUuZmluZChwcmVmaXhUaGVDbGFzc05hbWUoImNvbHVtbmJyZWFrIiwhMCkpLmxlbmd0aCl7bnVtQ29scyArK319fQppZihvcHRpb25zLm92ZXJmbG93JiYhc2Nyb2xsSG9yaXpvbnRhbGx5KXt2YXIgSUU2PSExO3ZhciBJRTc9KGRvY3VtZW50LmFsbCkmJihuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCJNU0lFIDcuIikhPS0xKTtpZihJRTZ8fElFNyl7dmFyIGh0bWw9IiI7dmFyIGRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTt3aGlsZSgkZGVzdHJveWFibGVbMF0uY2hpbGROb2Rlcy5sZW5ndGg+MCl7dmFyIGtpZD0kZGVzdHJveWFibGVbMF0uY2hpbGROb2Rlc1swXTtmb3IoaT0wO2k8a2lkLmF0dHJpYnV0ZXMubGVuZ3RoO2krKyl7aWYoa2lkLmF0dHJpYnV0ZXNbaV0ubm9kZU5hbWUuaW5kZXhPZigialF1ZXJ5Iik9PT0wKXtraWQucmVtb3ZlQXR0cmlidXRlKGtpZC5hdHRyaWJ1dGVzW2ldLm5vZGVOYW1lKX19CmRpdi5pbm5lckhUTUw9IiI7ZGl2LmFwcGVuZENoaWxkKCRkZXN0cm95YWJsZVswXS5jaGlsZE5vZGVzWzBdKTtodG1sKz1kaXYuaW5uZXJIVE1MfQp2YXIgb3ZlcmZsb3c9JChvcHRpb25zLm92ZXJmbG93LmlkKVswXTtvdmVyZmxvdy5pbm5lckhUTUw9aHRtbH1lbHNleyQob3B0aW9ucy5vdmVyZmxvdy5pZCkuZW1wdHkoKS5hcHBlbmQoJGRlc3Ryb3lhYmxlLmNvbnRlbnRzKCkuY2xvbmUoITApKX19ZWxzZSBpZighc2Nyb2xsSG9yaXpvbnRhbGx5KXskY29sPSRpbkJveC5jaGlsZHJlbigpLmVxKCRpbkJveC5jaGlsZHJlbigpLmxlbmd0aC0xKTskZGVzdHJveWFibGUuY29udGVudHMoKS5lYWNoKGZ1bmN0aW9uKCl7JGNvbC5hcHBlbmQoJCh0aGlzKSl9KTt2YXIgYWZ0ZXJIPSRjb2wuaGVpZ2h0KCk7dmFyIGRpZmY9YWZ0ZXJILXRhcmdldEhlaWdodDt2YXIgdG90YWxIPTA7dmFyIG1pbj0xMDAwMDAwMDt2YXIgbWF4PTA7dmFyIGxhc3RJc01heD0hMTt2YXIgbnVtYmVyT2ZDb2x1bW5zVGhhdERvbnRFbmRJbkFDb2x1bW5CcmVhaz0wOyRpbkJveC5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oJGluQm94KXtyZXR1cm4gZnVuY3Rpb24oJGl0ZW0pe3ZhciAkY29sPSRpbkJveC5jaGlsZHJlbigpLmVxKCRpdGVtKTt2YXIgZW5kc0luQnJlYWs9JGNvbC5jaGlsZHJlbigiOmxhc3QiKS5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uYnJlYWsiLCEwKSkubGVuZ3RoO2lmKCFlbmRzSW5CcmVhayl7dmFyIGg9JGNvbC5oZWlnaHQoKTtsYXN0SXNNYXg9ITE7dG90YWxIKz1oO2lmKGg+bWF4KXttYXg9aDtsYXN0SXNNYXg9ITB9CmlmKGg8bWluKW1pbj1oO251bWJlck9mQ29sdW1uc1RoYXREb250RW5kSW5BQ29sdW1uQnJlYWsrK319fSgkaW5Cb3gpKTt2YXIgYXZnSD10b3RhbEgvbnVtYmVyT2ZDb2x1bW5zVGhhdERvbnRFbmRJbkFDb2x1bW5CcmVhaztpZih0b3RhbEg9PT0wKXtsb29wQ291bnQ9bWF4TG9vcHN9ZWxzZSBpZihvcHRpb25zLmxhc3ROZXZlclRhbGxlc3QmJmxhc3RJc01heCl7YWRqdXN0bWVudCs9NTt0YXJnZXRIZWlnaHQ9dGFyZ2V0SGVpZ2h0KzMwO2lmKGxvb3BDb3VudD09bWF4TG9vcHMtMSltYXhMb29wcysrfWVsc2UgaWYobWF4LW1pbj4zMCl7dGFyZ2V0SGVpZ2h0PWF2Z0grMzB9ZWxzZSBpZihNYXRoLmFicyhhdmdILXRhcmdldEhlaWdodCk+MjApe3RhcmdldEhlaWdodD1hdmdIfWVsc2V7bG9vcENvdW50PW1heExvb3BzfX1lbHNleyRpbkJveC5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oaSl7JGNvbD0kaW5Cb3guY2hpbGRyZW4oKS5lcShpKTskY29sLndpZHRoKG9wdGlvbldpZHRoKyJweCIpO2lmKGk9PT0wKXskY29sLmFkZENsYXNzKHByZWZpeFRoZUNsYXNzTmFtZSgiZmlyc3QiKSl9ZWxzZSBpZihpPT0kaW5Cb3guY2hpbGRyZW4oKS5sZW5ndGgtMSl7JGNvbC5hZGRDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImxhc3QiKSl9ZWxzZXskY29sLnJlbW92ZUNsYXNzKHByZWZpeFRoZUNsYXNzTmFtZSgiZmlyc3QiKSk7JGNvbC5yZW1vdmVDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImxhc3QiKSl9fSk7JGluQm94LndpZHRoKCRpbkJveC5jaGlsZHJlbigpLmxlbmd0aCpvcHRpb25XaWR0aCsicHgiKX0KJGluQm94LmFwcGVuZCgkKCI8YnIgc3R5bGU9J2NsZWFyOmJvdGg7Jz4iKSl9CiRpbkJveC5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uIiwhMCkpLmZpbmQoIjpmaXJzdCIrcHJlZml4VGhlQ2xhc3NOYW1lKCJyZW1vdmVpZmZpcnN0IiwhMCkpLnJlbW92ZSgpOyRpbkJveC5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uIiwhMCkpLmZpbmQoJzpsYXN0JytwcmVmaXhUaGVDbGFzc05hbWUoInJlbW92ZWlmbGFzdCIsITApKS5yZW1vdmUoKTskaW5Cb3guZmluZChwcmVmaXhUaGVDbGFzc05hbWUoInNwbGl0IiwhMCkpLmZpbmQoIjpmaXJzdCIrcHJlZml4VGhlQ2xhc3NOYW1lKCJyZW1vdmVpZmZpcnN0IiwhMCkpLnJlbW92ZSgpOyRpbkJveC5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgic3BsaXQiLCEwKSkuZmluZCgnOmxhc3QnK3ByZWZpeFRoZUNsYXNzTmFtZSgicmVtb3ZlaWZsYXN0IiwhMCkpLnJlbW92ZSgpOyRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIsITEpO2lmKG9wdGlvbnMub3ZlcmZsb3cpe29wdGlvbnMub3ZlcmZsb3cuZG9uZUZ1bmMoKX0Kb3B0aW9ucy5kb25lRnVuYygpfX0pfTskLmZuLnVuY29sdW1uaXplPWZ1bmN0aW9uKCl7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyICRlbD0kKHRoaXMpLCRjbG9uZTtpZigkY2xvbmU9JGVsLmRhdGEoREFUQV9PUklHSU5BTF9ET01fS0VZKSl7JGVsLnJlcGxhY2VXaXRoKCRjbG9uZSl9fSl9OyQuZm4ucmVudW1iZXJCeUpTPWZ1bmN0aW9uKCRzZWFyY2hUYWcsJGNvbG5vLCR0YXJnZXRJZCwkdGFyZ2V0Q2xhc3Mpe3RoaXMuc2V0TGlzdD1mdW5jdGlvbigkY29scywkbGlzdCwkdGFnMSl7dmFyICRwYXJlbnRzPXRoaXMuYmVmb3JlLnBhcmVudHMoKTt2YXIgJHJlc3Q7JHJlc3Q9JCgkY29sc1t0aGlzLm9mZnNldC0xXSkuZmluZCgnPionKTtpZigoJHJlc3QubGFzdCgpKVswXS50YWdOYW1lIT0kdGFnMS50b1VwcGVyQ2FzZSgpKXtpZih0aGlzLmRlYnVnKXtjb25zb2xlLmxvZygiTGFzdCBpdGVtIGluIHByZXZpb3VzIGNvbHVtbiwgaXNuJ3QgYSBsaXN0Li4uIil9CnJldHVybiAwfQokcmVzdD0kcmVzdC5sZW5ndGg7dmFyICR0aW50PTE7aWYodGhpcy5sYXN0T3RoZXI8PTApeyR0aW50PXRoaXMuYmVmb3JlLmNoaWxkcmVuKCkubGVuZ3RoKzF9ZWxzZXskdGludD0kKCRwYXJlbnRzW3RoaXMubGFzdE90aGVyXSkuY2hpbGRyZW4oKS5sZW5ndGgrMX0KaWYoJCgkY29sc1t0aGlzLm9mZnNldF0pLmZpbmQoJHRhZzErJzpmaXJzdCBsaS5zcGxpdCcpLmxlbmd0aCl7dmFyICR3aGVyZUVsaXBzaXM9JCgkY29sc1t0aGlzLm9mZnNldC0xXSkuZmluZCgkdGFnMSsnOmxhc3QgbGk6bGFzdCcpO2lmKHRoaXMuZWxpcHNpc1RleHQ9PT0nJ3x8JCgkY29sc1t0aGlzLm9mZnNldC0xXSkuZmluZCgkdGFnMSsnOmxhc3QgfiBkaXYnKS5sZW5ndGh8fCQoJGNvbHNbdGhpcy5vZmZzZXQtMV0pLmZpbmQoJHRhZzErJzpsYXN0IH4gcCcpLmxlbmd0aCl7fWVsc2V7aWYoJCgkd2hlcmVFbGlwc2lzKS5maW5kKCd1bCwgb2wsIGRsJykubGVuZ3RoPT0wKXt2YXIgJHR4dD0kd2hlcmVFbGlwc2lzLmxhc3QoKS50ZXh0KCk7dmFyICRsZW49JHR4dC5sZW5ndGg7aWYoJHR4dC5zdWJzdHJpbmcoJGxlbi0xKT09JzsnKXtpZigkdHh0LnN1YnN0cmluZygkbGVuLTQpIT10aGlzLmVsaXBzaXNUZXh0Kyc7Jyl7JHR4dD0kdHh0LnN1YnN0cmluZygwLCRsZW4tMSkrdGhpcy5lbGlwc2lzVGV4dCsnOyd9fWVsc2V7aWYoJHR4dC5zdWJzdHJpbmcoJGxlbi0zKSE9dGhpcy5lbGlwc2lzVGV4dCl7JHR4dCs9dGhpcy5lbGlwc2lzVGV4dH19CiR3aGVyZUVsaXBzaXMubGFzdCgpLnRleHQoJHR4dCl9fQppZigkKCRjb2xzW3RoaXMub2Zmc2V0XSkuZmluZCgkdGFnMSsnOmZpcnN0ID5saS5zcGxpdCA+JyskdGFnMSkubGVuZ3RoPT0wKXskdGludC0tfX0KaWYoJHJlc3Q9PTEpeyR0aW50Kz10aGlzLnByZXZNYXh9CmlmKHRoaXMubmVzdD4xKXtpZih0aGlzLmRlYnVnKXtjb25zb2xlLmxvZygiU3VwcG9zZWQgdG8gYmUgYSBuZXN0ZWQgbGlzdC4uLmRlY3IiKX0KJHRpbnQtLTt2YXIgJHR0PSQoJGNvbHNbdGhpcy5vZmZzZXQtMV0pLmZpbmQoJHRhZzErJzpmaXJzdCBsaS5zcGxpdDpmaXJzdCcpO2lmKCR0dC5sZW5ndGg+MCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coIlByZXZpb3VzIGNvbHVtbiBzdGFydGVkIHdpdGggYSBzcGxpdCBpdGVtLCBzbyB0aGF0IGNvdW50IGlzIG9uZSBsZXNzIHRoYW4gZXhwZWN0ZWQiKX0KJHRpbnQtLX0KJHR0PSQoJGNvbHNbdGhpcy5vZmZzZXRdKS5maW5kKCR0YWcxKyc6Zmlyc3QgbGk6Zmlyc3QnKS5jbG9uZSgpOyR0dC5jaGlsZHJlbigpLnJlbW92ZSgpO2lmKCQudHJpbSgkdHQudGV4dCgpKS5sZW5ndGg+MCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coIklmIHRoYXQgd2FzIGEgY29tcGxldGUgbGlzdCBpbiB0aGUgcHJldmlvdXMgY29sdW1uLCBkb24ndCBkZWNyLiIpfQokdGludCsrO2lmKCQoJGNvbHNbdGhpcy5vZmZzZXQtMV0pLmZpbmQoIj4iKyR0YWcxKyc6bGFzdCAnKS5jaGlsZHJlbigpLmxlbmd0aD09MCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coInVubGVzcyB0aGF0IHdhcyBlbXB0eSwgaW4gd2hpY2ggY2FzZSByZXZlcnQiKX0KJHRpbnQtLX19fWVsc2V7dmFyICR0dD0kKCRjb2xzW3RoaXMub2Zmc2V0XSkuZmluZCgkdGFnMSsnOmZpcnN0IGxpOmZpcnN0ICcrJHRhZzErIi5zcGxpdCBsaS5zcGxpdCIpO2lmKCR0dC5sZW5ndGg+MCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coIltOZXN0ZWRdIENvbHVtbiBzdGFydGVkIHdpdGggYSBzcGxpdCBpdGVtLCBzbyB0aGF0IGNvdW50IGlzIG9uZSBsZXNzIHRoYW4gZXhwZWN0ZWQiKX0KJHRpbnQtLX19CmlmKHRoaXMuZGVidWcpe2NvbnNvbGUubG9nKCJTZXR0aW5nIHRoZSBzdGFydCB2YWx1ZSB0byAiKyR0aW50KyIgKCIrdGhpcy5wcmV2TWF4KyIpIil9CmlmKCR0aW50PjApe2lmKHR5cGVvZiB0aGlzLnNldENvbHVtblN0YXJ0PT0nZnVuY3Rpb24nKXt0aGlzLnNldENvbHVtblN0YXJ0KCRsaXN0LCR0aW50KX1lbHNleyRsaXN0LmF0dHIoJ3N0YXJ0JywkdGludCl9fQpyZXR1cm4gMH0KaWYodHlwZW9mICR0YXJnZXRJZD09PSd1bmRlZmluZWQnKXskdGFyZ2V0SWQ9ITF9CmlmKHR5cGVvZiAkdGFyZ2V0Q2xhc3M9PT0ndW5kZWZpbmVkJyl7JHRhcmdldENsYXNzPSExfQppZighJHRhcmdldElkJiYhJHRhcmdldENsYXNzKXt0aHJvdyAicmVudW1iZXJCeUpTKCk6IEJhZCBwYXJhbSwgbXVzdCBwYXNzIGFuIGlkIG9yIGEgY2xhc3MifQp2YXIgJHRhcmdldD0nJzt0aGlzLnByZXZNYXg9MTtpZigkdGFyZ2V0Q2xhc3MpeyR0YXJnZXQ9Ii4iKyR0YXJnZXRDbGFzc31lbHNleyR0YXJnZXQ9IiMiKyR0YXJnZXRJZH0KdmFyICR0YWcxPSRzZWFyY2hUYWcudG9Mb3dlckNhc2UoKTt2YXIgJHRhZzI9JHNlYXJjaFRhZy50b1VwcGVyQ2FzZSgpO3RoaXMuY29scz0kKCR0YXJnZXQpO2lmKHRoaXMuZGVidWcpe2NvbnNvbGUubG9nKCJUaGVyZSBhcmUgIit0aGlzLmNvbHMubGVuZ3RoKyIgaXRlbXMsIGxvb2tpbmcgZm9yICIrJHRhZzEpfQp0aGlzLmJlZm9yZT0kKHRoaXMuY29sc1swXSkuZmluZCgkdGFnMSsnOmxhc3QnKTt0aGlzLnByZXZNYXg9dGhpcy5iZWZvcmUuY2hpbGRyZW4oKS5sZW5ndGg7Zm9yKHRoaXMub2Zmc2V0PTE7dGhpcy5vZmZzZXQ8dGhpcy5jb2xzLmxlbmd0aDt0aGlzLm9mZnNldCsrKXtpZih0aGlzLmRlYnVnKXtjb25zb2xlLmxvZygiaXRlcmF0aW5nICIrdGhpcy5vZmZzZXQrIi4uLltvZiAiK3RoaXMuY29scy5sZW5ndGgrIl0iKX0KaWYodGhpcy5vZmZzZXQlJGNvbG5vPT0wKXtpZih0aGlzLmRlYnVnKXtjb25zb2xlLmxvZygiRmlyc3QgY29sdW1uIChpbiB0aGVvcnkuLikiKX0KdGhpcy5wcmV2TWF4PTE7Y29udGludWV9CnRoaXMuYmVmb3JlPSQodGhpcy5jb2xzW3RoaXMub2Zmc2V0LTFdKS5maW5kKCR0YWcxKyc6bGFzdCcpO2lmKHRoaXMuYmVmb3JlLmxlbmd0aCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coIkhhdmUgc29tZSAiKyRzZWFyY2hUYWcrIiBlbGVtZW50cyBpbiB0aGUgcHJldmlvdXMgY29sdW1uIil9CnZhciAkbGlzdD0kKHRoaXMuY29sc1t0aGlzLm9mZnNldF0pLmZpbmQoJHRhZzErJzpmaXJzdCcpO3ZhciAkZmlyc3Q9JCh0aGlzLmNvbHNbdGhpcy5vZmZzZXRdKS5maW5kKCcqOmZpcnN0Jyk7aWYoJGZpcnN0WzBdIT09JGxpc3RbMF0pe2NvbnRpbnVlfQp2YXIgJHBhcmVudHM9dGhpcy5iZWZvcmUucGFyZW50cygpO3RoaXMubGFzdE90aGVyPTA7dmFyICRmb3VuZD0hMTtmb3IoO3RoaXMubGFzdE90aGVyPCRwYXJlbnRzLmxlbmd0aDt0aGlzLmxhc3RPdGhlcisrKXtpZigkcGFyZW50c1t0aGlzLmxhc3RPdGhlcl0udGFnTmFtZSE9JHRhZzImJiRwYXJlbnRzW3RoaXMubGFzdE90aGVyXS50YWdOYW1lIT0iTEkiKXskZm91bmQ9ITA7dGhpcy5sYXN0T3RoZXItLTticmVha319CnRoaXMubmVzdD0xO2lmKCQodGhpcy5jb2xzW3RoaXMub2Zmc2V0XSkuZmluZCgiPiIrJHRhZzErJzpmaXJzdCBsaSAnKyR0YWcxKyI6Zmlyc3QiKS5sZW5ndGgpe3RoaXMubmVzdD0yfQp0aGlzLnNldExpc3QodGhpcy5jb2xzLCRsaXN0LCR0YWcxKTt0aGlzLmxhc3RPdGhlci0tOyRsaXN0PSQodGhpcy5jb2xzW3RoaXMub2Zmc2V0XSkuZmluZCgkdGFnMSsnOmZpcnN0IGxpICcrJHRhZzErIjpmaXJzdCIpO2lmKCRsaXN0Lmxlbmd0aCl7dGhpcy5iZWZvcmU9JCh0aGlzLmNvbHNbdGhpcy5vZmZzZXQtMV0pLmZpbmQoIj4iKyR0YWcxKyc6bGFzdCBsaSAnKyR0YWcxKyI6bGFzdCIpO3RoaXMucHJldk1heD0wO3RoaXMubmVzdD0xO3RoaXMuc2V0TGlzdCh0aGlzLmNvbHMsJGxpc3QsJHRhZzEpfQp2YXIgJHJlc2V0PSQodGhpcy5jb2xzW3RoaXMub2Zmc2V0LTFdKS5maW5kKCI+IiskdGFnMSsnOmxhc3QnKTt0aGlzLnByZXZNYXg9JHJlc2V0LmNoaWxkcmVuKCkubGVuZ3RofX0KcmV0dXJuIDB9fSkoalF1ZXJ5KTshZnVuY3Rpb24oYSl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiXSxmdW5jdGlvbihiKXtyZXR1cm4gYShiKX0pOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEocmVxdWlyZSgianF1ZXJ5IikpOmEod2luZG93LmpRdWVyeSl9KGZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGEpe3ZvaWQgMD09PWEmJihhPXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSxhPWEudG9Mb3dlckNhc2UoKTt2YXIgYj0vKGVkZ2UpXC8oW1x3Ll0rKS8uZXhlYyhhKXx8LyhvcHIpW1wvXShbXHcuXSspLy5leGVjKGEpfHwvKGNocm9tZSlbIFwvXShbXHcuXSspLy5leGVjKGEpfHwvKGllbW9iaWxlKVtcL10oW1x3Ll0rKS8uZXhlYyhhKXx8Lyh2ZXJzaW9uKShhcHBsZXdlYmtpdClbIFwvXShbXHcuXSspLiooc2FmYXJpKVsgXC9dKFtcdy5dKykvLmV4ZWMoYSl8fC8od2Via2l0KVsgXC9dKFtcdy5dKykuKih2ZXJzaW9uKVsgXC9dKFtcdy5dKykuKihzYWZhcmkpWyBcL10oW1x3Ll0rKS8uZXhlYyhhKXx8Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8uZXhlYyhhKXx8LyhvcGVyYSkoPzouKnZlcnNpb258KVsgXC9dKFtcdy5dKykvLmV4ZWMoYSl8fC8obXNpZSkgKFtcdy5dKykvLmV4ZWMoYSl8fGEuaW5kZXhPZigidHJpZGVudCIpPj0wJiYvKHJ2KSg/Ojp8ICkoW1x3Ll0rKS8uZXhlYyhhKXx8YS5pbmRleE9mKCJjb21wYXRpYmxlIik8MCYmLyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKXwpLy5leGVjKGEpfHxbXSxjPS8oaXBhZCkvLmV4ZWMoYSl8fC8oaXBvZCkvLmV4ZWMoYSl8fC8od2luZG93cyBwaG9uZSkvLmV4ZWMoYSl8fC8oaXBob25lKS8uZXhlYyhhKXx8LyhraW5kbGUpLy5leGVjKGEpfHwvKHNpbGspLy5leGVjKGEpfHwvKGFuZHJvaWQpLy5leGVjKGEpfHwvKHdpbikvLmV4ZWMoYSl8fC8obWFjKS8uZXhlYyhhKXx8LyhsaW51eCkvLmV4ZWMoYSl8fC8oY3JvcykvLmV4ZWMoYSl8fC8ocGxheWJvb2spLy5leGVjKGEpfHwvKGJiKS8uZXhlYyhhKXx8LyhibGFja2JlcnJ5KS8uZXhlYyhhKXx8W10sZD17fSxlPXticm93c2VyOmJbNV18fGJbM118fGJbMV18fCIiLHZlcnNpb246YlsyXXx8Yls0XXx8IjAiLHZlcnNpb25OdW1iZXI6Yls0XXx8YlsyXXx8IjAiLHBsYXRmb3JtOmNbMF18fCIifTtpZihlLmJyb3dzZXImJihkW2UuYnJvd3Nlcl09ITAsZC52ZXJzaW9uPWUudmVyc2lvbixkLnZlcnNpb25OdW1iZXI9cGFyc2VJbnQoZS52ZXJzaW9uTnVtYmVyLDEwKSksZS5wbGF0Zm9ybSYmKGRbZS5wbGF0Zm9ybV09ITApLChkLmFuZHJvaWR8fGQuYmJ8fGQuYmxhY2tiZXJyeXx8ZC5pcGFkfHxkLmlwaG9uZXx8ZC5pcG9kfHxkLmtpbmRsZXx8ZC5wbGF5Ym9va3x8ZC5zaWxrfHxkWyJ3aW5kb3dzIHBob25lIl0pJiYoZC5tb2JpbGU9ITApLChkLmNyb3N8fGQubWFjfHxkLmxpbnV4fHxkLndpbikmJihkLmRlc2t0b3A9ITApLChkLmNocm9tZXx8ZC5vcHJ8fGQuc2FmYXJpKSYmKGQud2Via2l0PSEwKSxkLnJ2fHxkLmllbW9iaWxlKXt2YXIgZj0ibXNpZSI7ZS5icm93c2VyPWYsZFtmXT0hMH1pZihkLmVkZ2Upe2RlbGV0ZSBkLmVkZ2U7dmFyIGc9Im1zZWRnZSI7ZS5icm93c2VyPWcsZFtnXT0hMH1pZihkLnNhZmFyaSYmZC5ibGFja2JlcnJ5KXt2YXIgaD0iYmxhY2tiZXJyeSI7ZS5icm93c2VyPWgsZFtoXT0hMH1pZihkLnNhZmFyaSYmZC5wbGF5Ym9vayl7dmFyIGk9InBsYXlib29rIjtlLmJyb3dzZXI9aSxkW2ldPSEwfWlmKGQuYmIpe3ZhciBqPSJibGFja2JlcnJ5IjtlLmJyb3dzZXI9aixkW2pdPSEwfWlmKGQub3ByKXt2YXIgaz0ib3BlcmEiO2UuYnJvd3Nlcj1rLGRba109ITB9aWYoZC5zYWZhcmkmJmQuYW5kcm9pZCl7dmFyIGw9ImFuZHJvaWQiO2UuYnJvd3Nlcj1sLGRbbF09ITB9aWYoZC5zYWZhcmkmJmQua2luZGxlKXt2YXIgbT0ia2luZGxlIjtlLmJyb3dzZXI9bSxkW21dPSEwfWlmKGQuc2FmYXJpJiZkLnNpbGspe3ZhciBuPSJzaWxrIjtlLmJyb3dzZXI9bixkW25dPSEwfXJldHVybiBkLm5hbWU9ZS5icm93c2VyLGQucGxhdGZvcm09ZS5wbGF0Zm9ybSxkfXJldHVybiB3aW5kb3cualFCcm93c2VyPWIod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy5qUUJyb3dzZXIudWFNYXRjaD1iLGEmJihhLmJyb3dzZXI9d2luZG93LmpRQnJvd3Nlciksd2luZG93LmpRQnJvd3Nlcn0pOyhmdW5jdGlvbigkKXskLmZuLmV4dGVuZCh7YnhHYWxsZXJ5OmZ1bmN0aW9uKG9wdGlvbnMpe3ZhciBkZWZhdWx0cz17bWF4d2lkdGg6JycsbWF4aGVpZ2h0OicnLHRodW1id2lkdGg6MjAwLHRodW1iY3JvcDohMSxjcm9wcGVyY2VudDouMzUsdGh1bWJwbGFjZW1lbnQ6J2JvdHRvbScsdGh1bWJjb250YWluZXI6Jycsb3BhY2l0eTouNyxsb2FkX3RleHQ6JycsbG9hZF9pbWFnZTonaHR0cDovL2kzMDIucGhvdG9idWNrZXQuY29tL2FsYnVtcy9ubjkyL3dhbmRvbGVkemVwL3NwaW5uZXIuZ2lmJyx3cmFwcGVyY2xhc3M6J291dGVyJ30KdmFyIG9wdGlvbnM9JC5leHRlbmQoZGVmYXVsdHMsb3B0aW9ucyk7dmFyIG89b3B0aW9uczt2YXIgY29udD0nJzt2YXIgY2FwdGlvbj0nJzt2YXIgY2FwdGlvbkV4dHJhPTEwO3ZhciAkb3V0ZXI9Jyc7dmFyICRvcmlnPXRoaXM7dmFyIHRhbGw9MDt2YXIgd2lkZT0wO3ZhciBzaG93aW5nPTA7dmFyIGk9MDt2YXIgaz0kb3JpZy5maW5kKCdhIGltZycpLnNpemUoKTt2YXIgY3VycmVudDtwcmVsb2FkX2ltZygpO2Z1bmN0aW9uIHByZWxvYWRfaW1nKCl7JG9yaWcuaGlkZSgpO2lmKG8ubG9hZF90ZXh0IT0nJyl7JG9yaWcuYmVmb3JlKCc8ZGl2IGlkPSJsb2FkaW5nIj4nK28ubG9hZF90ZXh0Kyc8L2Rpdj4nKX1lbHNleyRvcmlnLmJlZm9yZSgnPGRpdiBpZD0ibG9hZGluZyI+PGltZyBzcmM9Iicrby5sb2FkX2ltYWdlKyciIC8+PC9kaXY+Jyl9CiRvcmlnLnBhcmVudCgpLmZpbmQoJyNsb2FkaW5nJykuY3NzKHsndGV4dEFsaWduJzonY2VudGVyJywnd2lkdGgnOm8ubWF4d2lkdGh9KTskb3JpZy5maW5kKCdhIGltZycpLmVhY2goZnVuY3Rpb24oKXt2YXIgdGhlX3NvdXJjZT0kKHRoaXMpLmF0dHIoJ3NyYycpO3ZhciB0aGVfaW1nPW5ldyBJbWFnZSgpO3RoZV9pbWcub25sb2FkPWZ1bmN0aW9uKCl7cHJlbG9hZF9jaGVjaygpfTt0aGVfaW1nLnNyYz10aGVfc291cmNlfSl9CmZ1bmN0aW9uIHByZWxvYWRfY2hlY2soKXtpKys7aWYoaT09ayl7aW5pdCgpfX0KZnVuY3Rpb24gaW5pdCgpe3NldF9sYXlvdXQoKTtzZXRfbWFpbl9pbWcoKTtwbGFjZV90aHVtYmNvbnRhaW5lcigpO3NldF90aHVtYnMoKX0KZnVuY3Rpb24gc2V0X2xheW91dCgpeyRvcmlnLnBhcmVudCgpLmZpbmQoJyNsb2FkaW5nJykuaGlkZSgpOyRvcmlnLnNob3coKTskb3JpZy53cmFwKCc8ZGl2IGNsYXNzPSInK28ud3JhcHBlcmNsYXNzKyciPjwvZGl2PicpOyRvdXRlcj0kb3JpZy5wYXJlbnQoKTskb3JpZy5maW5kKCdsaScpLmNzcyh7J3Bvc2l0aW9uJzonYWJzb2x1dGUnfSl9CmZ1bmN0aW9uIHNldF9tYWluX2ltZygpeyRvcmlnLmZpbmQoJ2EgaW1nJykuZWFjaChmdW5jdGlvbigpe3ZhciAkdGhpcz0kKHRoaXMpO3ZhciAkaW1naGVpZ2h0PSR0aGlzLmhlaWdodCgpO3ZhciAkaW1nd2lkdGg9JHRoaXMud2lkdGgoKTtpZigkdGhpcy5wcm9wKCd0aXRsZScpIT0nJyl7Y2FwdGlvbj0kdGhpcy5wcm9wKCd0aXRsZScpOyR0aGlzLnBhcmVudCgpLmFwcGVuZCgnPGRpdiBjbGFzcz0iY2FwdGlvbiI+JytjYXB0aW9uKyc8L2Rpdj4nKX0KaWYoby5tYXh3aWR0aCE9Jycpe2lmKCR0aGlzLndpZHRoKCk+by5tYXh3aWR0aCl7JHRoaXMud2lkdGgoby5tYXh3aWR0aCk7JHRoaXMuaGVpZ2h0KCgkaW1naGVpZ2h0LyRpbWd3aWR0aCkqby5tYXh3aWR0aCl9fQppZihvLm1heGhlaWdodCE9Jycpe2lmKCR0aGlzLmhlaWdodCgpPm8ubWF4aGVpZ2h0KXskdGhpcy5oZWlnaHQoby5tYXhoZWlnaHQpOyR0aGlzLndpZHRoKCgkaW1nd2lkdGgvJGltZ2hlaWdodCkqby5tYXhoZWlnaHQpfX0KdmFyIGNhcHRpb25oZWlnaHQ9MDtpZigkdGhpcy5wYXJlbnQoKS5maW5kKCcuY2FwdGlvbicpLmhlaWdodCgpPjApe2NhcHRpb25oZWlnaHQ9JHRoaXMucGFyZW50KCkuZmluZCgnLmNhcHRpb24nKS5oZWlnaHQoKStjYXB0aW9uRXh0cmF9CmlmKCR0aGlzLmhlaWdodCgpK2NhcHRpb25oZWlnaHQ+dGFsbCl7dGFsbD0kdGhpcy5oZWlnaHQoKStjYXB0aW9uaGVpZ2h0fQppZigkdGhpcy53aWR0aCgpPndpZGUpe3dpZGU9JHRoaXMud2lkdGgoKX0KY29udCs9JzxsaT48aW1nIHNyYz0iJyskdGhpcy5wcm9wKCdzcmMnKSsnIiAvPjwvbGk+J30pOyRvcmlnLmZpbmQoJ2xpOm5vdCg6Zmlyc3QpJykuaGlkZSgpOyRvcmlnLmhlaWdodCh0YWxsKTskb3JpZy53aWR0aCh3aWRlKTskb3V0ZXIuZmluZCgnLmNhcHRpb24nKS53aWR0aCh3aWRlKX0KZnVuY3Rpb24gcGxhY2VfdGh1bWJjb250YWluZXIoKXtpZihvLnRodW1icGxhY2VtZW50PT0ndG9wJyl7JG91dGVyLnByZXBlbmQoJzx1bCBjbGFzcz0idGh1bWJzIj4nK2NvbnQrJzwvdWw+Jyk7JG91dGVyLmZpbmQoJy50aHVtYnMnKS5jc3MoeydvdmVyZmxvdyc6J2F1dG8nfSl9ZWxzZSBpZihvLnRodW1icGxhY2VtZW50PT0nbGVmdCcpeyRvdXRlci5wcmVwZW5kKCc8dWwgY2xhc3M9InRodW1icyI+Jytjb250Kyc8L3VsPicpOyRvcmlnLmNzcyh7J2Zsb2F0JzonbGVmdCd9KTskb3V0ZXIuZmluZCgnLnRodW1icycpLmNzcyh7J2Zsb2F0JzonbGVmdCd9KX1lbHNlIGlmKG8udGh1bWJwbGFjZW1lbnQ9PSdib3R0b20nKXskb3V0ZXIuYXBwZW5kKCc8dWwgY2xhc3M9InRodW1icyI+Jytjb250Kyc8L3VsPicpfWVsc2UgaWYoby50aHVtYnBsYWNlbWVudD09J3JpZ2h0Jyl7JG91dGVyLmFwcGVuZCgnPHVsIGNsYXNzPSJ0aHVtYnMiPicrY29udCsnPC91bD4nKTskb3JpZy5jc3MoeydmbG9hdCc6J2xlZnQnfSk7JG91dGVyLmZpbmQoJy50aHVtYnMnKS5jc3MoeydmbG9hdCc6J2xlZnQnfSl9CiRvdXRlci5hcHBlbmQoJzxkaXYgc3R5bGU9ImNsZWFyOmJvdGgiPjwvZGl2PicpO2lmKG8udGh1bWJjb250YWluZXIhPScnKXskb3V0ZXIuZmluZCgnLnRodW1icycpLndpZHRoKG8udGh1bWJjb250YWluZXIpfX0KZnVuY3Rpb24gc2V0X3RodW1icygpeyRvdXRlci5maW5kKCcudGh1bWJzIGxpJykuZWFjaChmdW5jdGlvbigpe3ZhciAkdGhpcz0kKHRoaXMpO3ZhciAkaW1nPSR0aGlzLmZpbmQoJ2ltZycpO3ZhciAkaW1nd2lkdGg9JGltZy53aWR0aCgpO3ZhciAkaW1naGVpZ2h0PSRpbWcuaGVpZ2h0KCk7aWYoby50aHVtYmNyb3ApeyRpbWcud2lkdGgoJGltZ3dpZHRoKm8uY3JvcHBlcmNlbnQpOyRpbWcuaGVpZ2h0KCgkaW1naGVpZ2h0LyRpbWd3aWR0aCkqJGltZy53aWR0aCgpKTskdGhpcy5jc3MoeydmbG9hdCc6J2xlZnQnLCd3aWR0aCc6by50aHVtYndpZHRoLCdoZWlnaHQnOm8udGh1bWJ3aWR0aCwnb3ZlcmZsb3cnOidoaWRkZW4nLCdjdXJzb3InOidwb2ludGVyJ30pfWVsc2V7JGltZy53aWR0aChvLnRodW1id2lkdGgpOyRpbWcuaGVpZ2h0KCgkaW1naGVpZ2h0LyRpbWd3aWR0aCkqby50aHVtYndpZHRoKTskdGhpcy5jc3MoeydmbG9hdCc6J2xlZnQnLCdjdXJzb3InOidwb2ludGVyJ30pOyR0aGlzLmhlaWdodCgkaW1nLmhlaWdodCgpKX0KJHRoaXMuY2xpY2soZnVuY3Rpb24oKXt2YXIgeD0kb3V0ZXIuZmluZCgnLnRodW1icyBsaScpLmluZGV4KCR0aGlzKTtpZihzaG93aW5nIT14KXskb3JpZy5maW5kKCdsaScpLmZhZGVPdXQoKTskb3JpZy5maW5kKCdsaScpLmVxKHgpLmZhZGVJbigpO3Nob3dpbmc9eH19KX0pO3ZhciAkdGh1bWI9JG91dGVyLmZpbmQoJy50aHVtYnMgbGknKTskdGh1bWIuZXEoMCkuYWRkQ2xhc3MoJ29uJyk7JHRodW1iLm5vdCgnLm9uJykuZmFkZVRvKDAsby5vcGFjaXR5KTskdGh1bWIuY2xpY2soZnVuY3Rpb24oKXt2YXIgdD0kKHRoaXMpO3ZhciBpPSR0aHVtYi5pbmRleCh0aGlzKTtpZihjdXJyZW50IT1pKXskdGh1bWIucmVtb3ZlQ2xhc3MoJ29uJyk7dC5hZGRDbGFzcygnb24nKTskdGh1bWIubm90KCcub24nKS5mYWRlVG8oMjAwLG8ub3BhY2l0eSk7Y3VycmVudD1pfX0pLmhvdmVyKGZ1bmN0aW9uKCl7JCh0aGlzKS5zdG9wKCkuZmFkZVRvKDIwMCwxKTskKHRoaXMpLmNsaWNrKCl9LGZ1bmN0aW9uKCl7JCh0aGlzKS5ub3QoJy5vbicpLnN0b3AoKS5mYWRlVG8oMjAwLG8ub3BhY2l0eSl9KX19fSl9KShqUXVlcnkpOyhmdW5jdGlvbigkLGRvY3VtZW50LHdpbmRvdyl7dmFyCmRlZmF1bHRzPXtodG1sOiExLHBob3RvOiExLGlmcmFtZTohMSxpbmxpbmU6ITEsdHJhbnNpdGlvbjoiZWxhc3RpYyIsc3BlZWQ6MzAwLGZhZGVPdXQ6MzAwLHdpZHRoOiExLGluaXRpYWxXaWR0aDoiNjAwIixpbm5lcldpZHRoOiExLG1heFdpZHRoOiExLGhlaWdodDohMSxpbml0aWFsSGVpZ2h0OiI0NTAiLGlubmVySGVpZ2h0OiExLG1heEhlaWdodDohMSxzY2FsZVBob3RvczohMCxzY3JvbGxpbmc6ITAsaHJlZjohMSx0aXRsZTohMSxyZWw6ITEsb3BhY2l0eTowLjkscHJlbG9hZGluZzohMCxjbGFzc05hbWU6ITEsb3ZlcmxheUNsb3NlOiEwLGVzY0tleTohMCxhcnJvd0tleTohMCx0b3A6ITEsYm90dG9tOiExLGxlZnQ6ITEscmlnaHQ6ITEsZml4ZWQ6ITEsZGF0YTp1bmRlZmluZWQsY2xvc2VCdXR0b246ITAsZmFzdElmcmFtZTohMCxvcGVuOiExLHJlcG9zaXRpb246ITAsbG9vcDohMCxzbGlkZXNob3c6ITEsc2xpZGVzaG93QXV0bzohMCxzbGlkZXNob3dTcGVlZDoyNTAwLHNsaWRlc2hvd1N0YXJ0OiJzdGFydCBzbGlkZXNob3ciLHNsaWRlc2hvd1N0b3A6InN0b3Agc2xpZGVzaG93IixwaG90b1JlZ2V4Oi9cLihnaWZ8cG5nfGpwKGV8Z3xlZyl8Ym1wfGljb3x3ZWJwKSgoI3xcPykuKik/JC9pLHJldGluYUltYWdlOiExLHJldGluYVVybDohMSxyZXRpbmFTdWZmaXg6J0AyeC4kMScsY3VycmVudDoiaW1hZ2Uge2N1cnJlbnR9IG9mIHt0b3RhbH0iLHByZXZpb3VzOiJwcmV2aW91cyIsbmV4dDoibmV4dCIsY2xvc2U6ImNsb3NlIix4aHJFcnJvcjoiVGhpcyBjb250ZW50IGZhaWxlZCB0byBsb2FkLiIsaW1nRXJyb3I6IlRoaXMgaW1hZ2UgZmFpbGVkIHRvIGxvYWQuIixyZXR1cm5Gb2N1czohMCx0cmFwRm9jdXM6ITAsb25PcGVuOiExLG9uTG9hZDohMSxvbkNvbXBsZXRlOiExLG9uQ2xlYW51cDohMSxvbkNsb3NlZDohMX0sY29sb3Jib3g9J2NvbG9yYm94JyxwcmVmaXg9J2Nib3gnLGJveEVsZW1lbnQ9cHJlZml4KydFbGVtZW50JyxldmVudF9vcGVuPXByZWZpeCsnX29wZW4nLGV2ZW50X2xvYWQ9cHJlZml4KydfbG9hZCcsZXZlbnRfY29tcGxldGU9cHJlZml4KydfY29tcGxldGUnLGV2ZW50X2NsZWFudXA9cHJlZml4KydfY2xlYW51cCcsZXZlbnRfY2xvc2VkPXByZWZpeCsnX2Nsb3NlZCcsZXZlbnRfcHVyZ2U9cHJlZml4KydfcHVyZ2UnLCRvdmVybGF5LCRib3gsJHdyYXAsJGNvbnRlbnQsJHRvcEJvcmRlciwkbGVmdEJvcmRlciwkcmlnaHRCb3JkZXIsJGJvdHRvbUJvcmRlciwkcmVsYXRlZCwkd2luZG93LCRsb2FkZWQsJGxvYWRpbmdCYXksJGxvYWRpbmdPdmVybGF5LCR0aXRsZSwkY3VycmVudCwkc2xpZGVzaG93LCRuZXh0LCRwcmV2LCRjbG9zZSwkZ3JvdXBDb250cm9scywkZXZlbnRzPSQoJzxhLz4nKSxzZXR0aW5ncyxpbnRlcmZhY2VIZWlnaHQsaW50ZXJmYWNlV2lkdGgsbG9hZGVkSGVpZ2h0LGxvYWRlZFdpZHRoLGVsZW1lbnQsaW5kZXgscGhvdG8sb3BlbixhY3RpdmUsY2xvc2luZyxsb2FkaW5nVGltZXIscHVibGljTWV0aG9kLGRpdj0iZGl2IixjbGFzc05hbWUscmVxdWVzdHM9MCxwcmV2aW91c0NTUz17fSxpbml0O2Z1bmN0aW9uICR0YWcodGFnLGlkLGNzcyl7dmFyIGVsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO2lmKGlkKXtlbGVtZW50LmlkPXByZWZpeCtpZH0KaWYoY3NzKXtlbGVtZW50LnN0eWxlLmNzc1RleHQ9Y3NzfQpyZXR1cm4gJChlbGVtZW50KX0KZnVuY3Rpb24gd2luaGVpZ2h0KCl7cmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodD93aW5kb3cuaW5uZXJIZWlnaHQ6JCh3aW5kb3cpLmhlaWdodCgpfQpmdW5jdGlvbiBnZXRJbmRleChpbmNyZW1lbnQpe3ZhcgptYXg9JHJlbGF0ZWQubGVuZ3RoLG5ld0luZGV4PShpbmRleCtpbmNyZW1lbnQpJW1heDtyZXR1cm4obmV3SW5kZXg8MCk/bWF4K25ld0luZGV4Om5ld0luZGV4fQpmdW5jdGlvbiBzZXRTaXplKHNpemUsZGltZW5zaW9uKXtyZXR1cm4gTWF0aC5yb3VuZCgoLyUvLnRlc3Qoc2l6ZSk/KChkaW1lbnNpb249PT0neCc/JHdpbmRvdy53aWR0aCgpOndpbmhlaWdodCgpKS8xMDApOjEpKnBhcnNlSW50KHNpemUsMTApKX0KZnVuY3Rpb24gaXNJbWFnZShzZXR0aW5ncyx1cmwpe3JldHVybiBzZXR0aW5ncy5waG90b3x8c2V0dGluZ3MucGhvdG9SZWdleC50ZXN0KHVybCl9CmZ1bmN0aW9uIHJldGluYVVybChzZXR0aW5ncyx1cmwpe3JldHVybiBzZXR0aW5ncy5yZXRpbmFVcmwmJndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvPjE/dXJsLnJlcGxhY2Uoc2V0dGluZ3MucGhvdG9SZWdleCxzZXR0aW5ncy5yZXRpbmFTdWZmaXgpOnVybH0KZnVuY3Rpb24gdHJhcEZvY3VzKGUpe2lmKCdjb250YWlucycgaW4gJGJveFswXSYmISRib3hbMF0uY29udGFpbnMoZS50YXJnZXQpKXtlLnN0b3BQcm9wYWdhdGlvbigpOyRib3guZm9jdXMoKX19CmZ1bmN0aW9uIG1ha2VTZXR0aW5ncygpe3ZhciBpLGRhdGE9JC5kYXRhKGVsZW1lbnQsY29sb3Jib3gpO2lmKGRhdGE9PW51bGwpe3NldHRpbmdzPSQuZXh0ZW5kKHt9LGRlZmF1bHRzKTtpZihjb25zb2xlJiZjb25zb2xlLmxvZyl7Y29uc29sZS5sb2coJ0Vycm9yOiBjYm94RWxlbWVudCBtaXNzaW5nIHNldHRpbmdzIG9iamVjdCcpfX1lbHNle3NldHRpbmdzPSQuZXh0ZW5kKHt9LGRhdGEpfQpmb3IoaSBpbiBzZXR0aW5ncyl7aWYoJC5pc0Z1bmN0aW9uKHNldHRpbmdzW2ldKSYmaS5zbGljZSgwLDIpIT09J29uJyl7c2V0dGluZ3NbaV09c2V0dGluZ3NbaV0uY2FsbChlbGVtZW50KX19CnNldHRpbmdzLnJlbD1zZXR0aW5ncy5yZWx8fGVsZW1lbnQucmVsfHwkKGVsZW1lbnQpLmRhdGEoJ3JlbCcpfHwnbm9mb2xsb3cnO3NldHRpbmdzLmhyZWY9c2V0dGluZ3MuaHJlZnx8JChlbGVtZW50KS5hdHRyKCdocmVmJyk7c2V0dGluZ3MudGl0bGU9c2V0dGluZ3MudGl0bGV8fGVsZW1lbnQudGl0bGU7aWYodHlwZW9mIHNldHRpbmdzLmhyZWY9PT0ic3RyaW5nIil7c2V0dGluZ3MuaHJlZj0kLnRyaW0oc2V0dGluZ3MuaHJlZil9fQpmdW5jdGlvbiB0cmlnZ2VyKGV2ZW50LGNhbGxiYWNrKXskKGRvY3VtZW50KS50cmlnZ2VyKGV2ZW50KTskZXZlbnRzLnRyaWdnZXJIYW5kbGVyKGV2ZW50KTtpZigkLmlzRnVuY3Rpb24oY2FsbGJhY2spKXtjYWxsYmFjay5jYWxsKGVsZW1lbnQpfX0KdmFyIHNsaWRlc2hvdz0oZnVuY3Rpb24oKXt2YXIgYWN0aXZlLGNsYXNzTmFtZT1wcmVmaXgrIlNsaWRlc2hvd18iLGNsaWNrPSJjbGljay4iK3ByZWZpeCx0aW1lT3V0O2Z1bmN0aW9uIGNsZWFyKCl7Y2xlYXJUaW1lb3V0KHRpbWVPdXQpfQpmdW5jdGlvbiBzZXQoKXtpZihzZXR0aW5ncy5sb29wfHwkcmVsYXRlZFtpbmRleCsxXSl7Y2xlYXIoKTt0aW1lT3V0PXNldFRpbWVvdXQocHVibGljTWV0aG9kLm5leHQsc2V0dGluZ3Muc2xpZGVzaG93U3BlZWQpfX0KZnVuY3Rpb24gc3RhcnQoKXskc2xpZGVzaG93Lmh0bWwoc2V0dGluZ3Muc2xpZGVzaG93U3RvcCkudW5iaW5kKGNsaWNrKS5vbmUoY2xpY2ssc3RvcCk7JGV2ZW50cy5iaW5kKGV2ZW50X2NvbXBsZXRlLHNldCkuYmluZChldmVudF9sb2FkLGNsZWFyKTskYm94LnJlbW92ZUNsYXNzKGNsYXNzTmFtZSsib2ZmIikuYWRkQ2xhc3MoY2xhc3NOYW1lKyJvbiIpfQpmdW5jdGlvbiBzdG9wKCl7Y2xlYXIoKTskZXZlbnRzLnVuYmluZChldmVudF9jb21wbGV0ZSxzZXQpLnVuYmluZChldmVudF9sb2FkLGNsZWFyKTskc2xpZGVzaG93Lmh0bWwoc2V0dGluZ3Muc2xpZGVzaG93U3RhcnQpLnVuYmluZChjbGljaykub25lKGNsaWNrLGZ1bmN0aW9uKCl7cHVibGljTWV0aG9kLm5leHQoKTtzdGFydCgpfSk7JGJveC5yZW1vdmVDbGFzcyhjbGFzc05hbWUrIm9uIikuYWRkQ2xhc3MoY2xhc3NOYW1lKyJvZmYiKX0KZnVuY3Rpb24gcmVzZXQoKXthY3RpdmU9ITE7JHNsaWRlc2hvdy5oaWRlKCk7Y2xlYXIoKTskZXZlbnRzLnVuYmluZChldmVudF9jb21wbGV0ZSxzZXQpLnVuYmluZChldmVudF9sb2FkLGNsZWFyKTskYm94LnJlbW92ZUNsYXNzKGNsYXNzTmFtZSsib2ZmICIrY2xhc3NOYW1lKyJvbiIpfQpyZXR1cm4gZnVuY3Rpb24oKXtpZihhY3RpdmUpe2lmKCFzZXR0aW5ncy5zbGlkZXNob3cpeyRldmVudHMudW5iaW5kKGV2ZW50X2NsZWFudXAscmVzZXQpO3Jlc2V0KCl9fWVsc2V7aWYoc2V0dGluZ3Muc2xpZGVzaG93JiYkcmVsYXRlZFsxXSl7YWN0aXZlPSEwOyRldmVudHMub25lKGV2ZW50X2NsZWFudXAscmVzZXQpO2lmKHNldHRpbmdzLnNsaWRlc2hvd0F1dG8pe3N0YXJ0KCl9ZWxzZXtzdG9wKCl9CiRzbGlkZXNob3cuc2hvdygpfX19fSgpKTtmdW5jdGlvbiBsYXVuY2godGFyZ2V0KXtpZighY2xvc2luZyl7ZWxlbWVudD10YXJnZXQ7bWFrZVNldHRpbmdzKCk7JHJlbGF0ZWQ9JChlbGVtZW50KTtpbmRleD0wO2lmKHNldHRpbmdzLnJlbCE9PSdub2ZvbGxvdycpeyRyZWxhdGVkPSQoJy4nK2JveEVsZW1lbnQpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBkYXRhPSQuZGF0YSh0aGlzLGNvbG9yYm94KSxyZWxSZWxhdGVkO2lmKGRhdGEpe3JlbFJlbGF0ZWQ9JCh0aGlzKS5kYXRhKCdyZWwnKXx8ZGF0YS5yZWx8fHRoaXMucmVsfQpyZXR1cm4ocmVsUmVsYXRlZD09PXNldHRpbmdzLnJlbCl9KTtpbmRleD0kcmVsYXRlZC5pbmRleChlbGVtZW50KTtpZihpbmRleD09PS0xKXskcmVsYXRlZD0kcmVsYXRlZC5hZGQoZWxlbWVudCk7aW5kZXg9JHJlbGF0ZWQubGVuZ3RoLTF9fQokb3ZlcmxheS5jc3Moe29wYWNpdHk6cGFyc2VGbG9hdChzZXR0aW5ncy5vcGFjaXR5KSxjdXJzb3I6c2V0dGluZ3Mub3ZlcmxheUNsb3NlPyJwb2ludGVyIjoiYXV0byIsdmlzaWJpbGl0eTondmlzaWJsZSd9KS5zaG93KCk7aWYoY2xhc3NOYW1lKXskYm94LmFkZCgkb3ZlcmxheSkucmVtb3ZlQ2xhc3MoY2xhc3NOYW1lKX0KaWYoc2V0dGluZ3MuY2xhc3NOYW1lKXskYm94LmFkZCgkb3ZlcmxheSkuYWRkQ2xhc3Moc2V0dGluZ3MuY2xhc3NOYW1lKX0KY2xhc3NOYW1lPXNldHRpbmdzLmNsYXNzTmFtZTtpZihzZXR0aW5ncy5jbG9zZUJ1dHRvbil7JGNsb3NlLmh0bWwoc2V0dGluZ3MuY2xvc2UpLmFwcGVuZFRvKCRjb250ZW50KX1lbHNleyRjbG9zZS5hcHBlbmRUbygnPGRpdi8+Jyl9CmlmKCFvcGVuKXtvcGVuPWFjdGl2ZT0hMDskYm94LmNzcyh7dmlzaWJpbGl0eTonaGlkZGVuJyxkaXNwbGF5OidibG9jayd9KTskbG9hZGVkPSR0YWcoZGl2LCdMb2FkZWRDb250ZW50Jywnd2lkdGg6MDsgaGVpZ2h0OjA7IG92ZXJmbG93OmhpZGRlbicpOyRjb250ZW50LmNzcyh7d2lkdGg6JycsaGVpZ2h0OicnfSkuYXBwZW5kKCRsb2FkZWQpO2ludGVyZmFjZUhlaWdodD0kdG9wQm9yZGVyLmhlaWdodCgpKyRib3R0b21Cb3JkZXIuaGVpZ2h0KCkrJGNvbnRlbnQub3V0ZXJIZWlnaHQoITApLSRjb250ZW50LmhlaWdodCgpO2ludGVyZmFjZVdpZHRoPSRsZWZ0Qm9yZGVyLndpZHRoKCkrJHJpZ2h0Qm9yZGVyLndpZHRoKCkrJGNvbnRlbnQub3V0ZXJXaWR0aCghMCktJGNvbnRlbnQud2lkdGgoKTtsb2FkZWRIZWlnaHQ9JGxvYWRlZC5vdXRlckhlaWdodCghMCk7bG9hZGVkV2lkdGg9JGxvYWRlZC5vdXRlcldpZHRoKCEwKTtzZXR0aW5ncy53PXNldFNpemUoc2V0dGluZ3MuaW5pdGlhbFdpZHRoLCd4Jyk7c2V0dGluZ3MuaD1zZXRTaXplKHNldHRpbmdzLmluaXRpYWxIZWlnaHQsJ3knKTskbG9hZGVkLmNzcyh7d2lkdGg6JycsaGVpZ2h0OnNldHRpbmdzLmh9KTtwdWJsaWNNZXRob2QucG9zaXRpb24oKTt0cmlnZ2VyKGV2ZW50X29wZW4sc2V0dGluZ3Mub25PcGVuKTskZ3JvdXBDb250cm9scy5hZGQoJHRpdGxlKS5oaWRlKCk7JGJveC5mb2N1cygpO2lmKHNldHRpbmdzLnRyYXBGb2N1cyl7aWYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcil7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLHRyYXBGb2N1cywhMCk7JGV2ZW50cy5vbmUoZXZlbnRfY2xvc2VkLGZ1bmN0aW9uKCl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLHRyYXBGb2N1cywhMCl9KX19CmlmKHNldHRpbmdzLnJldHVybkZvY3VzKXskZXZlbnRzLm9uZShldmVudF9jbG9zZWQsZnVuY3Rpb24oKXskKGVsZW1lbnQpLmZvY3VzKCl9KX19CmxvYWQoKX19CmZ1bmN0aW9uIGFwcGVuZEhUTUwoKXtpZighJGJveCYmZG9jdW1lbnQuYm9keSl7aW5pdD0hMTskd2luZG93PSQod2luZG93KTskYm94PSR0YWcoZGl2KS5hdHRyKHtpZDpjb2xvcmJveCwnY2xhc3MnOiQuc3VwcG9ydC5vcGFjaXR5PT09ITE/cHJlZml4KydJRSc6Jycscm9sZTonZGlhbG9nJyx0YWJpbmRleDonLTEnfSkuaGlkZSgpOyRvdmVybGF5PSR0YWcoZGl2LCJPdmVybGF5IikuaGlkZSgpOyRsb2FkaW5nT3ZlcmxheT0kKFskdGFnKGRpdiwiTG9hZGluZ092ZXJsYXkiKVswXSwkdGFnKGRpdiwiTG9hZGluZ0dyYXBoaWMiKVswXV0pOyR3cmFwPSR0YWcoZGl2LCJXcmFwcGVyIik7JGNvbnRlbnQ9JHRhZyhkaXYsIkNvbnRlbnQiKS5hcHBlbmQoJHRpdGxlPSR0YWcoZGl2LCJUaXRsZSIpLCRjdXJyZW50PSR0YWcoZGl2LCJDdXJyZW50IiksJHByZXY9JCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hdHRyKHtpZDpwcmVmaXgrJ1ByZXZpb3VzJ30pLCRuZXh0PSQoJzxidXR0b24gdHlwZT0iYnV0dG9uIi8+JykuYXR0cih7aWQ6cHJlZml4KydOZXh0J30pLCRzbGlkZXNob3c9JHRhZygnYnV0dG9uJywiU2xpZGVzaG93IiksJGxvYWRpbmdPdmVybGF5KTskY2xvc2U9JCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hdHRyKHtpZDpwcmVmaXgrJ0Nsb3NlJ30pOyR3cmFwLmFwcGVuZCgkdGFnKGRpdikuYXBwZW5kKCR0YWcoZGl2LCJUb3BMZWZ0IiksJHRvcEJvcmRlcj0kdGFnKGRpdiwiVG9wQ2VudGVyIiksJHRhZyhkaXYsIlRvcFJpZ2h0IikpLCR0YWcoZGl2LCExLCdjbGVhcjpsZWZ0JykuYXBwZW5kKCRsZWZ0Qm9yZGVyPSR0YWcoZGl2LCJNaWRkbGVMZWZ0IiksJGNvbnRlbnQsJHJpZ2h0Qm9yZGVyPSR0YWcoZGl2LCJNaWRkbGVSaWdodCIpKSwkdGFnKGRpdiwhMSwnY2xlYXI6bGVmdCcpLmFwcGVuZCgkdGFnKGRpdiwiQm90dG9tTGVmdCIpLCRib3R0b21Cb3JkZXI9JHRhZyhkaXYsIkJvdHRvbUNlbnRlciIpLCR0YWcoZGl2LCJCb3R0b21SaWdodCIpKSkuZmluZCgnZGl2IGRpdicpLmNzcyh7J2Zsb2F0JzonbGVmdCd9KTskbG9hZGluZ0JheT0kdGFnKGRpdiwhMSwncG9zaXRpb246YWJzb2x1dGU7IHdpZHRoOjk5OTlweDsgdmlzaWJpbGl0eTpoaWRkZW47IGRpc3BsYXk6bm9uZTsgbWF4LXdpZHRoOm5vbmU7Jyk7JGdyb3VwQ29udHJvbHM9JG5leHQuYWRkKCRwcmV2KS5hZGQoJGN1cnJlbnQpLmFkZCgkc2xpZGVzaG93KTskKGRvY3VtZW50LmJvZHkpLmFwcGVuZCgkb3ZlcmxheSwkYm94LmFwcGVuZCgkd3JhcCwkbG9hZGluZ0JheSkpfX0KZnVuY3Rpb24gYWRkQmluZGluZ3MoKXtmdW5jdGlvbiBjbGlja0hhbmRsZXIoZSl7aWYoIShlLndoaWNoPjF8fGUuc2hpZnRLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXl8fGUuY3RybEtleSkpe2UucHJldmVudERlZmF1bHQoKTtsYXVuY2godGhpcyl9fQppZigkYm94KXtpZighaW5pdCl7aW5pdD0hMDskbmV4dC5jbGljayhmdW5jdGlvbigpe3B1YmxpY01ldGhvZC5uZXh0KCl9KTskcHJldi5jbGljayhmdW5jdGlvbigpe3B1YmxpY01ldGhvZC5wcmV2KCl9KTskY2xvc2UuY2xpY2soZnVuY3Rpb24oKXtwdWJsaWNNZXRob2QuY2xvc2UoKX0pOyRvdmVybGF5LmNsaWNrKGZ1bmN0aW9uKCl7aWYoc2V0dGluZ3Mub3ZlcmxheUNsb3NlKXtwdWJsaWNNZXRob2QuY2xvc2UoKX19KTskKGRvY3VtZW50KS5iaW5kKCdrZXlkb3duLicrcHJlZml4LGZ1bmN0aW9uKGUpe3ZhciBrZXk9ZS5rZXlDb2RlO2lmKG9wZW4mJnNldHRpbmdzLmVzY0tleSYma2V5PT09Mjcpe2UucHJldmVudERlZmF1bHQoKTtwdWJsaWNNZXRob2QuY2xvc2UoKX0KaWYob3BlbiYmc2V0dGluZ3MuYXJyb3dLZXkmJiRyZWxhdGVkWzFdJiYhZS5hbHRLZXkpe2lmKGtleT09PTM3KXtlLnByZXZlbnREZWZhdWx0KCk7JHByZXYuY2xpY2soKX1lbHNlIGlmKGtleT09PTM5KXtlLnByZXZlbnREZWZhdWx0KCk7JG5leHQuY2xpY2soKX19fSk7aWYoJC5pc0Z1bmN0aW9uKCQuZm4ub24pKXskKGRvY3VtZW50KS5vbignY2xpY2suJytwcmVmaXgsJy4nK2JveEVsZW1lbnQsY2xpY2tIYW5kbGVyKX1lbHNleyQoJy4nK2JveEVsZW1lbnQpLmxpdmUoJ2NsaWNrLicrcHJlZml4LGNsaWNrSGFuZGxlcil9fQpyZXR1cm4hMH0KcmV0dXJuITF9CmlmKCQuY29sb3Jib3gpe3JldHVybn0KJChhcHBlbmRIVE1MKTtwdWJsaWNNZXRob2Q9JC5mbltjb2xvcmJveF09JFtjb2xvcmJveF09ZnVuY3Rpb24ob3B0aW9ucyxjYWxsYmFjayl7dmFyICR0aGlzPXRoaXM7b3B0aW9ucz1vcHRpb25zfHx7fTthcHBlbmRIVE1MKCk7aWYoYWRkQmluZGluZ3MoKSl7aWYoJC5pc0Z1bmN0aW9uKCR0aGlzKSl7JHRoaXM9JCgnPGEvPicpO29wdGlvbnMub3Blbj0hMH1lbHNlIGlmKCEkdGhpc1swXSl7cmV0dXJuICR0aGlzfQppZihjYWxsYmFjayl7b3B0aW9ucy5vbkNvbXBsZXRlPWNhbGxiYWNrfQokdGhpcy5lYWNoKGZ1bmN0aW9uKCl7JC5kYXRhKHRoaXMsY29sb3Jib3gsJC5leHRlbmQoe30sJC5kYXRhKHRoaXMsY29sb3Jib3gpfHxkZWZhdWx0cyxvcHRpb25zKSl9KS5hZGRDbGFzcyhib3hFbGVtZW50KTtpZigoJC5pc0Z1bmN0aW9uKG9wdGlvbnMub3BlbikmJm9wdGlvbnMub3Blbi5jYWxsKCR0aGlzKSl8fG9wdGlvbnMub3Blbil7bGF1bmNoKCR0aGlzWzBdKX19CnJldHVybiAkdGhpc307cHVibGljTWV0aG9kLnBvc2l0aW9uPWZ1bmN0aW9uKHNwZWVkLGxvYWRlZENhbGxiYWNrKXt2YXIKY3NzLHRvcD0wLGxlZnQ9MCxvZmZzZXQ9JGJveC5vZmZzZXQoKSxzY3JvbGxUb3Asc2Nyb2xsTGVmdDskd2luZG93LnVuYmluZCgncmVzaXplLicrcHJlZml4KTskYm94LmNzcyh7dG9wOi05ZTQsbGVmdDotOWU0fSk7c2Nyb2xsVG9wPSR3aW5kb3cuc2Nyb2xsVG9wKCk7c2Nyb2xsTGVmdD0kd2luZG93LnNjcm9sbExlZnQoKTtpZihzZXR0aW5ncy5maXhlZCl7b2Zmc2V0LnRvcC09c2Nyb2xsVG9wO29mZnNldC5sZWZ0LT1zY3JvbGxMZWZ0OyRib3guY3NzKHtwb3NpdGlvbjonZml4ZWQnfSl9ZWxzZXt0b3A9c2Nyb2xsVG9wO2xlZnQ9c2Nyb2xsTGVmdDskYm94LmNzcyh7cG9zaXRpb246J2Fic29sdXRlJ30pfQppZihzZXR0aW5ncy5yaWdodCE9PSExKXtsZWZ0Kz1NYXRoLm1heCgkd2luZG93LndpZHRoKCktc2V0dGluZ3Mudy1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aC1zZXRTaXplKHNldHRpbmdzLnJpZ2h0LCd4JyksMCl9ZWxzZSBpZihzZXR0aW5ncy5sZWZ0IT09ITEpe2xlZnQrPXNldFNpemUoc2V0dGluZ3MubGVmdCwneCcpfWVsc2V7bGVmdCs9TWF0aC5yb3VuZChNYXRoLm1heCgkd2luZG93LndpZHRoKCktc2V0dGluZ3Mudy1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aCwwKS8yKX0KaWYoc2V0dGluZ3MuYm90dG9tIT09ITEpe3RvcCs9TWF0aC5tYXgod2luaGVpZ2h0KCktc2V0dGluZ3MuaC1sb2FkZWRIZWlnaHQtaW50ZXJmYWNlSGVpZ2h0LXNldFNpemUoc2V0dGluZ3MuYm90dG9tLCd5JyksMCl9ZWxzZSBpZihzZXR0aW5ncy50b3AhPT0hMSl7dG9wKz1zZXRTaXplKHNldHRpbmdzLnRvcCwneScpfWVsc2V7dG9wKz1NYXRoLnJvdW5kKE1hdGgubWF4KHdpbmhlaWdodCgpLXNldHRpbmdzLmgtbG9hZGVkSGVpZ2h0LWludGVyZmFjZUhlaWdodCwwKS8yKX0KJGJveC5jc3Moe3RvcDpvZmZzZXQudG9wLGxlZnQ6b2Zmc2V0LmxlZnQsdmlzaWJpbGl0eTondmlzaWJsZSd9KTskd3JhcFswXS5zdHlsZS53aWR0aD0kd3JhcFswXS5zdHlsZS5oZWlnaHQ9Ijk5OTlweCI7ZnVuY3Rpb24gbW9kYWxEaW1lbnNpb25zKCl7JHRvcEJvcmRlclswXS5zdHlsZS53aWR0aD0kYm90dG9tQm9yZGVyWzBdLnN0eWxlLndpZHRoPSRjb250ZW50WzBdLnN0eWxlLndpZHRoPShwYXJzZUludCgkYm94WzBdLnN0eWxlLndpZHRoLDEwKS1pbnRlcmZhY2VXaWR0aCkrJ3B4JzskY29udGVudFswXS5zdHlsZS5oZWlnaHQ9JGxlZnRCb3JkZXJbMF0uc3R5bGUuaGVpZ2h0PSRyaWdodEJvcmRlclswXS5zdHlsZS5oZWlnaHQ9KHBhcnNlSW50KCRib3hbMF0uc3R5bGUuaGVpZ2h0LDEwKS1pbnRlcmZhY2VIZWlnaHQpKydweCd9CmNzcz17d2lkdGg6c2V0dGluZ3Mudytsb2FkZWRXaWR0aCtpbnRlcmZhY2VXaWR0aCxoZWlnaHQ6c2V0dGluZ3MuaCtsb2FkZWRIZWlnaHQraW50ZXJmYWNlSGVpZ2h0LHRvcDp0b3AsbGVmdDpsZWZ0fTtpZihzcGVlZCl7dmFyIHRlbXBTcGVlZD0wOyQuZWFjaChjc3MsZnVuY3Rpb24oaSl7aWYoY3NzW2ldIT09cHJldmlvdXNDU1NbaV0pe3RlbXBTcGVlZD1zcGVlZH19KTtzcGVlZD10ZW1wU3BlZWR9CnByZXZpb3VzQ1NTPWNzcztpZighc3BlZWQpeyRib3guY3NzKGNzcyl9CiRib3guZGVxdWV1ZSgpLmFuaW1hdGUoY3NzLHtkdXJhdGlvbjpzcGVlZHx8MCxjb21wbGV0ZTpmdW5jdGlvbigpe21vZGFsRGltZW5zaW9ucygpO2FjdGl2ZT0hMTskd3JhcFswXS5zdHlsZS53aWR0aD0oc2V0dGluZ3Mudytsb2FkZWRXaWR0aCtpbnRlcmZhY2VXaWR0aCkrInB4Ijskd3JhcFswXS5zdHlsZS5oZWlnaHQ9KHNldHRpbmdzLmgrbG9hZGVkSGVpZ2h0K2ludGVyZmFjZUhlaWdodCkrInB4IjtpZihzZXR0aW5ncy5yZXBvc2l0aW9uKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JHdpbmRvdy5iaW5kKCdyZXNpemUuJytwcmVmaXgscHVibGljTWV0aG9kLnBvc2l0aW9uKX0sMSl9CmlmKGxvYWRlZENhbGxiYWNrKXtsb2FkZWRDYWxsYmFjaygpfX0sc3RlcDptb2RhbERpbWVuc2lvbnN9KX07cHVibGljTWV0aG9kLnJlc2l6ZT1mdW5jdGlvbihvcHRpb25zKXt2YXIgc2Nyb2xsdG9wO2lmKG9wZW4pe29wdGlvbnM9b3B0aW9uc3x8e307aWYob3B0aW9ucy53aWR0aCl7c2V0dGluZ3Mudz1zZXRTaXplKG9wdGlvbnMud2lkdGgsJ3gnKS1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aH0KaWYob3B0aW9ucy5pbm5lcldpZHRoKXtzZXR0aW5ncy53PXNldFNpemUob3B0aW9ucy5pbm5lcldpZHRoLCd4Jyl9CiRsb2FkZWQuY3NzKHt3aWR0aDpzZXR0aW5ncy53fSk7aWYob3B0aW9ucy5oZWlnaHQpe3NldHRpbmdzLmg9c2V0U2l6ZShvcHRpb25zLmhlaWdodCwneScpLWxvYWRlZEhlaWdodC1pbnRlcmZhY2VIZWlnaHR9CmlmKG9wdGlvbnMuaW5uZXJIZWlnaHQpe3NldHRpbmdzLmg9c2V0U2l6ZShvcHRpb25zLmlubmVySGVpZ2h0LCd5Jyl9CmlmKCFvcHRpb25zLmlubmVySGVpZ2h0JiYhb3B0aW9ucy5oZWlnaHQpe3Njcm9sbHRvcD0kbG9hZGVkLnNjcm9sbFRvcCgpOyRsb2FkZWQuY3NzKHtoZWlnaHQ6ImF1dG8ifSk7c2V0dGluZ3MuaD0kbG9hZGVkLmhlaWdodCgpfQokbG9hZGVkLmNzcyh7aGVpZ2h0OnNldHRpbmdzLmh9KTtpZihzY3JvbGx0b3ApeyRsb2FkZWQuc2Nyb2xsVG9wKHNjcm9sbHRvcCl9CnB1YmxpY01ldGhvZC5wb3NpdGlvbihzZXR0aW5ncy50cmFuc2l0aW9uPT09Im5vbmUiPzA6c2V0dGluZ3Muc3BlZWQpfX07cHVibGljTWV0aG9kLnByZXA9ZnVuY3Rpb24ob2JqZWN0KXtpZighb3Blbil7cmV0dXJufQp2YXIgY2FsbGJhY2ssc3BlZWQ9c2V0dGluZ3MudHJhbnNpdGlvbj09PSJub25lIj8wOnNldHRpbmdzLnNwZWVkOyRsb2FkZWQuZW1wdHkoKS5yZW1vdmUoKTskbG9hZGVkPSR0YWcoZGl2LCdMb2FkZWRDb250ZW50JykuYXBwZW5kKG9iamVjdCk7ZnVuY3Rpb24gZ2V0V2lkdGgoKXtzZXR0aW5ncy53PXNldHRpbmdzLnd8fCRsb2FkZWQud2lkdGgoKTtzZXR0aW5ncy53PXNldHRpbmdzLm13JiZzZXR0aW5ncy5tdzxzZXR0aW5ncy53P3NldHRpbmdzLm13OnNldHRpbmdzLnc7cmV0dXJuIHNldHRpbmdzLnd9CmZ1bmN0aW9uIGdldEhlaWdodCgpe3NldHRpbmdzLmg9c2V0dGluZ3MuaHx8JGxvYWRlZC5oZWlnaHQoKTtzZXR0aW5ncy5oPXNldHRpbmdzLm1oJiZzZXR0aW5ncy5taDxzZXR0aW5ncy5oP3NldHRpbmdzLm1oOnNldHRpbmdzLmg7cmV0dXJuIHNldHRpbmdzLmh9CiRsb2FkZWQuaGlkZSgpLmFwcGVuZFRvKCRsb2FkaW5nQmF5LnNob3coKSkuY3NzKHt3aWR0aDpnZXRXaWR0aCgpLG92ZXJmbG93OnNldHRpbmdzLnNjcm9sbGluZz8nYXV0byc6J2hpZGRlbid9KS5jc3Moe2hlaWdodDpnZXRIZWlnaHQoKX0pLnByZXBlbmRUbygkY29udGVudCk7JGxvYWRpbmdCYXkuaGlkZSgpOyQocGhvdG8pLmNzcyh7J2Zsb2F0Jzonbm9uZSd9KTtjYWxsYmFjaz1mdW5jdGlvbigpe3ZhciB0b3RhbD0kcmVsYXRlZC5sZW5ndGgsaWZyYW1lLGZyYW1lQm9yZGVyPSdmcmFtZUJvcmRlcicsYWxsb3dUcmFuc3BhcmVuY3k9J2FsbG93VHJhbnNwYXJlbmN5Jyxjb21wbGV0ZTtpZighb3Blbil7cmV0dXJufQpmdW5jdGlvbiByZW1vdmVGaWx0ZXIoKXtpZigkLnN1cHBvcnQub3BhY2l0eT09PSExKXskYm94WzBdLnN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgnZmlsdGVyJyl9fQpjb21wbGV0ZT1mdW5jdGlvbigpe2NsZWFyVGltZW91dChsb2FkaW5nVGltZXIpOyRsb2FkaW5nT3ZlcmxheS5oaWRlKCk7dHJpZ2dlcihldmVudF9jb21wbGV0ZSxzZXR0aW5ncy5vbkNvbXBsZXRlKX07JHRpdGxlLmh0bWwoc2V0dGluZ3MudGl0bGUpLmFkZCgkbG9hZGVkKS5zaG93KCk7aWYodG90YWw+MSl7aWYodHlwZW9mIHNldHRpbmdzLmN1cnJlbnQ9PT0ic3RyaW5nIil7JGN1cnJlbnQuaHRtbChzZXR0aW5ncy5jdXJyZW50LnJlcGxhY2UoJ3tjdXJyZW50fScsaW5kZXgrMSkucmVwbGFjZSgne3RvdGFsfScsdG90YWwpKS5zaG93KCl9CiRuZXh0WyhzZXR0aW5ncy5sb29wfHxpbmRleDx0b3RhbC0xKT8ic2hvdyI6ImhpZGUiXSgpLmh0bWwoc2V0dGluZ3MubmV4dCk7JHByZXZbKHNldHRpbmdzLmxvb3B8fGluZGV4KT8ic2hvdyI6ImhpZGUiXSgpLmh0bWwoc2V0dGluZ3MucHJldmlvdXMpO3NsaWRlc2hvdygpO2lmKHNldHRpbmdzLnByZWxvYWRpbmcpeyQuZWFjaChbZ2V0SW5kZXgoLTEpLGdldEluZGV4KDEpXSxmdW5jdGlvbigpe3ZhciBzcmMsaW1nLGk9JHJlbGF0ZWRbdGhpc10sZGF0YT0kLmRhdGEoaSxjb2xvcmJveCk7aWYoZGF0YSYmZGF0YS5ocmVmKXtzcmM9ZGF0YS5ocmVmO2lmKCQuaXNGdW5jdGlvbihzcmMpKXtzcmM9c3JjLmNhbGwoaSl9fWVsc2V7c3JjPSQoaSkuYXR0cignaHJlZicpfQppZihzcmMmJmlzSW1hZ2UoZGF0YSxzcmMpKXtzcmM9cmV0aW5hVXJsKGRhdGEsc3JjKTtpbWc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7aW1nLnNyYz1zcmN9fSl9fWVsc2V7JGdyb3VwQ29udHJvbHMuaGlkZSgpfQppZihzZXR0aW5ncy5pZnJhbWUpe2lmcmFtZT0kdGFnKCdpZnJhbWUnKVswXTtpZihmcmFtZUJvcmRlciBpbiBpZnJhbWUpe2lmcmFtZVtmcmFtZUJvcmRlcl09MH0KaWYoYWxsb3dUcmFuc3BhcmVuY3kgaW4gaWZyYW1lKXtpZnJhbWVbYWxsb3dUcmFuc3BhcmVuY3ldPSJ0cnVlIn0KaWYoIXNldHRpbmdzLnNjcm9sbGluZyl7aWZyYW1lLnNjcm9sbGluZz0ibm8ifQokKGlmcmFtZSkuYXR0cih7c3JjOnNldHRpbmdzLmhyZWYsbmFtZToobmV3IERhdGUoKSkuZ2V0VGltZSgpLCdjbGFzcyc6cHJlZml4KydJZnJhbWUnLGFsbG93RnVsbFNjcmVlbjohMCx3ZWJraXRBbGxvd0Z1bGxTY3JlZW46ITAsbW96YWxsb3dmdWxsc2NyZWVuOiEwfSkub25lKCdsb2FkJyxjb21wbGV0ZSkuYXBwZW5kVG8oJGxvYWRlZCk7JGV2ZW50cy5vbmUoZXZlbnRfcHVyZ2UsZnVuY3Rpb24oKXtpZnJhbWUuc3JjPSIvL2Fib3V0OmJsYW5rIn0pO2lmKHNldHRpbmdzLmZhc3RJZnJhbWUpeyQoaWZyYW1lKS50cmlnZ2VyKCdsb2FkJyl9fWVsc2V7Y29tcGxldGUoKX0KaWYoc2V0dGluZ3MudHJhbnNpdGlvbj09PSdmYWRlJyl7JGJveC5mYWRlVG8oc3BlZWQsMSxyZW1vdmVGaWx0ZXIpfWVsc2V7cmVtb3ZlRmlsdGVyKCl9fTtpZihzZXR0aW5ncy50cmFuc2l0aW9uPT09J2ZhZGUnKXskYm94LmZhZGVUbyhzcGVlZCwwLGZ1bmN0aW9uKCl7cHVibGljTWV0aG9kLnBvc2l0aW9uKDAsY2FsbGJhY2spfSl9ZWxzZXtwdWJsaWNNZXRob2QucG9zaXRpb24oc3BlZWQsY2FsbGJhY2spfX07ZnVuY3Rpb24gbG9hZCgpe3ZhciBocmVmLHNldFJlc2l6ZSxwcmVwPXB1YmxpY01ldGhvZC5wcmVwLCRpbmxpbmUscmVxdWVzdD0rK3JlcXVlc3RzO2FjdGl2ZT0hMDtwaG90bz0hMTtlbGVtZW50PSRyZWxhdGVkW2luZGV4XTttYWtlU2V0dGluZ3MoKTt0cmlnZ2VyKGV2ZW50X3B1cmdlKTt0cmlnZ2VyKGV2ZW50X2xvYWQsc2V0dGluZ3Mub25Mb2FkKTtzZXR0aW5ncy5oPXNldHRpbmdzLmhlaWdodD9zZXRTaXplKHNldHRpbmdzLmhlaWdodCwneScpLWxvYWRlZEhlaWdodC1pbnRlcmZhY2VIZWlnaHQ6c2V0dGluZ3MuaW5uZXJIZWlnaHQmJnNldFNpemUoc2V0dGluZ3MuaW5uZXJIZWlnaHQsJ3knKTtzZXR0aW5ncy53PXNldHRpbmdzLndpZHRoP3NldFNpemUoc2V0dGluZ3Mud2lkdGgsJ3gnKS1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aDpzZXR0aW5ncy5pbm5lcldpZHRoJiZzZXRTaXplKHNldHRpbmdzLmlubmVyV2lkdGgsJ3gnKTtzZXR0aW5ncy5tdz1zZXR0aW5ncy53O3NldHRpbmdzLm1oPXNldHRpbmdzLmg7aWYoc2V0dGluZ3MubWF4V2lkdGgpe3NldHRpbmdzLm13PXNldFNpemUoc2V0dGluZ3MubWF4V2lkdGgsJ3gnKS1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aDtzZXR0aW5ncy5tdz1zZXR0aW5ncy53JiZzZXR0aW5ncy53PHNldHRpbmdzLm13P3NldHRpbmdzLnc6c2V0dGluZ3MubXd9CmlmKHNldHRpbmdzLm1heEhlaWdodCl7c2V0dGluZ3MubWg9c2V0U2l6ZShzZXR0aW5ncy5tYXhIZWlnaHQsJ3knKS1sb2FkZWRIZWlnaHQtaW50ZXJmYWNlSGVpZ2h0O3NldHRpbmdzLm1oPXNldHRpbmdzLmgmJnNldHRpbmdzLmg8c2V0dGluZ3MubWg/c2V0dGluZ3MuaDpzZXR0aW5ncy5taH0KaHJlZj1zZXR0aW5ncy5ocmVmO2xvYWRpbmdUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JGxvYWRpbmdPdmVybGF5LnNob3coKX0sMTAwKTtpZihzZXR0aW5ncy5pbmxpbmUpeyRpbmxpbmU9JHRhZyhkaXYpLmhpZGUoKS5pbnNlcnRCZWZvcmUoJChocmVmKVswXSk7JGV2ZW50cy5vbmUoZXZlbnRfcHVyZ2UsZnVuY3Rpb24oKXskaW5saW5lLnJlcGxhY2VXaXRoKCRsb2FkZWQuY2hpbGRyZW4oKSl9KTtwcmVwKCQoaHJlZikpfWVsc2UgaWYoc2V0dGluZ3MuaWZyYW1lKXtwcmVwKCIgIil9ZWxzZSBpZihzZXR0aW5ncy5odG1sKXtwcmVwKHNldHRpbmdzLmh0bWwpfWVsc2UgaWYoaXNJbWFnZShzZXR0aW5ncyxocmVmKSl7aHJlZj1yZXRpbmFVcmwoc2V0dGluZ3MsaHJlZik7cGhvdG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7JChwaG90bykuYWRkQ2xhc3MocHJlZml4KydQaG90bycpLmJpbmQoJ2Vycm9yJyxmdW5jdGlvbigpe3NldHRpbmdzLnRpdGxlPSExO3ByZXAoJHRhZyhkaXYsJ0Vycm9yJykuaHRtbChzZXR0aW5ncy5pbWdFcnJvcikpfSkub25lKCdsb2FkJyxmdW5jdGlvbigpe3ZhciBwZXJjZW50O2lmKHJlcXVlc3QhPT1yZXF1ZXN0cyl7cmV0dXJufQokLmVhY2goWydhbHQnLCdsb25nZGVzYycsJ2FyaWEtZGVzY3JpYmVkYnknXSxmdW5jdGlvbihpLHZhbCl7dmFyIGF0dHI9JChlbGVtZW50KS5hdHRyKHZhbCl8fCQoZWxlbWVudCkuYXR0cignZGF0YS0nK3ZhbCk7aWYoYXR0cil7cGhvdG8uc2V0QXR0cmlidXRlKHZhbCxhdHRyKX19KTtpZihzZXR0aW5ncy5yZXRpbmFJbWFnZSYmd2luZG93LmRldmljZVBpeGVsUmF0aW8+MSl7cGhvdG8uaGVpZ2h0PXBob3RvLmhlaWdodC93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztwaG90by53aWR0aD1waG90by53aWR0aC93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb30KaWYoc2V0dGluZ3Muc2NhbGVQaG90b3Mpe3NldFJlc2l6ZT1mdW5jdGlvbigpe3Bob3RvLmhlaWdodC09cGhvdG8uaGVpZ2h0KnBlcmNlbnQ7cGhvdG8ud2lkdGgtPXBob3RvLndpZHRoKnBlcmNlbnR9O2lmKHNldHRpbmdzLm13JiZwaG90by53aWR0aD5zZXR0aW5ncy5tdyl7cGVyY2VudD0ocGhvdG8ud2lkdGgtc2V0dGluZ3MubXcpL3Bob3RvLndpZHRoO3NldFJlc2l6ZSgpfQppZihzZXR0aW5ncy5taCYmcGhvdG8uaGVpZ2h0PnNldHRpbmdzLm1oKXtwZXJjZW50PShwaG90by5oZWlnaHQtc2V0dGluZ3MubWgpL3Bob3RvLmhlaWdodDtzZXRSZXNpemUoKX19CmlmKHNldHRpbmdzLmgpe3Bob3RvLnN0eWxlLm1hcmdpblRvcD1NYXRoLm1heChzZXR0aW5ncy5taC1waG90by5oZWlnaHQsMCkvMisncHgnfQppZigkcmVsYXRlZFsxXSYmKHNldHRpbmdzLmxvb3B8fCRyZWxhdGVkW2luZGV4KzFdKSl7cGhvdG8uc3R5bGUuY3Vyc29yPSdwb2ludGVyJztwaG90by5vbmNsaWNrPWZ1bmN0aW9uKCl7cHVibGljTWV0aG9kLm5leHQoKX19CnBob3RvLnN0eWxlLndpZHRoPXBob3RvLndpZHRoKydweCc7cGhvdG8uc3R5bGUuaGVpZ2h0PXBob3RvLmhlaWdodCsncHgnO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtwcmVwKHBob3RvKX0sMSl9KTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cGhvdG8uc3JjPWhyZWZ9LDEpfWVsc2UgaWYoaHJlZil7JGxvYWRpbmdCYXkubG9hZChocmVmLHNldHRpbmdzLmRhdGEsZnVuY3Rpb24oZGF0YSxzdGF0dXMpe2lmKHJlcXVlc3Q9PT1yZXF1ZXN0cyl7cHJlcChzdGF0dXM9PT0nZXJyb3InPyR0YWcoZGl2LCdFcnJvcicpLmh0bWwoc2V0dGluZ3MueGhyRXJyb3IpOiQodGhpcykuY29udGVudHMoKSl9fSl9fQpwdWJsaWNNZXRob2QubmV4dD1mdW5jdGlvbigpe2lmKCFhY3RpdmUmJiRyZWxhdGVkWzFdJiYoc2V0dGluZ3MubG9vcHx8JHJlbGF0ZWRbaW5kZXgrMV0pKXtpbmRleD1nZXRJbmRleCgxKTtsYXVuY2goJHJlbGF0ZWRbaW5kZXhdKX19O3B1YmxpY01ldGhvZC5wcmV2PWZ1bmN0aW9uKCl7aWYoIWFjdGl2ZSYmJHJlbGF0ZWRbMV0mJihzZXR0aW5ncy5sb29wfHxpbmRleCkpe2luZGV4PWdldEluZGV4KC0xKTtsYXVuY2goJHJlbGF0ZWRbaW5kZXhdKX19O3B1YmxpY01ldGhvZC5jbG9zZT1mdW5jdGlvbigpe2lmKG9wZW4mJiFjbG9zaW5nKXtjbG9zaW5nPSEwO29wZW49ITE7dHJpZ2dlcihldmVudF9jbGVhbnVwLHNldHRpbmdzLm9uQ2xlYW51cCk7JHdpbmRvdy51bmJpbmQoJy4nK3ByZWZpeCk7JG92ZXJsYXkuZmFkZVRvKHNldHRpbmdzLmZhZGVPdXR8fDAsMCk7JGJveC5zdG9wKCkuZmFkZVRvKHNldHRpbmdzLmZhZGVPdXR8fDAsMCxmdW5jdGlvbigpeyRib3guYWRkKCRvdmVybGF5KS5jc3MoeydvcGFjaXR5JzoxLGN1cnNvcjonYXV0byd9KS5oaWRlKCk7dHJpZ2dlcihldmVudF9wdXJnZSk7JGxvYWRlZC5lbXB0eSgpLnJlbW92ZSgpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjbG9zaW5nPSExO3RyaWdnZXIoZXZlbnRfY2xvc2VkLHNldHRpbmdzLm9uQ2xvc2VkKX0sMSl9KX19O3B1YmxpY01ldGhvZC5yZW1vdmU9ZnVuY3Rpb24oKXtpZighJGJveCl7cmV0dXJufQokYm94LnN0b3AoKTskLmNvbG9yYm94LmNsb3NlKCk7JGJveC5zdG9wKCkucmVtb3ZlKCk7JG92ZXJsYXkucmVtb3ZlKCk7Y2xvc2luZz0hMTskYm94PW51bGw7JCgnLicrYm94RWxlbWVudCkucmVtb3ZlRGF0YShjb2xvcmJveCkucmVtb3ZlQ2xhc3MoYm94RWxlbWVudCk7JChkb2N1bWVudCkudW5iaW5kKCdjbGljay4nK3ByZWZpeCl9O3B1YmxpY01ldGhvZC5lbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuICQoZWxlbWVudCl9O3B1YmxpY01ldGhvZC5zZXR0aW5ncz1kZWZhdWx0c30oalF1ZXJ5LGRvY3VtZW50LHdpbmRvdykpOyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBzZXR1cCgkKXskLmZuLl9mYWRlSW49JC5mbi5mYWRlSW47dmFyIG5vT3A9JC5ub29wfHxmdW5jdGlvbigpe307dmFyIG1zaWU9L01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7dmFyIGllNj0vTVNJRSA2LjAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiEvTVNJRSA4LjAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7dmFyIG1vZGU9ZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHwwO3ZhciBzZXRFeHByPSQuaXNGdW5jdGlvbihkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZS5zZXRFeHByZXNzaW9uKTskLmJsb2NrVUk9ZnVuY3Rpb24ob3B0cyl7aW5zdGFsbCh3aW5kb3csb3B0cyl9OyQudW5ibG9ja1VJPWZ1bmN0aW9uKG9wdHMpe3JlbW92ZSh3aW5kb3csb3B0cyl9OyQuZ3Jvd2xVST1mdW5jdGlvbih0aXRsZSxtZXNzYWdlLHRpbWVvdXQsb25DbG9zZSl7dmFyICRtPSQoJzxkaXYgY2xhc3M9Imdyb3dsVUkiPjwvZGl2PicpO2lmKHRpdGxlKSRtLmFwcGVuZCgnPGgxPicrdGl0bGUrJzwvaDE+Jyk7aWYobWVzc2FnZSkkbS5hcHBlbmQoJzxoMj4nK21lc3NhZ2UrJzwvaDI+Jyk7aWYodGltZW91dD09PXVuZGVmaW5lZCl0aW1lb3V0PTMwMDA7dmFyIGNhbGxCbG9jaz1mdW5jdGlvbihvcHRzKXtvcHRzPW9wdHN8fHt9OyQuYmxvY2tVSSh7bWVzc2FnZTokbSxmYWRlSW46dHlwZW9mIG9wdHMuZmFkZUluIT09J3VuZGVmaW5lZCc/b3B0cy5mYWRlSW46NzAwLGZhZGVPdXQ6dHlwZW9mIG9wdHMuZmFkZU91dCE9PSd1bmRlZmluZWQnP29wdHMuZmFkZU91dDoxMDAwLHRpbWVvdXQ6dHlwZW9mIG9wdHMudGltZW91dCE9PSd1bmRlZmluZWQnP29wdHMudGltZW91dDp0aW1lb3V0LGNlbnRlclk6ITEsc2hvd092ZXJsYXk6ITEsb25VbmJsb2NrOm9uQ2xvc2UsY3NzOiQuYmxvY2tVSS5kZWZhdWx0cy5ncm93bENTU30pfTtjYWxsQmxvY2soKTt2YXIgbm9ubW91c2VkT3BhY2l0eT0kbS5jc3MoJ29wYWNpdHknKTskbS5tb3VzZW92ZXIoZnVuY3Rpb24oKXtjYWxsQmxvY2soe2ZhZGVJbjowLHRpbWVvdXQ6MzAwMDB9KTt2YXIgZGlzcGxheUJsb2NrPSQoJy5ibG9ja01zZycpO2Rpc3BsYXlCbG9jay5zdG9wKCk7ZGlzcGxheUJsb2NrLmZhZGVUbygzMDAsMSl9KS5tb3VzZW91dChmdW5jdGlvbigpeyQoJy5ibG9ja01zZycpLmZhZGVPdXQoMTAwMCl9KX07JC5mbi5ibG9jaz1mdW5jdGlvbihvcHRzKXtpZih0aGlzWzBdPT09d2luZG93KXskLmJsb2NrVUkob3B0cyk7cmV0dXJuIHRoaXN9CnZhciBmdWxsT3B0cz0kLmV4dGVuZCh7fSwkLmJsb2NrVUkuZGVmYXVsdHMsb3B0c3x8e30pO3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciAkZWw9JCh0aGlzKTtpZihmdWxsT3B0cy5pZ25vcmVJZkJsb2NrZWQmJiRlbC5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcpKQpyZXR1cm47JGVsLnVuYmxvY2soe2ZhZGVPdXQ6MH0pfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKCQuY3NzKHRoaXMsJ3Bvc2l0aW9uJyk9PSdzdGF0aWMnKXt0aGlzLnN0eWxlLnBvc2l0aW9uPSdyZWxhdGl2ZSc7JCh0aGlzKS5kYXRhKCdibG9ja1VJLnN0YXRpYycsITApfQp0aGlzLnN0eWxlLnpvb209MTtpbnN0YWxsKHRoaXMsb3B0cyl9KX07JC5mbi51bmJsb2NrPWZ1bmN0aW9uKG9wdHMpe2lmKHRoaXNbMF09PT13aW5kb3cpeyQudW5ibG9ja1VJKG9wdHMpO3JldHVybiB0aGlzfQpyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7cmVtb3ZlKHRoaXMsb3B0cyl9KX07JC5ibG9ja1VJLnZlcnNpb249Mi43MDskLmJsb2NrVUkuZGVmYXVsdHM9e21lc3NhZ2U6JzxoMT5QbGVhc2Ugd2FpdC4uLjwvaDE+Jyx0aXRsZTpudWxsLGRyYWdnYWJsZTohMCx0aGVtZTohMSxjc3M6e3BhZGRpbmc6MCxtYXJnaW46MCx3aWR0aDonMzAlJyx0b3A6JzQwJScsbGVmdDonMzUlJyx0ZXh0QWxpZ246J2NlbnRlcicsY29sb3I6JyMwMDAnLGJvcmRlcjonM3B4IHNvbGlkICNhYWEnLGJhY2tncm91bmRDb2xvcjonI2ZmZicsY3Vyc29yOid3YWl0J30sdGhlbWVkQ1NTOnt3aWR0aDonMzAlJyx0b3A6JzQwJScsbGVmdDonMzUlJ30sb3ZlcmxheUNTUzp7YmFja2dyb3VuZENvbG9yOicjMDAwJyxvcGFjaXR5OjAuNixjdXJzb3I6J3dhaXQnfSxjdXJzb3JSZXNldDonZGVmYXVsdCcsZ3Jvd2xDU1M6e3dpZHRoOiczNTBweCcsdG9wOicxMHB4JyxsZWZ0OicnLHJpZ2h0OicxMHB4Jyxib3JkZXI6J25vbmUnLHBhZGRpbmc6JzVweCcsb3BhY2l0eTowLjYsY3Vyc29yOidkZWZhdWx0Jyxjb2xvcjonI2ZmZicsYmFja2dyb3VuZENvbG9yOicjMDAwJywnLXdlYmtpdC1ib3JkZXItcmFkaXVzJzonMTBweCcsJy1tb3otYm9yZGVyLXJhZGl1cyc6JzEwcHgnLCdib3JkZXItcmFkaXVzJzonMTBweCd9LGlmcmFtZVNyYzovXmh0dHBzL2kudGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZnx8JycpPydqYXZhc2NyaXB0OmZhbHNlJzonYWJvdXQ6YmxhbmsnLGZvcmNlSWZyYW1lOiExLGJhc2VaOjEwMDAsY2VudGVyWDohMCxjZW50ZXJZOiEwLGFsbG93Qm9keVN0cmV0Y2g6ITAsYmluZEV2ZW50czohMCxjb25zdHJhaW5UYWJLZXk6ITAsZmFkZUluOjIwMCxmYWRlT3V0OjQwMCx0aW1lb3V0OjAsc2hvd092ZXJsYXk6ITAsZm9jdXNJbnB1dDohMCxmb2N1c2FibGVFbGVtZW50czonOmlucHV0OmVuYWJsZWQ6dmlzaWJsZScsb25CbG9jazpudWxsLG9uVW5ibG9jazpudWxsLG9uT3ZlcmxheUNsaWNrOm51bGwscXVpcmtzbW9kZU9mZnNldEhhY2s6NCxibG9ja01zZ0NsYXNzOidibG9ja01zZycsaWdub3JlSWZCbG9ja2VkOiExfTt2YXIgcGFnZUJsb2NrPW51bGw7dmFyIHBhZ2VCbG9ja0Vscz1bXTtmdW5jdGlvbiBpbnN0YWxsKGVsLG9wdHMpe3ZhciBjc3MsdGhlbWVkQ1NTO3ZhciBmdWxsPShlbD09d2luZG93KTt2YXIgbXNnPShvcHRzJiZvcHRzLm1lc3NhZ2UhPT11bmRlZmluZWQ/b3B0cy5tZXNzYWdlOnVuZGVmaW5lZCk7b3B0cz0kLmV4dGVuZCh7fSwkLmJsb2NrVUkuZGVmYXVsdHMsb3B0c3x8e30pO2lmKG9wdHMuaWdub3JlSWZCbG9ja2VkJiYkKGVsKS5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcpKQpyZXR1cm47b3B0cy5vdmVybGF5Q1NTPSQuZXh0ZW5kKHt9LCQuYmxvY2tVSS5kZWZhdWx0cy5vdmVybGF5Q1NTLG9wdHMub3ZlcmxheUNTU3x8e30pO2Nzcz0kLmV4dGVuZCh7fSwkLmJsb2NrVUkuZGVmYXVsdHMuY3NzLG9wdHMuY3NzfHx7fSk7aWYob3B0cy5vbk92ZXJsYXlDbGljaykKb3B0cy5vdmVybGF5Q1NTLmN1cnNvcj0ncG9pbnRlcic7dGhlbWVkQ1NTPSQuZXh0ZW5kKHt9LCQuYmxvY2tVSS5kZWZhdWx0cy50aGVtZWRDU1Msb3B0cy50aGVtZWRDU1N8fHt9KTttc2c9bXNnPT09dW5kZWZpbmVkP29wdHMubWVzc2FnZTptc2c7aWYoZnVsbCYmcGFnZUJsb2NrKQpyZW1vdmUod2luZG93LHtmYWRlT3V0OjB9KTtpZihtc2cmJnR5cGVvZiBtc2chPSdzdHJpbmcnJiYobXNnLnBhcmVudE5vZGV8fG1zZy5qcXVlcnkpKXt2YXIgbm9kZT1tc2cuanF1ZXJ5P21zZ1swXTptc2c7dmFyIGRhdGE9e307JChlbCkuZGF0YSgnYmxvY2tVSS5oaXN0b3J5JyxkYXRhKTtkYXRhLmVsPW5vZGU7ZGF0YS5wYXJlbnQ9bm9kZS5wYXJlbnROb2RlO2RhdGEuZGlzcGxheT1ub2RlLnN0eWxlLmRpc3BsYXk7ZGF0YS5wb3NpdGlvbj1ub2RlLnN0eWxlLnBvc2l0aW9uO2lmKGRhdGEucGFyZW50KQpkYXRhLnBhcmVudC5yZW1vdmVDaGlsZChub2RlKX0KJChlbCkuZGF0YSgnYmxvY2tVSS5vblVuYmxvY2snLG9wdHMub25VbmJsb2NrKTt2YXIgej1vcHRzLmJhc2VaO3ZhciBseXIxLGx5cjIsbHlyMyxzO2lmKG1zaWV8fG9wdHMuZm9yY2VJZnJhbWUpCmx5cjE9JCgnPGlmcmFtZSBjbGFzcz0iYmxvY2tVSSIgc3R5bGU9InotaW5kZXg6JysoeisrKSsnO2Rpc3BsYXk6bm9uZTtib3JkZXI6bm9uZTttYXJnaW46MDtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0b3A6MDtsZWZ0OjAiIHNyYz0iJytvcHRzLmlmcmFtZVNyYysnIj48L2lmcmFtZT4nKTtlbHNlIGx5cjE9JCgnPGRpdiBjbGFzcz0iYmxvY2tVSSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9kaXY+Jyk7aWYob3B0cy50aGVtZSkKbHlyMj0kKCc8ZGl2IGNsYXNzPSJibG9ja1VJIGJsb2NrT3ZlcmxheSB1aS13aWRnZXQtb3ZlcmxheSIgc3R5bGU9InotaW5kZXg6JysoeisrKSsnO2Rpc3BsYXk6bm9uZSI+PC9kaXY+Jyk7ZWxzZSBseXIyPSQoJzxkaXYgY2xhc3M9ImJsb2NrVUkgYmxvY2tPdmVybGF5IiBzdHlsZT0iei1pbmRleDonKyh6KyspKyc7ZGlzcGxheTpub25lO2JvcmRlcjpub25lO21hcmdpbjowO3BhZGRpbmc6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RvcDowO2xlZnQ6MCI+PC9kaXY+Jyk7aWYob3B0cy50aGVtZSYmZnVsbCl7cz0nPGRpdiBjbGFzcz0iYmxvY2tVSSAnK29wdHMuYmxvY2tNc2dDbGFzcysnIGJsb2NrUGFnZSB1aS1kaWFsb2cgdWktd2lkZ2V0IHVpLWNvcm5lci1hbGwiIHN0eWxlPSJ6LWluZGV4OicrKHorMTApKyc7ZGlzcGxheTpub25lO3Bvc2l0aW9uOmZpeGVkIj4nO2lmKG9wdHMudGl0bGUpe3MrPSc8ZGl2IGNsYXNzPSJ1aS13aWRnZXQtaGVhZGVyIHVpLWRpYWxvZy10aXRsZWJhciB1aS1jb3JuZXItYWxsIGJsb2NrVGl0bGUiPicrKG9wdHMudGl0bGV8fCcmbmJzcDsnKSsnPC9kaXY+J30Kcys9JzxkaXYgY2xhc3M9InVpLXdpZGdldC1jb250ZW50IHVpLWRpYWxvZy1jb250ZW50Ij48L2Rpdj4nO3MrPSc8L2Rpdj4nfQplbHNlIGlmKG9wdHMudGhlbWUpe3M9JzxkaXYgY2xhc3M9ImJsb2NrVUkgJytvcHRzLmJsb2NrTXNnQ2xhc3MrJyBibG9ja0VsZW1lbnQgdWktZGlhbG9nIHVpLXdpZGdldCB1aS1jb3JuZXItYWxsIiBzdHlsZT0iei1pbmRleDonKyh6KzEwKSsnO2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZSI+JztpZihvcHRzLnRpdGxlKXtzKz0nPGRpdiBjbGFzcz0idWktd2lkZ2V0LWhlYWRlciB1aS1kaWFsb2ctdGl0bGViYXIgdWktY29ybmVyLWFsbCBibG9ja1RpdGxlIj4nKyhvcHRzLnRpdGxlfHwnJm5ic3A7JykrJzwvZGl2Pid9CnMrPSc8ZGl2IGNsYXNzPSJ1aS13aWRnZXQtY29udGVudCB1aS1kaWFsb2ctY29udGVudCI+PC9kaXY+JztzKz0nPC9kaXY+J30KZWxzZSBpZihmdWxsKXtzPSc8ZGl2IGNsYXNzPSJibG9ja1VJICcrb3B0cy5ibG9ja01zZ0NsYXNzKycgYmxvY2tQYWdlIiBzdHlsZT0iei1pbmRleDonKyh6KzEwKSsnO2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpmaXhlZCI+PC9kaXY+J30KZWxzZXtzPSc8ZGl2IGNsYXNzPSJibG9ja1VJICcrb3B0cy5ibG9ja01zZ0NsYXNzKycgYmxvY2tFbGVtZW50IiBzdHlsZT0iei1pbmRleDonKyh6KzEwKSsnO2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZSI+PC9kaXY+J30KbHlyMz0kKHMpO2lmKG1zZyl7aWYob3B0cy50aGVtZSl7bHlyMy5jc3ModGhlbWVkQ1NTKTtseXIzLmFkZENsYXNzKCd1aS13aWRnZXQtY29udGVudCcpfQplbHNlIGx5cjMuY3NzKGNzcyl9CmlmKCFvcHRzLnRoZW1lKQpseXIyLmNzcyhvcHRzLm92ZXJsYXlDU1MpO2x5cjIuY3NzKCdwb3NpdGlvbicsZnVsbD8nZml4ZWQnOidhYnNvbHV0ZScpO2lmKG1zaWV8fG9wdHMuZm9yY2VJZnJhbWUpCmx5cjEuY3NzKCdvcGFjaXR5JywwLjApO3ZhciBsYXllcnM9W2x5cjEsbHlyMixseXIzXSwkcGFyPWZ1bGw/JCgnYm9keScpOiQoZWwpOyQuZWFjaChsYXllcnMsZnVuY3Rpb24oKXt0aGlzLmFwcGVuZFRvKCRwYXIpfSk7aWYob3B0cy50aGVtZSYmb3B0cy5kcmFnZ2FibGUmJiQuZm4uZHJhZ2dhYmxlKXtseXIzLmRyYWdnYWJsZSh7aGFuZGxlOicudWktZGlhbG9nLXRpdGxlYmFyJyxjYW5jZWw6J2xpJ30pfQp2YXIgZXhwcj1zZXRFeHByJiYoISQuc3VwcG9ydC5ib3hNb2RlbHx8JCgnb2JqZWN0LGVtYmVkJyxmdWxsP251bGw6ZWwpLmxlbmd0aD4wKTtpZihpZTZ8fGV4cHIpe2lmKGZ1bGwmJm9wdHMuYWxsb3dCb2R5U3RyZXRjaCYmJC5zdXBwb3J0LmJveE1vZGVsKQokKCdodG1sLGJvZHknKS5jc3MoJ2hlaWdodCcsJzEwMCUnKTtpZigoaWU2fHwhJC5zdXBwb3J0LmJveE1vZGVsKSYmIWZ1bGwpe3ZhciB0PXN6KGVsLCdib3JkZXJUb3BXaWR0aCcpLGw9c3ooZWwsJ2JvcmRlckxlZnRXaWR0aCcpO3ZhciBmaXhUPXQ/JygwIC0gJyt0KycpJzowO3ZhciBmaXhMPWw/JygwIC0gJytsKycpJzowfQokLmVhY2gobGF5ZXJzLGZ1bmN0aW9uKGksbyl7dmFyIHM9b1swXS5zdHlsZTtzLnBvc2l0aW9uPSdhYnNvbHV0ZSc7aWYoaTwyKXtpZihmdWxsKQpzLnNldEV4cHJlc3Npb24oJ2hlaWdodCcsJ01hdGgubWF4KGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0LCBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCkgLSAoalF1ZXJ5LnN1cHBvcnQuYm94TW9kZWw/MDonK29wdHMucXVpcmtzbW9kZU9mZnNldEhhY2srJykgKyAicHgiJyk7ZWxzZSBzLnNldEV4cHJlc3Npb24oJ2hlaWdodCcsJ3RoaXMucGFyZW50Tm9kZS5vZmZzZXRIZWlnaHQgKyAicHgiJyk7aWYoZnVsbCkKcy5zZXRFeHByZXNzaW9uKCd3aWR0aCcsJ2pRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoICsgInB4IicpO2Vsc2Ugcy5zZXRFeHByZXNzaW9uKCd3aWR0aCcsJ3RoaXMucGFyZW50Tm9kZS5vZmZzZXRXaWR0aCArICJweCInKTtpZihmaXhMKXMuc2V0RXhwcmVzc2lvbignbGVmdCcsZml4TCk7aWYoZml4VClzLnNldEV4cHJlc3Npb24oJ3RvcCcsZml4VCl9CmVsc2UgaWYob3B0cy5jZW50ZXJZKXtpZihmdWxsKXMuc2V0RXhwcmVzc2lvbigndG9wJywnKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgfHwgZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQpIC8gMiAtICh0aGlzLm9mZnNldEhlaWdodCAvIDIpICsgKGJsYWggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA6IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSArICJweCInKTtzLm1hcmdpblRvcD0wfQplbHNlIGlmKCFvcHRzLmNlbnRlclkmJmZ1bGwpe3ZhciB0b3A9KG9wdHMuY3NzJiZvcHRzLmNzcy50b3ApP3BhcnNlSW50KG9wdHMuY3NzLnRvcCwxMCk6MDt2YXIgZXhwcmVzc2lvbj0nKChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA6IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSArICcrdG9wKycpICsgInB4Iic7cy5zZXRFeHByZXNzaW9uKCd0b3AnLGV4cHJlc3Npb24pfX0pfQppZihtc2cpe2lmKG9wdHMudGhlbWUpCmx5cjMuZmluZCgnLnVpLXdpZGdldC1jb250ZW50JykuYXBwZW5kKG1zZyk7ZWxzZSBseXIzLmFwcGVuZChtc2cpO2lmKG1zZy5qcXVlcnl8fG1zZy5ub2RlVHlwZSkKJChtc2cpLnNob3coKX0KaWYoKG1zaWV8fG9wdHMuZm9yY2VJZnJhbWUpJiZvcHRzLnNob3dPdmVybGF5KQpseXIxLnNob3coKTtpZihvcHRzLmZhZGVJbil7dmFyIGNiPW9wdHMub25CbG9jaz9vcHRzLm9uQmxvY2s6bm9PcDt2YXIgY2IxPShvcHRzLnNob3dPdmVybGF5JiYhbXNnKT9jYjpub09wO3ZhciBjYjI9bXNnP2NiOm5vT3A7aWYob3B0cy5zaG93T3ZlcmxheSkKbHlyMi5fZmFkZUluKG9wdHMuZmFkZUluLGNiMSk7aWYobXNnKQpseXIzLl9mYWRlSW4ob3B0cy5mYWRlSW4sY2IyKX0KZWxzZXtpZihvcHRzLnNob3dPdmVybGF5KQpseXIyLnNob3coKTtpZihtc2cpCmx5cjMuc2hvdygpO2lmKG9wdHMub25CbG9jaykKb3B0cy5vbkJsb2NrLmJpbmQobHlyMykoKX0KYmluZCgxLGVsLG9wdHMpO2lmKGZ1bGwpe3BhZ2VCbG9jaz1seXIzWzBdO3BhZ2VCbG9ja0Vscz0kKG9wdHMuZm9jdXNhYmxlRWxlbWVudHMscGFnZUJsb2NrKTtpZihvcHRzLmZvY3VzSW5wdXQpCnNldFRpbWVvdXQoZm9jdXMsMjApfQplbHNlIGNlbnRlcihseXIzWzBdLG9wdHMuY2VudGVyWCxvcHRzLmNlbnRlclkpO2lmKG9wdHMudGltZW91dCl7dmFyIHRvPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihmdWxsKQokLnVuYmxvY2tVSShvcHRzKTtlbHNlICQoZWwpLnVuYmxvY2sob3B0cyl9LG9wdHMudGltZW91dCk7JChlbCkuZGF0YSgnYmxvY2tVSS50aW1lb3V0Jyx0byl9fQpmdW5jdGlvbiByZW1vdmUoZWwsb3B0cyl7dmFyIGNvdW50O3ZhciBmdWxsPShlbD09d2luZG93KTt2YXIgJGVsPSQoZWwpO3ZhciBkYXRhPSRlbC5kYXRhKCdibG9ja1VJLmhpc3RvcnknKTt2YXIgdG89JGVsLmRhdGEoJ2Jsb2NrVUkudGltZW91dCcpO2lmKHRvKXtjbGVhclRpbWVvdXQodG8pOyRlbC5yZW1vdmVEYXRhKCdibG9ja1VJLnRpbWVvdXQnKX0Kb3B0cz0kLmV4dGVuZCh7fSwkLmJsb2NrVUkuZGVmYXVsdHMsb3B0c3x8e30pO2JpbmQoMCxlbCxvcHRzKTtpZihvcHRzLm9uVW5ibG9jaz09PW51bGwpe29wdHMub25VbmJsb2NrPSRlbC5kYXRhKCdibG9ja1VJLm9uVW5ibG9jaycpOyRlbC5yZW1vdmVEYXRhKCdibG9ja1VJLm9uVW5ibG9jaycpfQp2YXIgZWxzO2lmKGZ1bGwpCmVscz0kKCdib2R5JykuY2hpbGRyZW4oKS5maWx0ZXIoJy5ibG9ja1VJJykuYWRkKCdib2R5ID4gLmJsb2NrVUknKTtlbHNlIGVscz0kZWwuZmluZCgnPi5ibG9ja1VJJyk7aWYob3B0cy5jdXJzb3JSZXNldCl7aWYoZWxzLmxlbmd0aD4xKQplbHNbMV0uc3R5bGUuY3Vyc29yPW9wdHMuY3Vyc29yUmVzZXQ7aWYoZWxzLmxlbmd0aD4yKQplbHNbMl0uc3R5bGUuY3Vyc29yPW9wdHMuY3Vyc29yUmVzZXR9CmlmKGZ1bGwpCnBhZ2VCbG9jaz1wYWdlQmxvY2tFbHM9bnVsbDtpZihvcHRzLmZhZGVPdXQpe2NvdW50PWVscy5sZW5ndGg7ZWxzLnN0b3AoKS5mYWRlT3V0KG9wdHMuZmFkZU91dCxmdW5jdGlvbigpe2lmKC0tY291bnQ9PT0wKQpyZXNldChlbHMsZGF0YSxvcHRzLGVsKX0pfQplbHNlIHJlc2V0KGVscyxkYXRhLG9wdHMsZWwpfQpmdW5jdGlvbiByZXNldChlbHMsZGF0YSxvcHRzLGVsKXt2YXIgJGVsPSQoZWwpO2lmKCRlbC5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcpKQpyZXR1cm47ZWxzLmVhY2goZnVuY3Rpb24oaSxvKXtpZih0aGlzLnBhcmVudE5vZGUpCnRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX0pO2lmKGRhdGEmJmRhdGEuZWwpe2RhdGEuZWwuc3R5bGUuZGlzcGxheT1kYXRhLmRpc3BsYXk7ZGF0YS5lbC5zdHlsZS5wb3NpdGlvbj1kYXRhLnBvc2l0aW9uO2RhdGEuZWwuc3R5bGUuY3Vyc29yPSdkZWZhdWx0JztpZihkYXRhLnBhcmVudCkKZGF0YS5wYXJlbnQuYXBwZW5kQ2hpbGQoZGF0YS5lbCk7JGVsLnJlbW92ZURhdGEoJ2Jsb2NrVUkuaGlzdG9yeScpfQppZigkZWwuZGF0YSgnYmxvY2tVSS5zdGF0aWMnKSl7JGVsLmNzcygncG9zaXRpb24nLCdzdGF0aWMnKX0KaWYodHlwZW9mIG9wdHMub25VbmJsb2NrPT0nZnVuY3Rpb24nKQpvcHRzLm9uVW5ibG9jayhlbCxvcHRzKTt2YXIgYm9keT0kKGRvY3VtZW50LmJvZHkpLHc9Ym9keS53aWR0aCgpLGNzc1c9Ym9keVswXS5zdHlsZS53aWR0aDtib2R5LndpZHRoKHctMSkud2lkdGgodyk7Ym9keVswXS5zdHlsZS53aWR0aD1jc3NXfQpmdW5jdGlvbiBiaW5kKGIsZWwsb3B0cyl7dmFyIGZ1bGw9ZWw9PXdpbmRvdywkZWw9JChlbCk7aWYoIWImJihmdWxsJiYhcGFnZUJsb2NrfHwhZnVsbCYmISRlbC5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcpKSkKcmV0dXJuOyRlbC5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcsYik7aWYoIWZ1bGx8fCFvcHRzLmJpbmRFdmVudHN8fChiJiYhb3B0cy5zaG93T3ZlcmxheSkpCnJldHVybjt2YXIgZXZlbnRzPSdtb3VzZWRvd24gbW91c2V1cCBrZXlkb3duIGtleXByZXNzIGtleXVwIHRvdWNoc3RhcnQgdG91Y2hlbmQgdG91Y2htb3ZlJztpZihiKQokKGRvY3VtZW50KS5iaW5kKGV2ZW50cyxvcHRzLGhhbmRsZXIpO2Vsc2UgJChkb2N1bWVudCkudW5iaW5kKGV2ZW50cyxoYW5kbGVyKX0KZnVuY3Rpb24gaGFuZGxlcihlKXtpZihlLnR5cGU9PT0na2V5ZG93bicmJmUua2V5Q29kZSYmZS5rZXlDb2RlPT05KXtpZihwYWdlQmxvY2smJmUuZGF0YS5jb25zdHJhaW5UYWJLZXkpe3ZhciBlbHM9cGFnZUJsb2NrRWxzO3ZhciBmd2Q9IWUuc2hpZnRLZXkmJmUudGFyZ2V0PT09ZWxzW2Vscy5sZW5ndGgtMV07dmFyIGJhY2s9ZS5zaGlmdEtleSYmZS50YXJnZXQ9PT1lbHNbMF07aWYoZndkfHxiYWNrKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zm9jdXMoYmFjayl9LDEwKTtyZXR1cm4hMX19fQp2YXIgb3B0cz1lLmRhdGE7dmFyIHRhcmdldD0kKGUudGFyZ2V0KTtpZih0YXJnZXQuaGFzQ2xhc3MoJ2Jsb2NrT3ZlcmxheScpJiZvcHRzLm9uT3ZlcmxheUNsaWNrKQpvcHRzLm9uT3ZlcmxheUNsaWNrKGUpO2lmKHRhcmdldC5wYXJlbnRzKCdkaXYuJytvcHRzLmJsb2NrTXNnQ2xhc3MpLmxlbmd0aD4wKQpyZXR1cm4hMDtyZXR1cm4gdGFyZ2V0LnBhcmVudHMoKS5jaGlsZHJlbigpLmZpbHRlcignZGl2LmJsb2NrVUknKS5sZW5ndGg9PT0wfQpmdW5jdGlvbiBmb2N1cyhiYWNrKXtpZighcGFnZUJsb2NrRWxzKQpyZXR1cm47dmFyIGU9cGFnZUJsb2NrRWxzW2JhY2s9PT0hMD9wYWdlQmxvY2tFbHMubGVuZ3RoLTE6MF07aWYoZSkKZS5mb2N1cygpfQpmdW5jdGlvbiBjZW50ZXIoZWwseCx5KXt2YXIgcD1lbC5wYXJlbnROb2RlLHM9ZWwuc3R5bGU7dmFyIGw9KChwLm9mZnNldFdpZHRoLWVsLm9mZnNldFdpZHRoKS8yKS1zeihwLCdib3JkZXJMZWZ0V2lkdGgnKTt2YXIgdD0oKHAub2Zmc2V0SGVpZ2h0LWVsLm9mZnNldEhlaWdodCkvMiktc3oocCwnYm9yZGVyVG9wV2lkdGgnKTtpZih4KXMubGVmdD1sPjA/KGwrJ3B4Jyk6JzAnO2lmKHkpcy50b3A9dD4wPyh0KydweCcpOicwJ30KZnVuY3Rpb24gc3ooZWwscCl7cmV0dXJuIHBhcnNlSW50KCQuY3NzKGVsLHApLDEwKXx8MH19CmlmKHR5cGVvZiBkZWZpbmU9PT0nZnVuY3Rpb24nJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSl7ZGVmaW5lKFsnanF1ZXJ5J10sc2V0dXApfWVsc2V7c2V0dXAoalF1ZXJ5KX19KSgpOyhmdW5jdGlvbigkKXskLmFsZXJ0cz17dmVydGljYWxPZmZzZXQ6LTc1LGhvcml6b250YWxPZmZzZXQ6MCxyZXBvc2l0aW9uT25SZXNpemU6ITAsb3ZlcmxheU9wYWNpdHk6LjAxLG92ZXJsYXlDb2xvcjonI0ZGRicsZHJhZ2dhYmxlOiEwLG9rQnV0dG9uOicmbmJzcDtPSyZuYnNwOycsY2FuY2VsQnV0dG9uOicmbmJzcDtDYW5jZWwmbmJzcDsnLGRpYWxvZ0NsYXNzOm51bGwsYWxlcnQ6ZnVuY3Rpb24obWVzc2FnZSx0aXRsZSxjYWxsYmFjayl7aWYodGl0bGU9PW51bGwpdGl0bGU9J0FsZXJ0JzskLmFsZXJ0cy5fc2hvdyh0aXRsZSxtZXNzYWdlLG51bGwsJ2FsZXJ0JyxmdW5jdGlvbihyZXN1bHQpe2lmKGNhbGxiYWNrKWNhbGxiYWNrKHJlc3VsdCl9KX0sY29uZmlybTpmdW5jdGlvbihtZXNzYWdlLHRpdGxlLGNhbGxiYWNrKXtpZih0aXRsZT09bnVsbCl0aXRsZT0nQ29uZmlybSc7JC5hbGVydHMuX3Nob3codGl0bGUsbWVzc2FnZSxudWxsLCdjb25maXJtJyxmdW5jdGlvbihyZXN1bHQpe2lmKGNhbGxiYWNrKWNhbGxiYWNrKHJlc3VsdCl9KX0scHJvbXB0OmZ1bmN0aW9uKG1lc3NhZ2UsdmFsdWUsdGl0bGUsY2FsbGJhY2spe2lmKHRpdGxlPT1udWxsKXRpdGxlPSdQcm9tcHQnOyQuYWxlcnRzLl9zaG93KHRpdGxlLG1lc3NhZ2UsdmFsdWUsJ3Byb21wdCcsZnVuY3Rpb24ocmVzdWx0KXtpZihjYWxsYmFjayljYWxsYmFjayhyZXN1bHQpfSl9LF9zaG93OmZ1bmN0aW9uKHRpdGxlLG1zZyx2YWx1ZSx0eXBlLGNhbGxiYWNrKXskLmFsZXJ0cy5faGlkZSgpOyQuYWxlcnRzLl9vdmVybGF5KCdzaG93Jyk7JCgiQk9EWSIpLmFwcGVuZCgnPGRpdiBpZD0icG9wdXBfY29udGFpbmVyIj4nKyc8aDEgaWQ9InBvcHVwX3RpdGxlIj48L2gxPicrJzxkaXYgaWQ9InBvcHVwX2NvbnRlbnQiPicrJzxkaXYgaWQ9InBvcHVwX21lc3NhZ2UiPjwvZGl2PicrJzwvZGl2PicrJzwvZGl2PicpO2lmKCQuYWxlcnRzLmRpYWxvZ0NsYXNzKSQoIiNwb3B1cF9jb250YWluZXIiKS5hZGRDbGFzcygkLmFsZXJ0cy5kaWFsb2dDbGFzcyk7dmFyIHBvcz0oJC5icm93c2VyLm1zaWUmJnBhcnNlSW50KCQuYnJvd3Nlci52ZXJzaW9uKTw9Nik/J2Fic29sdXRlJzonZml4ZWQnOyQoIiNwb3B1cF9jb250YWluZXIiKS5jc3Moe3Bvc2l0aW9uOnBvcyx6SW5kZXg6OTk5OTkscGFkZGluZzowLG1hcmdpbjowfSk7JCgiI3BvcHVwX3RpdGxlIikudGV4dCh0aXRsZSk7JCgiI3BvcHVwX2NvbnRlbnQiKS5hZGRDbGFzcyh0eXBlKTskKCIjcG9wdXBfbWVzc2FnZSIpLnRleHQobXNnKTskKCIjcG9wdXBfbWVzc2FnZSIpLmh0bWwoJCgiI3BvcHVwX21lc3NhZ2UiKS50ZXh0KCkucmVwbGFjZSgvXG4vZywnPGJyIC8+JykpOyQoIiNwb3B1cF9jb250YWluZXIiKS5jc3Moe21pbldpZHRoOiQoIiNwb3B1cF9jb250YWluZXIiKS5vdXRlcldpZHRoKCksbWF4V2lkdGg6JCgiI3BvcHVwX2NvbnRhaW5lciIpLm91dGVyV2lkdGgoKX0pOyQuYWxlcnRzLl9yZXBvc2l0aW9uKCk7JC5hbGVydHMuX21haW50YWluUG9zaXRpb24oITApO3N3aXRjaCh0eXBlKXtjYXNlICdhbGVydCc6JCgiI3BvcHVwX21lc3NhZ2UiKS5hZnRlcignPGRpdiBpZD0icG9wdXBfcGFuZWwiPjxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSInKyQuYWxlcnRzLm9rQnV0dG9uKyciIGlkPSJwb3B1cF9vayIgLz48L2Rpdj4nKTskKCIjcG9wdXBfb2siKS5jbGljayhmdW5jdGlvbigpeyQuYWxlcnRzLl9oaWRlKCk7Y2FsbGJhY2soITApfSk7JCgiI3BvcHVwX29rIikuZm9jdXMoKS5rZXlwcmVzcyhmdW5jdGlvbihlKXtpZihlLmtleUNvZGU9PTEzfHxlLmtleUNvZGU9PTI3KSQoIiNwb3B1cF9vayIpLnRyaWdnZXIoJ2NsaWNrJyl9KTticmVhaztjYXNlICdjb25maXJtJzokKCIjcG9wdXBfbWVzc2FnZSIpLmFmdGVyKCc8ZGl2IGlkPSJwb3B1cF9wYW5lbCI+PGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IicrJC5hbGVydHMub2tCdXR0b24rJyIgaWQ9InBvcHVwX29rIiAvPiA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iJyskLmFsZXJ0cy5jYW5jZWxCdXR0b24rJyIgaWQ9InBvcHVwX2NhbmNlbCIgLz48L2Rpdj4nKTskKCIjcG9wdXBfb2siKS5jbGljayhmdW5jdGlvbigpeyQuYWxlcnRzLl9oaWRlKCk7aWYoY2FsbGJhY2spY2FsbGJhY2soITApfSk7JCgiI3BvcHVwX2NhbmNlbCIpLmNsaWNrKGZ1bmN0aW9uKCl7JC5hbGVydHMuX2hpZGUoKTtpZihjYWxsYmFjayljYWxsYmFjayghMSl9KTskKCIjcG9wdXBfb2siKS5mb2N1cygpOyQoIiNwb3B1cF9vaywgI3BvcHVwX2NhbmNlbCIpLmtleXByZXNzKGZ1bmN0aW9uKGUpe2lmKGUua2V5Q29kZT09MTMpJCgiI3BvcHVwX29rIikudHJpZ2dlcignY2xpY2snKTtpZihlLmtleUNvZGU9PTI3KSQoIiNwb3B1cF9jYW5jZWwiKS50cmlnZ2VyKCdjbGljaycpfSk7YnJlYWs7Y2FzZSAncHJvbXB0JzokKCIjcG9wdXBfbWVzc2FnZSIpLmFwcGVuZCgnPGJyIC8+PGlucHV0IHR5cGU9InRleHQiIHNpemU9IjMwIiBpZD0icG9wdXBfcHJvbXB0IiAvPicpLmFmdGVyKCc8ZGl2IGlkPSJwb3B1cF9wYW5lbCI+PGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IicrJC5hbGVydHMub2tCdXR0b24rJyIgaWQ9InBvcHVwX29rIiAvPiA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iJyskLmFsZXJ0cy5jYW5jZWxCdXR0b24rJyIgaWQ9InBvcHVwX2NhbmNlbCIgLz48L2Rpdj4nKTskKCIjcG9wdXBfcHJvbXB0Iikud2lkdGgoJCgiI3BvcHVwX21lc3NhZ2UiKS53aWR0aCgpKTskKCIjcG9wdXBfb2siKS5jbGljayhmdW5jdGlvbigpe3ZhciB2YWw9JCgiI3BvcHVwX3Byb21wdCIpLnZhbCgpOyQuYWxlcnRzLl9oaWRlKCk7aWYoY2FsbGJhY2spY2FsbGJhY2sodmFsKX0pOyQoIiNwb3B1cF9jYW5jZWwiKS5jbGljayhmdW5jdGlvbigpeyQuYWxlcnRzLl9oaWRlKCk7aWYoY2FsbGJhY2spY2FsbGJhY2sobnVsbCl9KTskKCIjcG9wdXBfcHJvbXB0LCAjcG9wdXBfb2ssICNwb3B1cF9jYW5jZWwiKS5rZXlwcmVzcyhmdW5jdGlvbihlKXtpZihlLmtleUNvZGU9PTEzKSQoIiNwb3B1cF9vayIpLnRyaWdnZXIoJ2NsaWNrJyk7aWYoZS5rZXlDb2RlPT0yNykkKCIjcG9wdXBfY2FuY2VsIikudHJpZ2dlcignY2xpY2snKX0pO2lmKHZhbHVlKSQoIiNwb3B1cF9wcm9tcHQiKS52YWwodmFsdWUpOyQoIiNwb3B1cF9wcm9tcHQiKS5mb2N1cygpLnNlbGVjdCgpO2JyZWFrfQppZigkLmFsZXJ0cy5kcmFnZ2FibGUpe3RyeXskKCIjcG9wdXBfY29udGFpbmVyIikuZHJhZ2dhYmxlKHtoYW5kbGU6JCgiI3BvcHVwX3RpdGxlIil9KTskKCIjcG9wdXBfdGl0bGUiKS5jc3Moe2N1cnNvcjonbW92ZSd9KX1jYXRjaChlKXt9fX0sX2hpZGU6ZnVuY3Rpb24oKXskKCIjcG9wdXBfY29udGFpbmVyIikucmVtb3ZlKCk7JC5hbGVydHMuX292ZXJsYXkoJ2hpZGUnKTskLmFsZXJ0cy5fbWFpbnRhaW5Qb3NpdGlvbighMSl9LF9vdmVybGF5OmZ1bmN0aW9uKHN0YXR1cyl7c3dpdGNoKHN0YXR1cyl7Y2FzZSAnc2hvdyc6JC5hbGVydHMuX292ZXJsYXkoJ2hpZGUnKTskKCJCT0RZIikuYXBwZW5kKCc8ZGl2IGlkPSJwb3B1cF9vdmVybGF5Ij48L2Rpdj4nKTskKCIjcG9wdXBfb3ZlcmxheSIpLmNzcyh7cG9zaXRpb246J2Fic29sdXRlJyx6SW5kZXg6OTk5OTgsdG9wOicwcHgnLGxlZnQ6JzBweCcsd2lkdGg6JzEwMCUnLGhlaWdodDokKGRvY3VtZW50KS5oZWlnaHQoKSxiYWNrZ3JvdW5kOiQuYWxlcnRzLm92ZXJsYXlDb2xvcixvcGFjaXR5OiQuYWxlcnRzLm92ZXJsYXlPcGFjaXR5fSk7YnJlYWs7Y2FzZSAnaGlkZSc6JCgiI3BvcHVwX292ZXJsYXkiKS5yZW1vdmUoKTticmVha319LF9yZXBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIHRvcD0oKCQod2luZG93KS5oZWlnaHQoKS8yKS0oJCgiI3BvcHVwX2NvbnRhaW5lciIpLm91dGVySGVpZ2h0KCkvMikpKyQuYWxlcnRzLnZlcnRpY2FsT2Zmc2V0O3ZhciBsZWZ0PSgoJCh3aW5kb3cpLndpZHRoKCkvMiktKCQoIiNwb3B1cF9jb250YWluZXIiKS5vdXRlcldpZHRoKCkvMikpKyQuYWxlcnRzLmhvcml6b250YWxPZmZzZXQ7aWYodG9wPDApdG9wPTA7aWYobGVmdDwwKWxlZnQ9MDtpZigkLmJyb3dzZXIubXNpZSYmcGFyc2VJbnQoJC5icm93c2VyLnZlcnNpb24pPD02KXRvcD10b3ArJCh3aW5kb3cpLnNjcm9sbFRvcCgpOyQoIiNwb3B1cF9jb250YWluZXIiKS5jc3Moe3RvcDp0b3ArJ3B4JyxsZWZ0OmxlZnQrJ3B4J30pOyQoIiNwb3B1cF9vdmVybGF5IikuaGVpZ2h0KCQoZG9jdW1lbnQpLmhlaWdodCgpKX0sX21haW50YWluUG9zaXRpb246ZnVuY3Rpb24oc3RhdHVzKXtpZigkLmFsZXJ0cy5yZXBvc2l0aW9uT25SZXNpemUpe3N3aXRjaChzdGF0dXMpe2Nhc2UgdHJ1ZTokKHdpbmRvdykuYmluZCgncmVzaXplJywkLmFsZXJ0cy5fcmVwb3NpdGlvbik7YnJlYWs7Y2FzZSBmYWxzZTokKHdpbmRvdykudW5iaW5kKCdyZXNpemUnLCQuYWxlcnRzLl9yZXBvc2l0aW9uKTticmVha319fX0KakFsZXJ0PWZ1bmN0aW9uKG1lc3NhZ2UsdGl0bGUsY2FsbGJhY2speyQuYWxlcnRzLmFsZXJ0KG1lc3NhZ2UsdGl0bGUsY2FsbGJhY2spfQpqQ29uZmlybT1mdW5jdGlvbihtZXNzYWdlLHRpdGxlLGNhbGxiYWNrKXskLmFsZXJ0cy5jb25maXJtKG1lc3NhZ2UsdGl0bGUsY2FsbGJhY2spfTtqUHJvbXB0PWZ1bmN0aW9uKG1lc3NhZ2UsdmFsdWUsdGl0bGUsY2FsbGJhY2speyQuYWxlcnRzLnByb21wdChtZXNzYWdlLHZhbHVlLHRpdGxlLGNhbGxiYWNrKX19KShqUXVlcnkpO3ZhciB0aGlzQ2FydElzUmVzcG9uc2l2ZT0hMTt2YXIgbWluV2lkdGg9MTMxMDt2YXIgcmZxQ2FydD0hMTtmdW5jdGlvbiBjaGVja0FuZFVwZGF0ZVN0YXRlRm9ybUZpZWxkKHRyaWdnZXIpe3ZhciBhamF4QWRkcmVzcz0iaW5jbHVkZXMvYWpheC9hamF4LmFkZHJlc3MucGhwIjt2YXIgY291bnRyeUlEPSQodHJpZ2dlcikudmFsKCk7JC5wb3N0KGFqYXhBZGRyZXNzLHtjb3VudHJ5SUQ6Y291bnRyeUlEfSxmdW5jdGlvbihkYXRhKXskKCcuc3RhdGVDb250YWluZXIgLmNvbC1zbS05JykuaHRtbChkYXRhKX0pfQokKGZ1bmN0aW9uKCl7c2V0dXBMYWJlbENsaWNrKCk7c2V0SGVhZGVyKCk7JCh3aW5kb3cpLnNjcm9sbChmdW5jdGlvbigpe3NldEhlYWRlcigpfSk7c2V0Q3VycmVudFllYXJJbkZvb3RlcigpO2hhbmRsZUNhdGVnb3J5TGlzdGluZ0l0ZW1Ib3ZlcigpO3JlbW92ZVBhZ2VTZWN0aW9uQnJlYWtzKCk7c2V0VXBIb3Zlck9uSGVhZGVySWNvbnMoKTtpZih0aGlzQ2FydElzUmVzcG9uc2l2ZT09PSEwKXtzZXROYXZpZ2F0aW9uKCk7JCh3aW5kb3cpLm9uKCdyZXNpemUnLGZ1bmN0aW9uKCl7c2V0TmF2aWdhdGlvbigpfSl9CnJlc3BvbnNpZnlUYWJsZXMoKTtyZXNwb25zaWZ5SWZyYW1lcygpOyQoIiNtYWduaWZ5IikuZXZlblpvb20oKTskKCcuZGF0ZXBpY2tlcicpLmRhdGVwaWNrZXIoKTskKCJhW2hyZWY9JyN0b3AnXSIpLmNsaWNrKGZ1bmN0aW9uKCl7JCgiaHRtbCwgYm9keSIpLmFuaW1hdGUoe3Njcm9sbFRvcDowfSwic2xvdyIpO3JldHVybiExfSk7c2V0VG90YWwoKTtpZihjYWxjUHJpY2UpeyQoIiNwUXR5Iikua2V5dXAoZnVuY3Rpb24oKXtzZXRUb3RhbCgpfSl9CiQoJyNjYXJ0X3F1YW50aXR5Jykub24oImtleXVwIGtleXByZXNzIixmdW5jdGlvbihlKXt2YXIgY29kZT1lLmtleUNvZGV8fGUud2hpY2g7aWYoY29kZT09MTMpe2UucHJldmVudERlZmF1bHQoKTtyZXR1cm4hMX19KTskKCIjY3JlYXRlX2FjY291bnQiKS5jaGFuZ2UoZnVuY3Rpb24oKXt0b2dnbGVQYXNzd29yZHMoKX0pOyQoIi5hZGRyZXNzLWZpZWxkIikub24oe2tleWRvd246ZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50LndoaWNoPT0xMyl7ZXZlbnQucHJldmVudERlZmF1bHQoKX19fSk7JCgiLmFkZHJlc3MtZmllbGQiKS5vbih7a2V5ZG93bjpmdW5jdGlvbihldmVudCl7aWYoZXZlbnQud2hpY2g9PTEzKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpfX19KTtvcmlnQ291bnRyeT0kKCIjY291bnRyeSIpLnZhbCgpO3RvZ2dsZV9vdGhlclN0YXRlKGFkZHIuc3RhdGVfb3RoZXIpO2luaXRfdmFsaWRhdGlvbigpO3RvZ2dsZVBhc3N3b3JkcygpOyQoIiNqcV9kaWFsb2ciKS5kaWFsb2coe2F1dG9PcGVuOiExLGNsb3NlOmZ1bmN0aW9uKGV2ZW50LHVpKXskKCIjanFfZGlhbG9nIikuaHRtbCgnJyl9fSk7JCgiYS5idXR0b24tY2hlY2tvdXQiKS5jbGljayhmdW5jdGlvbihldmVudCl7aWYobWluT3JkZXJfYW10PjAmJm1pbk9yZGVyX2FtdD5jYXJ0VG90YWxfYW10KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpOyQoIiNqcV9kaWFsb2ciKS5odG1sKG9yZGVyVW5kZXJUZXh0KS5kaWFsb2coIm9wZW4iKTtyZXR1cm4hMX1lbHNle3JldHVybiEwfX0pO2lmKHR5cGVvZiBkZWZhdWx0UGF5bWVudCE9J3VuZGVmaW5lZCcpe3ZhciBzZXRQYXk9ZGVmYXVsdFBheW1lbnQ7aWYoY3VyUGF5bWVudC5sZW5ndGg+MSl7c2V0UGF5PWN1clBheW1lbnR9CnNldFBheW1lbnRTZWxlY3RvcihzZXRQYXkpfQp3aW5XPXdpbmRvdy5vdXRlcldpZHRoO3dpbkg9d2luZG93Lm91dGVySGVpZ2h0O3dpblg9d2luZG93LnNjcmVlblg7d2luWT13aW5kb3cuc2NyZWVuWTskKHdpbmRvdykub24oJ3Jlc2l6ZScsZnVuY3Rpb24oKXt2YXIgaGVhZGVyU2VhcmNoPSQoJyNoZWFkZXJfc2VhcmNoJyk7aWYoaGVhZGVyU2VhcmNoLmxlbmd0aD4wKXtoZWFkZXJTZWFyY2gucmVtb3ZlQXR0cignc3R5bGUnKX19KTt1cGRhdGVMYXlvdXRPZlJGUUZvcm1JdGVtcygpfSk7ZnVuY3Rpb24gc2V0dXBMYWJlbENsaWNrKGUpeyQoJy5jbGlja2FibGUtbGFiZWwnKS51bmJpbmQoJ2NsaWNrJykuY2xpY2soZnVuY3Rpb24oKXt2YXIgbmFtZT0kKHRoaXMpLmF0dHIoJ2ZvcicpO3ZhciBzaWJsaW5nSW5wdXQ9JCh0aGlzKS5zaWJsaW5ncygiaW5wdXQiKTskKHNpYmxpbmdJbnB1dCkuZWFjaChmdW5jdGlvbigpe2lmKCQodGhpcykuYXR0cignbmFtZScpPT1uYW1lKXtpZigkKHRoaXMpLnByb3AoJ2NoZWNrZWQnKT09ITApeyQodGhpcykucHJvcCgnY2hlY2tlZCcsITEpfWVsc2V7JCh0aGlzKS5wcm9wKCdjaGVja2VkJywhMCl9fX0pfSkuaG92ZXIoZnVuY3Rpb24oKXskKHRoaXMpLmNzcygnY3Vyc29yJywncG9pbnRlcicpfSl9CmZ1bmN0aW9uIGhlbHAodGl0bGUsdGV4dCxjZW50ZXIpe2lmKCQoJyNoZWxwZGlhbG9nJykubGVuZ3RoPT0wKXt2YXIgc3R5bGU9Y2VudGVyPT0xPydzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyInOicnOyQoJ2JvZHknKS5hcHBlbmQoJzxkaXYgJytzdHlsZSsnIGlkPSJoZWxwZGlhbG9nIj4nK3RleHQrJzwvZGl2PicpfWVsc2V7aWYoY2VudGVyPT0xKXskKCcjaGVscGRpYWxvZycpLmNzcygndGV4dC1hbGlnbicsJ2NlbnRlcicpLmh0bWwodGV4dCl9ZWxzZXskKCcjaGVscGRpYWxvZycpLmNzcygndGV4dC1hbGlnbicsJ2xlZnQnKS5odG1sKHRleHQpfX0KJCgnI2hlbHBkaWFsb2cnKS5kaWFsb2coe21vZGFsOiEwLHdpZHRoOjQwMCxyZXNpemVhYmxlOiExLGRyYWdnYWJsZTohMSxkaWFsb2dDbGFzczonaGVscGRpYWxvZycsdGl0bGU6dGl0bGUsc2hvdzohMSxidXR0b25zOlt7dGV4dDoiT2siLGNsaWNrOmZ1bmN0aW9uKCl7JCh0aGlzKS5kaWFsb2coImNsb3NlIil9fV19KX0KZnVuY3Rpb24gaXNGcmFjdGlvbih2YWwpe3JldHVybiB2YWwubWF0Y2goL14oKFxkK1xzKT9cZCtcL1xkKykkL2cpIT1udWxsfQpmdW5jdGlvbiBjb252ZXJ0RnJhY3Rpb25Ub0RlY2ltYWwodmFsKXt2YXIgeT12YWwuc3BsaXQoJyAnKTtpZih5Lmxlbmd0aD4xKXt2YXIgej15WzFdLnNwbGl0KCcvJyk7cmV0dXJuIHBhcnNlRmxvYXQoKCt5WzBdKyh6WzBdL3pbMV0pKSl9ZWxzZXt2YXIgej15WzBdLnNwbGl0KCcvJyk7aWYoei5sZW5ndGg+MSl7cmV0dXJuIHBhcnNlRmxvYXQoKHpbMF0velsxXSkpfWVsc2V7cmV0dXJuIHBhcnNlRmxvYXQoelswXSl9fQpyZXR1cm4gMH0KZnVuY3Rpb24gcmVzcG9uc2lmeVRhYmxlcygpe3ZhciB0YWJsZXM9JCgndGFibGUnKTt0YWJsZXMuZWFjaChmdW5jdGlvbigpe2lmKCEkKHRoaXMpLnBhcmVudCgpLmhhc0NsYXNzKCd0YWJsZS1yZXNwb25zaXZlJykpeyQodGhpcykud3JhcCgnPGRpdiBjbGFzcz0idGFibGUtcmVzcG9uc2l2ZSI+PC9kaXY+Jyl9fSl9CmZ1bmN0aW9uIHNldE5hdmlnYXRpb24oKXt2YXIgd2luZG93V2lkdGg9JCh3aW5kb3cpLndpZHRoKCk7aWYodG91Y2hJc0VuYWJsZWQoKSYmKHdpbmRvd1dpZHRoPG1pbldpZHRoKSl7aGlkZU5hdmlnYXRpb24oKX1lbHNlIGlmKHRvdWNoSXNFbmFibGVkKCkmJihtaW5XaWR0aDx3aW5kb3dXaWR0aCkpe3Nob3dOYXZpZ2F0aW9uKCl9fQpmdW5jdGlvbiBoaWRlTmF2aWdhdGlvbigpeyQoJy51cHBlcl9uYXZfY29udGFpbmVyJykuY3NzKCdkaXNwbGF5Jywnbm9uZScpOyQoJy5tZWdhX25hdicpLmNzcygnZGlzcGxheScsJ25vbmUnKTskKCcudG9wX25hdicpLmNzcygnZGlzcGxheScsJ25vbmUnKTskKCcjcmVzcG9uc2l2ZU1lbnVCdXR0b24nKS5yZW1vdmVDbGFzcygnaGlkZGVuLW1kIGhpZGRlbi1sZycpfQpmdW5jdGlvbiBzaG93TmF2aWdhdGlvbigpeyQoJy51cHBlcl9uYXZfY29udGFpbmVyJykuY3NzKCdkaXNwbGF5JywnaW5saW5lLWJsb2NrJyk7JCgnLm1lZ2FfbmF2JykuY3NzKCdkaXNwbGF5JywnYmxvY2snKTskKCcudG9wX25hdicpLmNzcygnZGlzcGxheScsJ2lubGluZS1ibG9jaycpO2lmKCEkKCcjcmVzcG9uc2l2ZU1lbnVCdXR0b24nKS5oYXNDbGFzcygnaGlkZGVuLW1kIGhpZGRlbi1sZycpKXskKCcjcmVzcG9uc2l2ZU1lbnVCdXR0b24nKS5hZGRDbGFzcygnaGlkZGVuLW1kIGhpZGRlbi1sZycpfX0KZnVuY3Rpb24gdG91Y2hJc0VuYWJsZWQoKXt2YXIgcmV0dXJuVmFsdWU9ITE7aWYoJ29udG91Y2hzdGFydCcgaW4gd2luZG93fHxuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMpe3JldHVyblZhbHVlPSEwfQpyZXR1cm4gcmV0dXJuVmFsdWV9CmZ1bmN0aW9uIGR1bXBPYmplY3RUb0NvbnNvbGUob2JqKXskLmVhY2gob2JqLGZ1bmN0aW9uKGluZGV4LHZhbCl7Y29uc29sZS5sb2coaW5kZXgrJyAtLSAnK3ZhbCl9KX0KJC5mbi5hYnNvbHV0ZUNvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7dmFyIHNUb3A9JCh3aW5kb3cpLnNjcm9sbFRvcCgpO3ZhciBzTGVmdD0kKHdpbmRvdykuc2Nyb2xsTGVmdCgpO3ZhciB3PXRoaXMud2lkdGgoKTt2YXIgaD10aGlzLmhlaWdodCgpO3ZhciBvZmZzZXQ9dGhpcy5vZmZzZXQoKTt2YXIgJHA9dGhpczt2YXIgY291bnQ9MDt3aGlsZSh0eXBlb2YgJHA9PSdvYmplY3QnKXt2YXIgcE9mZnNldD0kcC5wYXJlbnQoKS5vZmZzZXQoKTtpZih0eXBlb2YgcE9mZnNldD09J3VuZGVmaW5lZCcpYnJlYWs7b2Zmc2V0LmxlZnQ9b2Zmc2V0LmxlZnQrKHBPZmZzZXQubGVmdCk7b2Zmc2V0LnRvcD1vZmZzZXQudG9wKyhwT2Zmc2V0LnRvcCk7JHA9JHAucGFyZW50KCl9CnZhciBwb3M9e2xlZnQ6b2Zmc2V0LmxlZnQrc0xlZnQscmlnaHQ6b2Zmc2V0LmxlZnQrdytzTGVmdCx0b3A6b2Zmc2V0LnRvcCtzVG9wLGJvdHRvbTpvZmZzZXQudG9wK2grc1RvcCx9CnBvcy50bD17eDpwb3MubGVmdCx5OnBvcy50b3B9O3Bvcy50cj17eDpwb3MucmlnaHQseTpwb3MudG9wfTtwb3MuYmw9e3g6cG9zLmxlZnQseTpwb3MuYm90dG9tfTtwb3MuYnI9e3g6cG9zLnJpZ2h0LHk6cG9zLmJvdHRvbX07Y29uc29sZS5sb2coJ2xlZnQ6ICcrcG9zLmxlZnQrJyAtIHJpZ2h0OiAnK3Bvcy5yaWdodCsnIC0gdG9wOiAnK3Bvcy50b3ArJyAtIGJvdHRvbTogJytwb3MuYm90dG9tKTtyZXR1cm4gcG9zfQpmdW5jdGlvbiBnZXRVcmxWYXJzKCl7dmFyIHZhcnM9e307dmFyIHBhcnRzPXdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1s/Jl0rKFtePSZdKyk9KFteJiNdKikvZ2ksZnVuY3Rpb24obSxrZXksdmFsdWUpe3ZhcnNba2V5XT12YWx1ZX0pO3JldHVybiB2YXJzfQpmdW5jdGlvbiBzdWJtaXRfcmZxKCl7dmFyIGZBY3Q9JCgiI2NhcnRfcXVhbnRpdHkiKS5hdHRyKCdhY3Rpb24nKTtpZihwcm9kdWN0SXNQYXJlbnQ9PSEwKXt2YXIgcmVwbEFjdD1mQWN0LnJlcGxhY2UoJ2FjdGlvbj11cGRhdGVfY2hpbGRfcHJvZHVjdCcsJ2FjdGlvbj11cGRhdGVfY2hpbGRfcmZxX3Byb2R1Y3QnKX1lbHNle3ZhciByZXBsQWN0PWZBY3QucmVwbGFjZSgnYWN0aW9uPXVwZGF0ZV9wcm9kdWN0JywnYWN0aW9uPXVwZGF0ZV9yZnFfcHJvZHVjdCcpfQokKCIjY2FydF9xdWFudGl0eSIpLmF0dHIoJ2FjdGlvbicscmVwbEFjdCkuc3VibWl0KCl9CmZ1bmN0aW9uIHNldFF0eSgpe2N1clF0eT0kKCIjcFF0eSIpLnZhbCgpO2lmKGN1clF0eTxxdHlQdHN8fGN1clF0eSVxdHlQdHMhPTApe25ld1F0eT1NYXRoLmNlaWwoY3VyUXR5L3F0eVB0cykqcXR5UHRzOyQoIiNwUXR5IikudmFsKG5ld1F0eSl9fQpmdW5jdGlvbiBzZXRUb3RhbCgpe2lmKHR5cGVvZiBwYlZhbHMhPSd1bmRlZmluZWQnKXtjdXJRdHk9JCgiI3BRdHkiKS52YWwoKTtpZihjdXJRdHk8MSl7Y3VyUXR5PTF9CnZhciBwYlZhbD0wO3ZhciBwYlNldD0hMTtmb3IodmFyIHggaW4gcGJWYWxzKXtwYlZhbD1wYlZhbHNbeF07cGJQdD1wYlZhbHMuaW5kZXhPZihwYlZhbCk7aWYoY3VyUXR5Pj1wYlB0KXtwYlNldD0hMDtjdXJQcmljZV9lYWNoPXBiVmFsLnRvRml4ZWQocHJpY2VEZWNpbWFscyk7Y3VyUHJpY2VfdG90YWw9KGN1clByaWNlX2VhY2gqY3VyUXR5KS50b0ZpeGVkKDIpO2lmKGN1clByaWNlX3RvdGFsPDApeyR0b3RhbFByaWNlPSQoIiNwcm9kdWN0c1ByaWNlX3RvdGFsIikudGV4dCgpLnJlcGxhY2UoIlRvdGFsIFByaWNlOiAiLCIiKTtyZXR1cm4gJCgiI3Byb2R1Y3RzUHJpY2VfZWFjaCIpLmh0bWwocHJpY2VFYWNoX2xhYmVsKyR0b3RhbFByaWNlKX1lbHNleyQoIiNwcm9kdWN0c1ByaWNlX2VhY2giKS5odG1sKHByaWNlRWFjaF9sYWJlbCsnJCcrY3VyUHJpY2VfZWFjaF9mb3JtYXR0ZWQpfX19CmlmKHBiU2V0IT0hMCl7Y3VyUHJpY2VfdG90YWw9KGJhc2VQcmljZSpjdXJRdHkpLnRvRml4ZWQoMil9CnZhciBwcmljZVRleHQ9Jyc7aWYoc3BlY2lhbFByaWNlX2VhY2g+MCl7cHJpY2VUZXh0PXByaWNlRWFjaF9sYWJlbCsnPHM+JCcrZnVsbFByaWNlKyc8L3M+PGJyIC8+JztwcmljZVRleHQrPSc8c3BhbiBjbGFzcz0icHJvZHVjdFNwZWNpYWxQcmljZSI+JytwcmljZVNwZWNpYWxfbGFiZWwrJyQnK3NwZWNpYWxQcmljZV9lYWNoKyc8L3NwYW4+J31lbHNle3ByaWNlVGV4dD1wcmljZUVhY2hfbGFiZWwrJyQnK2N1clByaWNlX2VhY2h9CiQoIiNwcm9kdWN0c1ByaWNlX2VhY2giKS5odG1sKHByaWNlVGV4dCk7aWYoYmFzZVByaWNlPT0wKXskKCIjcHJvZHVjdHNQcmljZV9lYWNoIikuY3NzKHsnZGlzcGxheSc6J25vbmUnfSl9CiQoIiNwcm9kdWN0c1ByaWNlX3RvdGFsIikuaHRtbChwcmljZVRvdGFsX2xhYmVsKyc8c3BhbiBpdGVtcHJvcD0icHJpY2VDdXJyZW5jeSIgY29udGVudD0iVVNEIj4kPC9zcGFuPjxzcGFuIGl0ZW1wcm9wPSJwcmljZSIgY29udGVudD0iJytjdXJQcmljZV90b3RhbCsnIj4nK2N1clByaWNlX3RvdGFsKyc8L3NwYW4+JytjdXJQcmljZV9lYWNoX2Zvcm1hdHRlZCk7JCgiI3Byb2R1Y3RfaW5mb19wcmljZV9ibG9jayIpLmNzcygndmlzaWJpbGl0eScsJ3Zpc2libGUnKX19CmZ1bmN0aW9uIHRleHRDb3VudGVyKGZpZWxkLGNvdW50ZXIsbWF4bGltaXQsbGluZWNvdW50ZXIpe3ZhciBmaWVsZFdpZHRoPXBhcnNlSW50KGZpZWxkLm9mZnNldFdpZHRoKTt2YXIgY2hhcmNudD1maWVsZC52YWx1ZS5sZW5ndGg7dmFyIHBlcmNlbnRhZ2U9cGFyc2VJbnQoMTAwLSgobWF4bGltaXQtY2hhcmNudCkqMTAwKS9tYXhsaW1pdCk7aWYocGVyY2VudGFnZT49NDApe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvdW50ZXIpLnN0eWxlLmNvbG9yPScjRkZGRkZGJ31lbHNle2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvdW50ZXIpLnN0eWxlLmNvbG9yPScjNEY0RjRGJ30KaWYobGluZWNvdW50ZXIpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvdW50ZXIpLnN0eWxlLndpZHRoPXBhcnNlSW50KChmaWVsZFdpZHRoKnBlcmNlbnRhZ2UpLzEwMCkrInB4Ijtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsaW5lY291bnRlcikuc3R5bGUud2lkdGg9cGFyc2VJbnQoZmllbGRXaWR0aCkrInB4Ijtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb3VudGVyKS5pbm5lckhUTUw9Ijxub2JyPk1heDogIitwZXJjZW50YWdlKyIlIC0gKCIrY2hhcmNudCsiLyIrbWF4bGltaXQrIik8L25vYnI+In1lbHNle2lmKGNoYXJjbnQ+bWF4bGltaXQpe2ZpZWxkLnZhbHVlPWZpZWxkLnZhbHVlLnN1YnN0cmluZygwLG1heGxpbWl0KX1lbHNle2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvdW50ZXIpLnN0eWxlLndpZHRoPXBhcnNlSW50KChmaWVsZFdpZHRoKnBlcmNlbnRhZ2UpLzEwMCkrInB4Ijtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb3VudGVyKS5pbm5lckhUTUw9Ijxub2JyPk1heDogIitwZXJjZW50YWdlKyIlIC0gKCIrY2hhcmNudCsiLyIrbWF4bGltaXQrIik8L25vYnI+Ijtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb3VudGVyKS5zdHlsZVsiYmFja2dyb3VuZC1jb2xvciJdPSJyZ2IoODAlLCIrKDEwMC1wZXJjZW50YWdlKSsiJSwiKygxMDAtcGVyY2VudGFnZSkrIiUpIn19fQpmdW5jdGlvbiBzdWJtaXRfY29udmVydF9jYXJ0KCl7aWYoJCgiI2NhcnRfYWN0aW9uIikubGVuZ3RoPjApe2lmKHJmcUNhcnQpeyQoIiNjYXJ0X2FjdGlvbiIpLnZhbCgncmZxMmJ1eScpOyQoIiNjYXJ0X3F1YW50aXR5Iikuc3VibWl0KCl9ZWxzZXskKCIjY2FydF9hY3Rpb24iKS52YWwoJ2J1eTJyZnEnKTskKCIjY2FydF9xdWFudGl0eSIpLnN1Ym1pdCgpfQpyZXR1cm4hMH19CmZ1bmN0aW9uIHByaW50UmVjZWlwdCgpe3dpblc9d2luZG93Lm91dGVyV2lkdGg7d2luSD13aW5kb3cub3V0ZXJIZWlnaHQ7d2luWD13aW5kb3cuc2NyZWVuWDt3aW5ZPXdpbmRvdy5zY3JlZW5ZO3hQb3M9d2luWCsoKHdpblctcmVjZWlwdFcpLzIpO3lQb3M9d2luWSsoKHdpbkgtcmVjZWlwdEgpLzIpO3dpbmRvdy5vcGVuKHByaW50UmVjZWlwdF91cmwsJ3JlY2VpcHRfd2luZG93Jywnd2lkdGg9JytyZWNlaXB0VysnLGhlaWdodD0nK3JlY2VpcHRIKycsbG9jYXRpb249bm8sbWVudWJhcj1ubyxzdGF0dXM9bm8sdG9vbGJhcj1ubycpLm1vdmVUbyh4UG9zLHlQb3MpfQpmdW5jdGlvbiB3cml0ZVNlc3Npb25Db29raWUoY29va2llTmFtZSxjb29raWVWYWx1ZSl7ZG9jdW1lbnQuY29va2llPWVzY2FwZShjb29raWVOYW1lKSsiPSIrZXNjYXBlKGNvb2tpZVZhbHVlKSsiOyBwYXRoPS8ifQpmdW5jdGlvbiBnZXRDb29raWVWYWx1ZShjb29raWVOYW1lKXt2YXIgZXhwPW5ldyBSZWdFeHAoZXNjYXBlKGNvb2tpZU5hbWUpKyI9KFteO10rKSIpO2lmKGV4cC50ZXN0KGRvY3VtZW50LmNvb2tpZSsiOyIpKXtleHAuZXhlYyhkb2N1bWVudC5jb29raWUrIjsiKTtyZXR1cm4gdW5lc2NhcGUoUmVnRXhwLiQxKX1lbHNle3JldHVybiExfX0KZnVuY3Rpb24gZGVsZXRlQ29va2llKGNvb2tpZU5hbWUpe3JldHVybiBkb2N1bWVudC5jb29raWU9Y29va2llTmFtZSsnPTsgTWF4LUFnZT0tOTk5OTk5OTk7J30KZnVuY3Rpb24gdG9nZ2xlU2VhcmNoKCl7dmFyIHdpbmRvd1dpZHRoPSQod2luZG93KS53aWR0aCgpO2lmKHdpbmRvd1dpZHRoPDc2OCl7dmFyIG1vYmlsZVNlYXJjaD0kKCcubW9iaWxlLXNlYXJjaCcpO2lmKG1vYmlsZVNlYXJjaC5sZW5ndGg+MCl7aWYobW9iaWxlU2VhcmNoLmNzcygnZGlzcGxheScpPT09J25vbmUnKXttb2JpbGVTZWFyY2guY3NzKCdkaXNwbGF5JywnYmxvY2snKTttb2JpbGVTZWFyY2guY3NzKCdvcGFjaXR5JywxKX1lbHNle21vYmlsZVNlYXJjaC5jc3MoJ29wYWNpdHknLDApO3NldFRpbWVvdXQoZnVuY3Rpb24oKXttb2JpbGVTZWFyY2guY3NzKCdkaXNwbGF5Jywnbm9uZScpfSw1MDApfX19ZWxzZXt2YXIgc2VhcmNoSW5wdXQ9JCgnI3F1aWNrc2VhcmNoX2tleXdvcmRzJyk7dmFyIHNlYXJjaEJ1dHRvbj0kKCcucXVpY2tzZWFyY2gtYnV0dG9uJyk7dmFyIGhlYWRlclNlYXJjaD0kKCcjaGVhZGVyX3NlYXJjaCcpO2lmKHNlYXJjaElucHV0LmNzcygndmlzaWJpbGl0eScpPT09J2hpZGRlbicpe2hlYWRlclNlYXJjaC5jc3MoJ3dpZHRoJywnMjkwcHgnKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VhcmNoQnV0dG9uLmNzcygnd2lkdGgnLCc3N3B4Jyk7c2VhcmNoSW5wdXQuY3NzKCd2aXNpYmlsaXR5JywndmlzaWJsZScpO3NlYXJjaEJ1dHRvbi5jc3MoJ3Zpc2liaWxpdHknLCd2aXNpYmxlJyk7c2VhcmNoSW5wdXQuY3NzKCdvcGFjaXR5JywnMScpO3NlYXJjaEJ1dHRvbi5jc3MoJ29wYWNpdHknLCcxJyl9LDUwMCl9ZWxzZXtoZWFkZXJTZWFyY2guY3NzKCd3aWR0aCcsJzc1cHgnKTtzZWFyY2hCdXR0b24uY3NzKCd3aWR0aCcsJzAnKTtzZWFyY2hJbnB1dC5jc3MoJ3Zpc2liaWxpdHknLCdoaWRkZW4nKTtzZWFyY2hCdXR0b24uY3NzKCd2aXNpYmlsaXR5JywnaGlkZGVuJyk7c2VhcmNoSW5wdXQuY3NzKCdvcGFjaXR5JywnMCcpO3NlYXJjaEJ1dHRvbi5jc3MoJ29wYWNpdHknLCcwJyl9CmxldCBxdWlja1NlYXJjaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVpY2tzZWFyY2gnKTtxdWlja1NlYXJjaC5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyl9fQpmdW5jdGlvbiB0b2dnbGVTZWFyY2hNb2JpbGUoKXt2YXIgbW9iaWxlU2VhcmNoPSQoJy5tb2JpbGUtc2VhcmNoLW1vYmlsZScpO2lmKG1vYmlsZVNlYXJjaC5sZW5ndGg+MCl7aWYobW9iaWxlU2VhcmNoLmNzcygnZGlzcGxheScpPT09J25vbmUnKXttb2JpbGVTZWFyY2guY3NzKCdkaXNwbGF5JywnYmxvY2snKTttb2JpbGVTZWFyY2guY3NzKCdvcGFjaXR5JywxKX1lbHNle21vYmlsZVNlYXJjaC5jc3MoJ29wYWNpdHknLDApO3NldFRpbWVvdXQoZnVuY3Rpb24oKXttb2JpbGVTZWFyY2guY3NzKCdkaXNwbGF5Jywnbm9uZScpfSw1MDApfX19CnZhciBtb2JpbGVIZWFkZXJJc1Nob3dpbmc9ITE7ZnVuY3Rpb24gc2V0SGVhZGVyKCl7dmFyIHNjcm9sbFRvcD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO3ZhciBoZWFkZXJXcmFwcGVyPSQoJyNoZWFkZXJXcmFwcGVyJyk7dmFyIHJlZ3VsYXJIZWFkZXI9JCgnI2hlYWRlcicpO3ZhciBtb2JpbGVIZWFkZXI9JCgnI2hlYWRlci1tb2JpbGUnKTt2YXIgd2luZG93V2lkdGg9JCh3aW5kb3cpLndpZHRoKCk7aWYod2luZG93V2lkdGg8OTkyKXtpZihtb2JpbGVIZWFkZXJJc1Nob3dpbmc9PT0hMSl7cmVndWxhckhlYWRlci5jc3Moe29wYWNpdHk6MCx2aXNpYmlsaXR5OiJoaWRkZW4ifSk7c2V0VGltZW91dChmdW5jdGlvbigpe2hlYWRlcldyYXBwZXIuY3NzKCdiYWNrZ3JvdW5kJywnI2ZmZmZmZicpO21vYmlsZUhlYWRlci5jc3MoJ2Rpc3BsYXknLCdibG9jaycpO3JlZ3VsYXJIZWFkZXIuY3NzKCdkaXNwbGF5Jywnbm9uZScpO21vYmlsZUhlYWRlci5jc3Moe29wYWNpdHk6MSx2aXNpYmlsaXR5OiJ2aXNpYmxlIixoZWlnaHQ6IjY2cHgifSk7JCgnI2hlYWRlckxlZnQtbW9iaWxlJykuY3NzKCdoZWlnaHQnLCdhdXRvJyk7JCgnI2hlYWRlclJpZ2h0LW1vYmlsZScpLmNzcygnaGVpZ2h0JywnYXV0bycpfSwzMDApO21vYmlsZUhlYWRlcklzU2hvd2luZz0hMH19ZWxzZXtpZihzY3JvbGxUb3AhPT0wKXtpZihtb2JpbGVIZWFkZXJJc1Nob3dpbmc9PT0hMSl7cmVndWxhckhlYWRlci5jc3Moe29wYWNpdHk6MCx2aXNpYmlsaXR5OiJoaWRkZW4ifSk7c2V0VGltZW91dChmdW5jdGlvbigpe2hlYWRlcldyYXBwZXIuY3NzKCdiYWNrZ3JvdW5kJywnI2ZmZmZmZicpO21vYmlsZUhlYWRlci5jc3MoJ2Rpc3BsYXknLCdibG9jaycpO3JlZ3VsYXJIZWFkZXIuY3NzKCdkaXNwbGF5Jywnbm9uZScpO21vYmlsZUhlYWRlci5jc3Moe29wYWNpdHk6MSx2aXNpYmlsaXR5OiJ2aXNpYmxlIixoZWlnaHQ6IjY2cHgifSk7JCgnI2hlYWRlckxlZnQtbW9iaWxlJykuY3NzKCdoZWlnaHQnLCdhdXRvJyk7JCgnI2hlYWRlclJpZ2h0LW1vYmlsZScpLmNzcygnaGVpZ2h0JywnYXV0bycpfSwzMDApO21vYmlsZUhlYWRlcklzU2hvd2luZz0hMH19ZWxzZXtpZihtb2JpbGVIZWFkZXJJc1Nob3dpbmc9PT0hMCl7bW9iaWxlSGVhZGVyLmNzcyh7b3BhY2l0eTowLHZpc2liaWxpdHk6ImhpZGRlbiJ9KTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aGVhZGVyV3JhcHBlci5jc3MoJ2JhY2tncm91bmQnLCd0cmFuc3BhcmVudCcpO3JlZ3VsYXJIZWFkZXIuY3NzKCdkaXNwbGF5JywnYmxvY2snKTttb2JpbGVIZWFkZXIuY3NzKCdkaXNwbGF5Jywnbm9uZScpO3JlZ3VsYXJIZWFkZXIuY3NzKHtvcGFjaXR5OjEsdmlzaWJpbGl0eToidmlzaWJsZSIsaGVpZ2h0OiI2NnB4In0pOyQoJyNoZWFkZXJMZWZ0LW1vYmlsZScpLmNzcygnaGVpZ2h0JywnMHB4Jyk7JCgnI2hlYWRlclJpZ2h0LW1vYmlsZScpLmNzcygnaGVpZ2h0JywnMHB4Jyl9LDEwMCk7bW9iaWxlSGVhZGVySXNTaG93aW5nPSExfX19fQpmdW5jdGlvbiBzZXRDdXJyZW50WWVhckluRm9vdGVyKCl7dmFyIGN1cnJlbnRZZWFyPSQoJyNmb290ZXItY3VycmVudC15ZWFyJyk7aWYoY3VycmVudFllYXIubGVuZ3RoPjApe2N1cnJlbnRZZWFyLnRleHQobmV3IERhdGUoKS5nZXRGdWxsWWVhcigpKX19CmZ1bmN0aW9uIGhhbmRsZUNhdGVnb3J5TGlzdGluZ0l0ZW1Ib3Zlcigpe3ZhciBjYXRlZ29yeUxpc3RpbmdJdGVtcz0kKCcuY2F0TGlzdGluZ0JveCcpO2lmKGNhdGVnb3J5TGlzdGluZ0l0ZW1zLmxlbmd0aD4wKXtjYXRlZ29yeUxpc3RpbmdJdGVtcy5lYWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS5ob3ZlcihmdW5jdGlvbigpe3ZhciBpY29uPSQodGhpcykuZmluZCgnaW1nLmltZy1yZXNwb25zaXZlJyk7dmFyIGN1cnJlbnRTcmM9aWNvbi5hdHRyKCdzcmMnKTtpZighY3VycmVudFNyYy5pbmNsdWRlcygnX2hvdmVyLnBuZycpKXt2YXIgbmV3U3JjPWN1cnJlbnRTcmMuc2xpY2UoMCwtNCkrIl9ob3Zlci5wbmciO2ljb24uYXR0cignc3JjJyxuZXdTcmMpfX0sZnVuY3Rpb24oKXt2YXIgaWNvbj0kKHRoaXMpLmZpbmQoJ2ltZy5pbWctcmVzcG9uc2l2ZScpO3ZhciBjdXJyZW50U3JjPWljb24uYXR0cignc3JjJyk7aWYoY3VycmVudFNyYy5pbmNsdWRlcygnX2hvdmVyLnBuZycpKXt2YXIgbmV3U3JjPWN1cnJlbnRTcmMuc2xpY2UoMCwtMTApKyIucG5nIjtpY29uLmF0dHIoJ3NyYycsbmV3U3JjKX19KX0pfX0KZnVuY3Rpb24gcmVtb3ZlUGFnZVNlY3Rpb25CcmVha3MoKXt2YXIgcGFnZVNlY3Rpb25Sb3dzPSQoJy5wYWdlLXNlY3Rpb24gLnJvdycpO2lmKHBhZ2VTZWN0aW9uUm93cy5sZW5ndGg+MCl7cGFnZVNlY3Rpb25Sb3dzLmVhY2goZnVuY3Rpb24oKXt2YXIgY2hpbGRyZW49JCh0aGlzKS5jaGlsZHJlbigpO2Zvcih2YXIgY2hpbGQgaW4gY2hpbGRyZW4pe2lmKGNoaWxkcmVuLmhhc093blByb3BlcnR5KGNoaWxkKSl7aWYoY2hpbGRyZW5bY2hpbGRdLm5vZGVOYW1lPT09IkJSIil7JChjaGlsZHJlbltjaGlsZF0pLnJlbW92ZSgpfX19fSl9fQpmdW5jdGlvbiBzZXRVcEhvdmVyT25IZWFkZXJJY29ucygpe3ZhciBwb3J0Zm9saW9JbWFnZT0kKCdpbWdbc3JjPSJpbWFnZXMvaWNvbnMvcG9ydGZvbGlvLWljb24ucG5nIl0nKTt2YXIgc2VhcmNoSW1hZ2U9JCgnaW1nW3NyYz0iaW1hZ2VzL2ljb25zL3NlYXJjaC1pY29uLnBuZyJdJyk7cG9ydGZvbGlvSW1hZ2UuaG92ZXIoZnVuY3Rpb24oKXtwb3J0Zm9saW9JbWFnZS5hdHRyKCdzcmMnLCdpbWFnZXMvaWNvbnMvcG9ydGZvbGlvLWljb25faG92ZXIucG5nJyl9LGZ1bmN0aW9uKCl7cG9ydGZvbGlvSW1hZ2UuYXR0cignc3JjJywnaW1hZ2VzL2ljb25zL3BvcnRmb2xpby1pY29uLnBuZycpfSk7c2VhcmNoSW1hZ2UuaG92ZXIoZnVuY3Rpb24oKXtzZWFyY2hJbWFnZS5hdHRyKCdzcmMnLCdpbWFnZXMvaWNvbnMvc2VhcmNoLWljb25faG92ZXIucG5nJyl9LGZ1bmN0aW9uKCl7c2VhcmNoSW1hZ2UuYXR0cignc3JjJywnaW1hZ2VzL2ljb25zL3NlYXJjaC1pY29uLnBuZycpfSl9CmZ1bmN0aW9uIG9wZW5TZWFyY2goKXtsZXQgcXVpY2tTZWFyY2g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1aWNrc2VhcmNoJyk7aWYoIXF1aWNrU2VhcmNoLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpKXt2YXIgc2VhcmNoSW5wdXQ9JCgnI3F1aWNrc2VhcmNoX2tleXdvcmRzJyk7dmFyIHNlYXJjaEJ1dHRvbj0kKCcucXVpY2tzZWFyY2gtYnV0dG9uJyk7dmFyIGhlYWRlclNlYXJjaD0kKCcjaGVhZGVyX3NlYXJjaCcpO2lmKHNlYXJjaElucHV0LmNzcygndmlzaWJpbGl0eScpPT09J2hpZGRlbicpe2hlYWRlclNlYXJjaC5jc3MoJ3dpZHRoJywnMjkwcHgnKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VhcmNoQnV0dG9uLmNzcygnd2lkdGgnLCc3N3B4Jyk7c2VhcmNoSW5wdXQuY3NzKCd2aXNpYmlsaXR5JywndmlzaWJsZScpO3NlYXJjaEJ1dHRvbi5jc3MoJ3Zpc2liaWxpdHknLCd2aXNpYmxlJyk7c2VhcmNoSW5wdXQuY3NzKCdvcGFjaXR5JywnMScpO3NlYXJjaEJ1dHRvbi5jc3MoJ29wYWNpdHknLCcxJyl9LDUwMCl9CnF1aWNrU2VhcmNoLmNsYXNzTGlzdC5hZGQoJ29wZW4nKX19CmZ1bmN0aW9uIHJlc3BvbnNpZnlJZnJhbWVzKCl7dmFyIGlmcmFtZXM9JCgnI2Jsb2ctbWFpbi1jb250ZW50LWNvbnRhaW5lciBpZnJhbWUnKTtpZihpZnJhbWVzLmxlbmd0aD4wKXtpZnJhbWVzLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLmFkZENsYXNzKCdlbWJlZC1yZXNwb25zaXZlLWl0ZW0nKTskKHRoaXMpLndyYXAoJzxkaXYgY2xhc3M9InJlc3BvbnNpdmUtaWZyYW1lIj48ZGl2IGNsYXNzPSJlbWJlZC1yZXNwb25zaXZlIGVtYmVkLXJlc3BvbnNpdmUtMTZieTkiPjwvZGl2PjwvZGl2PicpfSl9fQpmdW5jdGlvbiB1cGRhdGVMYXlvdXRPZlJGUUZvcm1JdGVtcygpe3ZhciBpbnRlcmVzdGVkSW49JCgnI3JmZl9kYmZvcm1zX3JmcSAjcmZpX2ludGVyZXN0ZWRfaW4nKTtpZihpbnRlcmVzdGVkSW4ubGVuZ3RoPjApe3ZhciBvcHRpb25EaXZzPWludGVyZXN0ZWRJbi5maW5kKCcucmZfdmFsdWUgPiBkaXYnKTtvcHRpb25EaXZzLndyYXBBbGwoJzxkaXYgY2xhc3M9InJvdyI+PC9kaXY+Jyk7b3B0aW9uRGl2cy5lYWNoKGZ1bmN0aW9uKGksZSl7JChlKS53cmFwKCc8ZGl2IGNsYXNzPSJjb2wtc20tMTIgY29sLW1kLTItNCI+PC9kaXY+Jyl9KX19O3ZhciBrZXlTdHI9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IjtmdW5jdGlvbiBlbmNvZGU2NChpbnB1dCl7aW5wdXQ9ZXNjYXBlKGlucHV0KTt2YXIgb3V0cHV0PSIiO3ZhciBjaHIxLGNocjIsY2hyMz0iIjt2YXIgZW5jMSxlbmMyLGVuYzMsZW5jND0iIjt2YXIgaT0wO2Rve2NocjE9aW5wdXQuY2hhckNvZGVBdChpKyspO2NocjI9aW5wdXQuY2hhckNvZGVBdChpKyspO2NocjM9aW5wdXQuY2hhckNvZGVBdChpKyspO2VuYzE9Y2hyMT4+MjtlbmMyPSgoY2hyMSYzKTw8NCl8KGNocjI+PjQpO2VuYzM9KChjaHIyJjE1KTw8Mil8KGNocjM+PjYpO2VuYzQ9Y2hyMyY2MztpZihpc05hTihjaHIyKSl7ZW5jMz1lbmM0PTY0fWVsc2UgaWYoaXNOYU4oY2hyMykpe2VuYzQ9NjR9Cm91dHB1dD1vdXRwdXQra2V5U3RyLmNoYXJBdChlbmMxKStrZXlTdHIuY2hhckF0KGVuYzIpK2tleVN0ci5jaGFyQXQoZW5jMykra2V5U3RyLmNoYXJBdChlbmM0KTtjaHIxPWNocjI9Y2hyMz0iIjtlbmMxPWVuYzI9ZW5jMz1lbmM0PSIifXdoaWxlKGk8aW5wdXQubGVuZ3RoKTtyZXR1cm4gb3V0cHV0fQpmdW5jdGlvbiBkZWNvZGU2NChpbnB1dCl7dmFyIG91dHB1dD0iIjt2YXIgY2hyMSxjaHIyLGNocjM9IiI7dmFyIGVuYzEsZW5jMixlbmMzLGVuYzQ9IiI7dmFyIGk9MDt2YXIgYmFzZTY0dGVzdD0vW15BLVphLXowLTlcK1wvXD1dL2c7aWYoYmFzZTY0dGVzdC5leGVjKGlucHV0KSl7YWxlcnQoIlRoZXJlIHdlcmUgaW52YWxpZCBiYXNlNjQgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgdGV4dC5cbiIrIlZhbGlkIGJhc2U2NCBjaGFyYWN0ZXJzIGFyZSBBLVosIGEteiwgMC05LCAnKycsICcvJyxhbmQgJz0nXG4iKyJFeHBlY3QgZXJyb3JzIGluIGRlY29kaW5nLiIpfQppbnB1dD1pbnB1dC5yZXBsYWNlKC9bXkEtWmEtejAtOVwrXC9cPV0vZywiIik7ZG97ZW5jMT1rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7ZW5jMj1rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7ZW5jMz1rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7ZW5jND1rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7Y2hyMT0oZW5jMTw8Mil8KGVuYzI+PjQpO2NocjI9KChlbmMyJjE1KTw8NCl8KGVuYzM+PjIpO2NocjM9KChlbmMzJjMpPDw2KXxlbmM0O291dHB1dD1vdXRwdXQrU3RyaW5nLmZyb21DaGFyQ29kZShjaHIxKTtpZihlbmMzIT02NCl7b3V0cHV0PW91dHB1dCtTdHJpbmcuZnJvbUNoYXJDb2RlKGNocjIpfQppZihlbmM0IT02NCl7b3V0cHV0PW91dHB1dCtTdHJpbmcuZnJvbUNoYXJDb2RlKGNocjMpfQpjaHIxPWNocjI9Y2hyMz0iIjtlbmMxPWVuYzI9ZW5jMz1lbmM0PSIifXdoaWxlKGk8aW5wdXQubGVuZ3RoKTtyZXR1cm4gdW5lc2NhcGUob3V0cHV0KX07ZnVuY3Rpb24gdW5zZXJpYWxpemUoZGF0YSl7dmFyICRnbG9iYWw9KHR5cGVvZiB3aW5kb3chPT0ndW5kZWZpbmVkJz93aW5kb3c6Z2xvYmFsKQp2YXIgdXRmOE92ZXJoZWFkPWZ1bmN0aW9uKHN0cil7dmFyIHM9c3RyLmxlbmd0aApmb3IodmFyIGk9c3RyLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgY29kZT1zdHIuY2hhckNvZGVBdChpKQppZihjb2RlPjB4N2YmJmNvZGU8PTB4N2ZmKXtzKyt9ZWxzZSBpZihjb2RlPjB4N2ZmJiZjb2RlPD0weGZmZmYpe3MrPTJ9CmlmKGNvZGU+PTB4REMwMCYmY29kZTw9MHhERkZGKXtpLS19fQpyZXR1cm4gcy0xfQp2YXIgZXJyb3I9ZnVuY3Rpb24odHlwZSxtc2csZmlsZW5hbWUsbGluZSl7dGhyb3cgbmV3ICRnbG9iYWxbdHlwZV0obXNnLGZpbGVuYW1lLGxpbmUpfQp2YXIgcmVhZFVudGlsPWZ1bmN0aW9uKGRhdGEsb2Zmc2V0LHN0b3BjaHIpe3ZhciBpPTIKdmFyIGJ1Zj1bXQp2YXIgY2hyPWRhdGEuc2xpY2Uob2Zmc2V0LG9mZnNldCsxKQp3aGlsZShjaHIhPT1zdG9wY2hyKXtpZigoaStvZmZzZXQpPmRhdGEubGVuZ3RoKXtlcnJvcignRXJyb3InLCdJbnZhbGlkJyl9CmJ1Zi5wdXNoKGNocikKY2hyPWRhdGEuc2xpY2Uob2Zmc2V0KyhpLTEpLG9mZnNldCtpKQppKz0xfQpyZXR1cm5bYnVmLmxlbmd0aCxidWYuam9pbignJyldfQp2YXIgcmVhZENocnM9ZnVuY3Rpb24oZGF0YSxvZmZzZXQsbGVuZ3RoKXt2YXIgaSxjaHIsYnVmCmJ1Zj1bXQpmb3IoaT0wO2k8bGVuZ3RoO2krKyl7Y2hyPWRhdGEuc2xpY2Uob2Zmc2V0KyhpLTEpLG9mZnNldCtpKQpidWYucHVzaChjaHIpCmxlbmd0aC09dXRmOE92ZXJoZWFkKGNocil9CnJldHVybltidWYubGVuZ3RoLGJ1Zi5qb2luKCcnKV19CmZ1bmN0aW9uIF91bnNlcmlhbGl6ZShkYXRhLG9mZnNldCl7dmFyIGR0eXBlCnZhciBkYXRhb2Zmc2V0CnZhciBrZXlhbmRjaHJzCnZhciBrZXlzCnZhciBjb250aWcKdmFyIGxlbmd0aAp2YXIgYXJyYXkKdmFyIHJlYWRkYXRhCnZhciByZWFkRGF0YQp2YXIgY2NvdW50CnZhciBzdHJpbmdsZW5ndGgKdmFyIGkKdmFyIGtleQp2YXIga3Byb3BzCnZhciBrY2hycwp2YXIgdnByb3BzCnZhciB2Y2hycwp2YXIgdmFsdWUKdmFyIGNocnM9MAp2YXIgdHlwZWNvbnZlcnQ9ZnVuY3Rpb24oeCl7cmV0dXJuIHh9CmlmKCFvZmZzZXQpe29mZnNldD0wfQpkdHlwZT0oZGF0YS5zbGljZShvZmZzZXQsb2Zmc2V0KzEpKS50b0xvd2VyQ2FzZSgpCmRhdGFvZmZzZXQ9b2Zmc2V0KzIKc3dpdGNoKGR0eXBlKXtjYXNlICdpJzp0eXBlY29udmVydD1mdW5jdGlvbih4KXtyZXR1cm4gcGFyc2VJbnQoeCwxMCl9CnJlYWREYXRhPXJlYWRVbnRpbChkYXRhLGRhdGFvZmZzZXQsJzsnKQpjaHJzPXJlYWREYXRhWzBdCnJlYWRkYXRhPXJlYWREYXRhWzFdCmRhdGFvZmZzZXQrPWNocnMrMQpicmVhawpjYXNlICdiJzp0eXBlY29udmVydD1mdW5jdGlvbih4KXtyZXR1cm4gcGFyc2VJbnQoeCwxMCkhPT0wfQpyZWFkRGF0YT1yZWFkVW50aWwoZGF0YSxkYXRhb2Zmc2V0LCc7JykKY2hycz1yZWFkRGF0YVswXQpyZWFkZGF0YT1yZWFkRGF0YVsxXQpkYXRhb2Zmc2V0Kz1jaHJzKzEKYnJlYWsKY2FzZSAnZCc6dHlwZWNvbnZlcnQ9ZnVuY3Rpb24oeCl7cmV0dXJuIHBhcnNlRmxvYXQoeCl9CnJlYWREYXRhPXJlYWRVbnRpbChkYXRhLGRhdGFvZmZzZXQsJzsnKQpjaHJzPXJlYWREYXRhWzBdCnJlYWRkYXRhPXJlYWREYXRhWzFdCmRhdGFvZmZzZXQrPWNocnMrMQpicmVhawpjYXNlICduJzpyZWFkZGF0YT1udWxsCmJyZWFrCmNhc2UgJ3MnOmNjb3VudD1yZWFkVW50aWwoZGF0YSxkYXRhb2Zmc2V0LCc6JykKY2hycz1jY291bnRbMF0Kc3RyaW5nbGVuZ3RoPWNjb3VudFsxXQpkYXRhb2Zmc2V0Kz1jaHJzKzIKcmVhZERhdGE9cmVhZENocnMoZGF0YSxkYXRhb2Zmc2V0KzEscGFyc2VJbnQoc3RyaW5nbGVuZ3RoLDEwKSkKY2hycz1yZWFkRGF0YVswXQpyZWFkZGF0YT1yZWFkRGF0YVsxXQpkYXRhb2Zmc2V0Kz1jaHJzKzIKaWYoY2hycyE9PXBhcnNlSW50KHN0cmluZ2xlbmd0aCwxMCkmJmNocnMhPT1yZWFkZGF0YS5sZW5ndGgpe2Vycm9yKCdTeW50YXhFcnJvcicsJ1N0cmluZyBsZW5ndGggbWlzbWF0Y2gnKX0KYnJlYWsKY2FzZSAnYSc6cmVhZGRhdGE9e30Ka2V5YW5kY2hycz1yZWFkVW50aWwoZGF0YSxkYXRhb2Zmc2V0LCc6JykKY2hycz1rZXlhbmRjaHJzWzBdCmtleXM9a2V5YW5kY2hyc1sxXQpkYXRhb2Zmc2V0Kz1jaHJzKzIKbGVuZ3RoPXBhcnNlSW50KGtleXMsMTApCmNvbnRpZz0hMApmb3IoaT0wO2k8bGVuZ3RoO2krKyl7a3Byb3BzPV91bnNlcmlhbGl6ZShkYXRhLGRhdGFvZmZzZXQpCmtjaHJzPWtwcm9wc1sxXQprZXk9a3Byb3BzWzJdCmRhdGFvZmZzZXQrPWtjaHJzCnZwcm9wcz1fdW5zZXJpYWxpemUoZGF0YSxkYXRhb2Zmc2V0KQp2Y2hycz12cHJvcHNbMV0KdmFsdWU9dnByb3BzWzJdCmRhdGFvZmZzZXQrPXZjaHJzCmlmKGtleSE9PWkpe2NvbnRpZz0hMX0KcmVhZGRhdGFba2V5XT12YWx1ZX0KaWYoY29udGlnKXthcnJheT1uZXcgQXJyYXkobGVuZ3RoKQpmb3IoaT0wO2k8bGVuZ3RoO2krKyl7YXJyYXlbaV09cmVhZGRhdGFbaV19CnJlYWRkYXRhPWFycmF5fQpkYXRhb2Zmc2V0Kz0xCmJyZWFrCmRlZmF1bHQ6ZXJyb3IoJ1N5bnRheEVycm9yJywnVW5rbm93biAvIFVuaGFuZGxlZCBkYXRhIHR5cGUocyk6ICcrZHR5cGUpCmJyZWFrfQpyZXR1cm5bZHR5cGUsZGF0YW9mZnNldC1vZmZzZXQsdHlwZWNvbnZlcnQocmVhZGRhdGEpXX0KcmV0dXJuIF91bnNlcmlhbGl6ZSgoZGF0YSsnJyksMClbMl19CmZ1bmN0aW9uIHNlcmlhbGl6ZShtaXhlZFZhbHVlKXt2YXIgdmFsLGtleSxva2V5CnZhciBrdHlwZT0nJwp2YXIgdmFscz0nJwp2YXIgY291bnQ9MAp2YXIgX3V0ZjhTaXplPWZ1bmN0aW9uKHN0cil7dmFyIHNpemU9MAp2YXIgaT0wCnZhciBsPXN0ci5sZW5ndGgKdmFyIGNvZGU9JycKZm9yKGk9MDtpPGw7aSsrKXtjb2RlPXN0ci5jaGFyQ29kZUF0KGkpCmlmKGNvZGU8MHgwMDgwKXtzaXplKz0xfWVsc2UgaWYoY29kZTwweDA4MDApe3NpemUrPTJ9ZWxzZXtzaXplKz0zfX0KcmV0dXJuIHNpemV9CnZhciBfZ2V0VHlwZT1mdW5jdGlvbihpbnApe3ZhciBtYXRjaAp2YXIga2V5CnZhciBjb25zCnZhciB0eXBlcwp2YXIgdHlwZT10eXBlb2YgaW5wCmlmKHR5cGU9PT0nb2JqZWN0JyYmIWlucCl7cmV0dXJuJ251bGwnfQppZih0eXBlPT09J29iamVjdCcpe2lmKCFpbnAuY29uc3RydWN0b3Ipe3JldHVybidvYmplY3QnfQpjb25zPWlucC5jb25zdHJ1Y3Rvci50b1N0cmluZygpCm1hdGNoPWNvbnMubWF0Y2goLyhcdyspXCgvKQppZihtYXRjaCl7Y29ucz1tYXRjaFsxXS50b0xvd2VyQ2FzZSgpfQp0eXBlcz1bJ2Jvb2xlYW4nLCdudW1iZXInLCdzdHJpbmcnLCdhcnJheSddCmZvcihrZXkgaW4gdHlwZXMpe2lmKGNvbnM9PT10eXBlc1trZXldKXt0eXBlPXR5cGVzW2tleV0KYnJlYWt9fX0KcmV0dXJuIHR5cGV9CnZhciB0eXBlPV9nZXRUeXBlKG1peGVkVmFsdWUpCnN3aXRjaCh0eXBlKXtjYXNlICdmdW5jdGlvbic6dmFsPScnCmJyZWFrCmNhc2UgJ2Jvb2xlYW4nOnZhbD0nYjonKyhtaXhlZFZhbHVlPycxJzonMCcpCmJyZWFrCmNhc2UgJ251bWJlcic6dmFsPShNYXRoLnJvdW5kKG1peGVkVmFsdWUpPT09bWl4ZWRWYWx1ZT8naSc6J2QnKSsnOicrbWl4ZWRWYWx1ZQpicmVhawpjYXNlICdzdHJpbmcnOnZhbD0nczonK191dGY4U2l6ZShtaXhlZFZhbHVlKSsnOiInK21peGVkVmFsdWUrJyInCmJyZWFrCmNhc2UgJ2FycmF5JzpjYXNlICdvYmplY3QnOnZhbD0nYScKZm9yKGtleSBpbiBtaXhlZFZhbHVlKXtpZihtaXhlZFZhbHVlLmhhc093blByb3BlcnR5KGtleSkpe2t0eXBlPV9nZXRUeXBlKG1peGVkVmFsdWVba2V5XSkKaWYoa3R5cGU9PT0nZnVuY3Rpb24nKXtjb250aW51ZX0Kb2tleT0oa2V5Lm1hdGNoKC9eWzAtOV0rJC8pP3BhcnNlSW50KGtleSwxMCk6a2V5KQp2YWxzKz1zZXJpYWxpemUob2tleSkrc2VyaWFsaXplKG1peGVkVmFsdWVba2V5XSkKY291bnQrK319CnZhbCs9JzonK2NvdW50Kyc6eycrdmFscysnfScKYnJlYWsKY2FzZSAndW5kZWZpbmVkJzpkZWZhdWx0OnZhbD0nTicKYnJlYWt9CmlmKHR5cGUhPT0nb2JqZWN0JyYmdHlwZSE9PSdhcnJheScpe3ZhbCs9JzsnfQpyZXR1cm4gdmFsfTt2YXIgcmVzZXRQYWdlPSEwO3ZhciBhZGFwdGl2ZT0hMTt2YXIgY291bnQ9MTt2YXIgcHJldkNvdW50PTA7dmFyIGJhY2s9ITE7dmFyIGN1c3RvbVRhYnNFbmFibGVkPSExO3ZhciByZXNwb25zaXZlUGFyYW1ldGVycz0nJzt2YXIgZ3JpZFBhcmFtZXRlcnM9Jyc7dmFyIGJyZWFrUG9pbnQ9Jyc7dmFyIGJveGVzPScnO3ZhciBjaGFuZ2VkPSExO3ZhciBtb3ZlZD0hMTt2YXIgbXVsdGlwbGVGYWNldGVkU2VhcmNoPSExO3ZhciBwYWdlSGlzdG9yeT1uZXcgQXJyYXk7dmFyIGluZGV4PS0xO3ZhciBmYWNldGVkU2VhcmNoTXVsdGlwbGVDb3VudD0xMDt2YXIgdW53cmFwcGVkUGFyYW1ldGVyczt2YXIgcmVkaXJlY3RJZk9uZVByb2R1Y3Q9ITE7ZnVuY3Rpb24gY2hlY2tQcm9kdWN0TGlzdGluZ1N0YXRlKGhhc0NvbnRlbnQpe3ZhciAkd2lkdGg9JCh3aW5kb3cpLndpZHRoKCk7aWYoJHdpZHRoPDEyOTMpe2lmKG1vdmVkKXskKCcjcHJvZHVjdF9ib3hlc19tb3ZlZCcpLnNob3coKTskKCcjcHJvZHVjdF90YWJsZV9tb3ZlZCcpLmhpZGUoKTskKCcjcHJvZHVjdGJveGVzJykuaGlkZSgpOyQoJyNwcm9kdWN0dGFibGUnKS5oaWRlKCk7aWYoaGFzQ29udGVudCl7JCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe30sMjApfX1lbHNleyQoJyNwcm9kdWN0X2JveGVzX21vdmVkJykuaGlkZSgpOyQoJyNwcm9kdWN0X3RhYmxlX21vdmVkJykuaGlkZSgpOyQoJyNwcm9kdWN0Ym94ZXMnKS5zaG93KCk7JCgnI3Byb2R1Y3R0YWJsZScpLmhpZGUoKTtpZihoYXNDb250ZW50KXskKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7fSwyMCl9fX1lbHNle2lmKG1vdmVkKXskKCcjcHJvZHVjdF9ib3hlc19tb3ZlZCcpLmhpZGUoKTskKCcjcHJvZHVjdF90YWJsZV9tb3ZlZCcpLnNob3coKTskKCcjcHJvZHVjdGJveGVzJykuaGlkZSgpOyQoJyNwcm9kdWN0dGFibGUnKS5oaWRlKCk7aWYoaGFzQ29udGVudCl7JCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe30sMjApfX1lbHNleyQoJyNwcm9kdWN0X2JveGVzX21vdmVkJykuaGlkZSgpOyQoJyNwcm9kdWN0X3RhYmxlX21vdmVkJykuaGlkZSgpOyQoJyNwcm9kdWN0Ym94ZXMnKS5oaWRlKCk7JCgnI3Byb2R1Y3R0YWJsZScpLnNob3coKTtpZihoYXNDb250ZW50KXskKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7fSwyMCl9fX0KaWYoJHdpZHRoPjc2OCl7dmFyIG9iaj0kKCIubXVsdGlwbGUtZmFjZXRlZC1saW5rIikubGVuZ3RoPjE/JCgiLm11bHRpcGxlLWZhY2V0ZWQtbGluayIpOiQoIi5mYWNldGVkLWxpbmsiKTt2YXIgdmFyaWFibGVIZWlnaHQ9KChvYmouaGVpZ2h0KCkpKmZhY2V0ZWRTZWFyY2hNdWx0aXBsZUNvdW50KSsncHgnO29iai5jc3MoeydtYXgtaGVpZ2h0Jzp2YXJpYWJsZUhlaWdodH0pO3ZhciBoZWlnaHQsdmFsdWVIZWlnaHQ7aWYoJCgnLmZpbHRlcmNvbHVtbicpLmxlbmd0aD4wKXt2YWx1ZUhlaWdodD0kKCJhLmZhY2V0ZWQtbGluayIpLmhlaWdodCgpKzM7JCgnLmZpbHRlcmNvbHVtbicpLmVhY2goZnVuY3Rpb24oKXtpZihmYWNldGVkU2VhcmNoTXVsdGlwbGVDb3VudDwkKHRoaXMpLmNoaWxkcmVuKCkuY2hpbGRyZW4oKS5sZW5ndGgpe2hlaWdodD1mYWNldGVkU2VhcmNoTXVsdGlwbGVDb3VudCp2YWx1ZUhlaWdodH1lbHNle2hlaWdodD0kKHRoaXMpLmNoaWxkcmVuKCkuY2hpbGRyZW4oKS5sZW5ndGgqdmFsdWVIZWlnaHR9CmlmKCQodGhpcykuY2hpbGRyZW4oKS5oYXNDbGFzcygnZmFjZXRlZC1jb2x1bW5zJykpeyQodGhpcykuY3NzKHsnaGVpZ2h0JzpoZWlnaHQqMisncHgnLCdtYXgtaGVpZ2h0JzpoZWlnaHQqMisncHgnfSl9ZWxzZXskKHRoaXMpLmNzcyh7J2hlaWdodCc6aGVpZ2h0KydweCcsJ21heC1oZWlnaHQnOmhlaWdodCsncHgnfSl9fSl9ZWxzZSBpZigkKCcubXVsdGlwbGUtZmFjZXRlZC1saW5rJykubGVuZ3RoPjApe3ZhbHVlSGVpZ2h0PSQoImEubXVsdGlwbGUtZmFjZXRlZC1saW5rIikuaGVpZ2h0KCkrMzskKCcubXVsdGlwbGVfZmFjZXRlZF92YXJpYWJsZScpLmVhY2goZnVuY3Rpb24oKXtoZWlnaHQ9MDtpZihmYWNldGVkU2VhcmNoTXVsdGlwbGVDb3VudDwkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoKXtoZWlnaHQ9ZmFjZXRlZFNlYXJjaE11bHRpcGxlQ291bnQqdmFsdWVIZWlnaHQ7aGVpZ2h0Kz0xMDskKHRoaXMpLmNzcyh7J2hlaWdodCc6aGVpZ2h0KydweCcsJ21heC1oZWlnaHQnOmhlaWdodCsncHgnfSl9ZWxzZXtoZWlnaHQ9JCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCp2YWx1ZUhlaWdodC8yO2hlaWdodCs9MTA7JCh0aGlzKS5jc3MoeydoZWlnaHQnOmhlaWdodCsncHgnLCdtYXgtaGVpZ2h0JzpoZWlnaHQrJ3B4J30pLmNvbHVtbml6ZSh7Y29sdW1uczoyLGxhc3ROZXZlclRhbGxlc3Q6ITB9KX19KX19CiQoIi5mYWNldGVkX2ltYWdlX3ZpZXdlciIpLmJ4U2xpZGVyKHttb2RlOiJmYWRlIixzcGVlZDozMDAsY29udHJvbHM6ITEsYXV0bzohMSxhZGFwdGl2ZUhlaWdodDohMCx0b3VjaEVuYWJsZWQ6ITEsb25TbGlkZXJMb2FkOmZ1bmN0aW9uKCl7JCgiLmZhY2V0ZWRfaW1hZ2Vfdmlld2VyIikuY3NzKCJ2aXNpYmlsaXR5IiwidmlzaWJsZSIpO3ZhciBzY3JpcHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7c2NyaXB0LnNyYz0iZXh0L2xpZ2h0Ym94Mi9kaXN0L2pzL2xpZ2h0Ym94Lm1pbi5qcyI7ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpfX0pfQokKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCl7Y2hlY2tQcm9kdWN0TGlzdGluZ1N0YXRlKCExKX0pOyQoZnVuY3Rpb24oKXskKHdpbmRvdykub24oJ2JlZm9yZXVubG9hZCAnLGZ1bmN0aW9uKCl7dmFyIHNjcm9sbFBvc2l0aW9uPSQod2luZG93KS5zY3JvbGxUb3AoKTtpZihzY3JvbGxQb3NpdGlvbj4wKXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgic2Nyb2xsUG9zaXRpb24iLHNjcm9sbFBvc2l0aW9uKX19KX0pO2Z1bmN0aW9uIHVwZGF0ZUZpbHRlcnMocGFyYW1ldGVycyxuZXdTZWxlY3RWYWx1ZSxuZXdTZWxlY3RJRCl7dmFyIHJlZmVycmVyPWdldFVybFZhcnMoKVsncmVmZXJyZXInXTtpZih0eXBlb2YgcmVmZXJyZXI9PSd1bmRlZmluZWQnKXtyZWZlcnJlcj0wfQppZihwYXJhbWV0ZXJzPT11bmRlZmluZWQpe3JldHVybiExfQp2YXIgcGFybXM9dW53cmFwUGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtpZih0eXBlb2YgbmV3U2VsZWN0SUQhPSd1bmRlZmluZWQnKXt2YXIgdmFya2V5PW5ld1NlbGVjdElELm1hdGNoKC8oXGQrKS8pWzFdO3Bhcm1zLmN1cnJlbnR2YXI9dmFya2V5O3Bhcm1zLmN1cnJlbnR2YWw9bmV3U2VsZWN0VmFsdWU7aWYodHlwZW9mIHBhcm1zLnNldHZhcmlhYmxlc1t2YXJrZXldPT0ndW5kZWZpbmVkJyl7cGFybXMuc2V0dmFyaWFibGVzW3ZhcmtleV09W119CnBhcm1zLnNldHZhcmlhYmxlc1t2YXJrZXldW25ld1NlbGVjdFZhbHVlXT0nIicrbmV3U2VsZWN0VmFsdWUrJyInfQpwYXJtcy5yZWZlcnJlcj1yZWZlcnJlcjtwYXJhbWV0ZXJzPXdyYXBQYXJhbWV0ZXJzKHBhcm1zKTskLmJsb2NrVUkoe21lc3NhZ2U6JzxpbWcgc3JjPSInK0JBU0VfSFJFRisnaW1hZ2VzL3NpdGUvbG9hZGluZy5naWYiIC8+Jyxjc3M6e2JhY2tncm91bmRDb2xvcjondHJhbnNwYXJlbnQnLGNvbG9yOicjMDAwJyxib3JkZXI6J25vbmUnfSxvdmVybGF5Q1NTOntiYWNrZ3JvdW5kQ29sb3I6JyMwMDAnLG9wYWNpdHk6MC4xLGN1cnNvcjond2FpdCd9LGZhZGVJbjowLGZhZGVPdXQ6MCxiYXNlWjoxMDAwfSk7JC5wb3N0KCdpbmNsdWRlcy9hamF4L2FqYXgudmFyaWFibGVzLnBocCcse3BhcmFtZXRlcnM6cGFyYW1ldGVycyxuZXdzZWxlY3R2YWw6bmV3U2VsZWN0VmFsdWV9LGZ1bmN0aW9uKGRhdGEpeyQudW5ibG9ja1VJKCk7Y291bnQ9ZGF0YS5wYWdlIT09bnVsbD9kYXRhLnBhZ2U6MTtpZigkKCcjZmFjZXRlZHNlYXJjaCcpLmxlbmd0aD4wKXtpZihkYXRhLmZhY2V0ZWRzZWFyY2ghPW51bGwmJmRhdGEuZmFjZXRlZHNlYXJjaCE9JycpeyQoJyNyZXNwb25zaXZlRmFjdGVkU2VhcmNoQnV0dG9uJykuY3NzKCdkaXNwbGF5JywnaW5saW5lLWJsb2NrJyk7JCgnI3Jlc3BvbnNpdmVfZmFjZXRlZF9zZWFyY2gnKS5yZW1vdmUoKTskKCcjcmVzcG9uc2l2ZV9mYWNldGVkX3NlYXJjaF9jb250YWluZXInKS5odG1sKGRhdGEucmVzcG9uc2l2ZV9mYWNldGVkX3NlYXJjaCk7JCgnI2ZhY2V0ZWRzZWFyY2gnKS5wYXJlbnQoKS5wYXJlbnQoKS5zaG93KCk7JCgnI2ZhY2V0ZWRzZWFyY2gnKS5odG1sKGRhdGEuZmFjZXRlZHNlYXJjaCk7JCgnI2ZhY2V0ZWRzZWFyY2ggYScpLmhvdmVyKGZ1bmN0aW9uKCl7JCh0aGlzKS5hZGRDbGFzcygndWktc3RhdGUtaG92ZXInKX0sZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCd1aS1zdGF0ZS1ob3ZlcicpfSl9ZWxzZXskKCcjcmVzcG9uc2l2ZUZhY3RlZFNlYXJjaEJ1dHRvbicpLmhpZGUoKTskKCdkaXYuZmFjZXRlZHNlYXJjaCcpLnJlbW92ZSgpfX0KcmVzZXRQYWdlPSExO2lmKChkYXRhLmZhY2V0ZWRzZWFyY2ghPW51bGx8fGRhdGEuc2VsZWN0cyE9JycpJiZkYXRhLnByb2R1Y3R0YWJsZSE9Jycpe2lmKG5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9NU0lFIDkvKSl7d2luZG93LmxvY2F0aW9uLmhhc2g9Y291bnR9ZWxzZXt2YXIgc3RhdGVPYmo9e3RpdGxlOiJQYWdlIix1cmw6bG9jYXRpb24uaHJlZn07aWYoIWxvY2F0aW9uLmhyZWYubWF0Y2goLyMvKSl7aGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGVPYmosImhhc2gtdXJsIixzdGF0ZU9iai51cmwrJyMnK2NvdW50KX1lbHNle3ZhciB1cmw9c3RhdGVPYmoudXJsLm1hdGNoKC9eKC4qPykoXCMoXGQrKSkuKj8kLyk7aWYoZGF0YS5yZXNldD09MCl7aGlzdG9yeS5wdXNoU3RhdGUoc3RhdGVPYmosImhhc2gtdXJsIix1cmxbMV0rJyMnK2NvdW50KX1lbHNle2hpc3RvcnkucHVzaFN0YXRlKHN0YXRlT2JqLCJoYXNoLXVybCIsdXJsWzFdKX19fQpwYWdlSGlzdG9yeS5wdXNoKGRhdGEucGFyYW1ldGVycyl9CnVud3JhcHBlZFBhcmFtZXRlcnM9dW53cmFwUGFyYW1ldGVycyhkYXRhLnBhcmFtZXRlcnMpO2lmKGRhdGEucmVzZXR8fCFsaXN0aW5nQWJvdmVDb250ZW50KXtpZigkKCcjc2VsZWN0bGlzdCcpLmxlbmd0aD4wKXskKCcjc2VsZWN0bGlzdCcpLmh0bWwoZGF0YS5zZWxlY3RzKX0KJCgnI3NlbGVjdF9saXN0X21vdmVkJykuaHRtbCgnJyk7JCgnI3Byb2R1Y3R0YWJsZScpLmh0bWwoZGF0YS5wcm9kdWN0dGFibGUpLmhpZGUoKTskKCcjcHJvZHVjdF90YWJsZV9tb3ZlZCcpLmh0bWwoJycpLmhpZGUoKTskKCcjcHJvZHVjdGJveGVzJykuaHRtbChkYXRhLnByb2R1Y3Rib3hlcykuaGlkZSgpOyQoJyNwcm9kdWN0X2JveGVzX21vdmVkJykuaHRtbCgnJykuaGlkZSgpO21vdmVkPSExO2lmKGZsb2F0SGVhZCl7dmFyIHRhYmxlPSQoJ3RhYmxlLnByb2R1Y3RMaXN0aW5nJyk7dGFibGUuZmxvYXRUaGVhZCgnZGVzdHJveScpO3RhYmxlLmZsb2F0VGhlYWQoe3pJbmRleDo1MDF9KX19ZWxzZXtpZigkKCcjc2VsZWN0X2xpc3RfbW92ZWQnKS5sZW5ndGg+MCl7JCgnI3NlbGVjdF9saXN0X21vdmVkJykuaHRtbChkYXRhLnNlbGVjdHMpfQokKCcjc2VsZWN0bGlzdCcpLmh0bWwoJycpOyQoJyNwcm9kdWN0X3RhYmxlX21vdmVkJykuaHRtbChkYXRhLnByb2R1Y3R0YWJsZSkuaGlkZSgpOyQoJyNwcm9kdWN0dGFibGUnKS5odG1sKCcnKS5oaWRlKCk7JCgnI3Byb2R1Y3RfYm94ZXNfbW92ZWQnKS5odG1sKGRhdGEucHJvZHVjdGJveGVzKS5oaWRlKCk7JCgnI3Byb2R1Y3Rib3hlcycpLmh0bWwoJycpLmhpZGUoKTttb3ZlZD0hMH0Kc2V0VGltZW91dChmdW5jdGlvbigpe2NoZWNrUHJvZHVjdExpc3RpbmdTdGF0ZSgoZGF0YS5wcm9kdWN0dGFibGUhPScnfHxkYXRhLnByb2R1Y3Rib3hlcyE9JycpKTt2YXIgbWVudT0kKCIjcmVzcG9uc2l2ZV9mYWNldGVkX3NlYXJjaCIpLm1tZW51KHtuYXZiYXI6e3RpdGxlOidGaWx0ZXInfSxvZmZDYW52YXM6e3Bvc2l0aW9uOiJsZWZ0Iix6cG9zaXRpb246ImZyb250In0sZXh0ZW5zaW9uczpbInBhZ2VkaW0tYmxhY2siLCJtdWx0aWxpbmUiXSxvbkNsaWNrOntjbG9zZTohMX19KTskKCd1bC5tdWx0aXBsZV9mYWNldGVkX3ZhcmlhYmxlJykub24oJ21vdXNld2hlZWwgRE9NTW91c2VTY3JvbGwnLGZ1bmN0aW9uKGUpe3ZhciBlMD1lLm9yaWdpbmFsRXZlbnQ7dmFyIGRlbHRhPWUwLndoZWVsRGVsdGF8fC1lMC5kZXRhaWw7dGhpcy5zY3JvbGxUb3ArPShkZWx0YTwwPzE6LTEpKjMwO2UucHJldmVudERlZmF1bHQoKX0pO2lmKGZsb2F0SGVhZCl7dmFyIHRhYmxlPSQoJ3RhYmxlLnByb2R1Y3RMaXN0aW5nJyk7dGFibGUuZmxvYXRUaGVhZCgnZGVzdHJveScpO3RhYmxlLmZsb2F0VGhlYWQoe3pJbmRleDo1MDF9KX19LDUwMCk7aWYoZGF0YS5yZXNldCl7JCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe3Njcm9sbFRvcDooMCl9LDApfWVsc2V7aWYoJCgnI3Byb2R1Y3R0YWJsZScpLmh0bWwoKT09JycpeyQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHtzY3JvbGxUb3A6KCQoJyNwcm9kdWN0X3RhYmxlX21vdmVkJykub2Zmc2V0KCkudG9wKX0sMCl9ZWxzZXskKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7c2Nyb2xsVG9wOigkKCcjcHJvZHVjdHRhYmxlJykub2Zmc2V0KCkudG9wKX0sMCl9fQppZihERUJVR19MVkw+MCl7Y29uc29sZS5sb2coZGF0YS5kZWJ1Zyl9CmlmKGRhdGEuY291bnRzPT0xJiYkKCd0ZC5jYWxsX3RvX2FjdGlvbiBhJykuYXR0cignaHJlZicpLm1hdGNoKC9qYXZhc2NyaXB0Lyk9PW51bGwmJnJlZGlyZWN0SWZPbmVQcm9kdWN0KXt3aW5kb3cubG9jYXRpb249JCgndGQuY2FsbF90b19hY3Rpb24gYScpLmF0dHIoJ2hyZWYnKX0KJCgnLmZhY2V0ZWQtY29sdW1ucycpLmNvbHVtbnMoMik7cmV0dXJuITF9LCdqc29uJykuZmFpbChmdW5jdGlvbihlcnIpeyQudW5ibG9ja1VJKCk7Y29uc29sZS5sb2coZXJyLnJlc3BvbnNlVGV4dCl9KX0KaWYobmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL01TSUUgOS8pfHwobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3NhZmFyaS8nKT4tMSYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2Nocm9tZS8nKT09LTEpKXskKHdpbmRvdykuYmluZCgnaGFzaGNoYW5nZScsZnVuY3Rpb24oKXtiYWNrPSEwO3VwZGF0ZUZpbHRlcnMocGFnZUhpc3RvcnkucG9wKCkpfSl9ZWxzZXt3aW5kb3cub25wb3BzdGF0ZT1mdW5jdGlvbihlKXtpZihwYWdlSGlzdG9yeS5sZW5ndGg9PTF8fCFsb2NhdGlvbi5ocmVmLm1hdGNoKC8jLykpe31lbHNle3BhZ2VIaXN0b3J5LnBvcCgpO3ZhciBwYXJhbXM9cGFnZUhpc3RvcnkucG9wKCk7dXBkYXRlRmlsdGVycyhwYXJhbXMpfX19CmZ1bmN0aW9uIGVkaXRWYXJpYWJsZShpZCl7aWYoJCgnI2VkaXR2YXJpYWJsZWRpYWxvZycpLmxlbmd0aD09MCl7JCgnYm9keScpLmFwcGVuZCgnPGRpdiBpZD0iZWRpdHZhcmlhYmxlZGlhbG9nIiAvPicpfQp2YXIgdGV4dD0ndGV4dCc7JCgnI2VkaXR2YXJpYWJsZWRpYWxvZycpLmRpYWxvZyh7bW9kYWw6ITAsb3BlbjpmdW5jdGlvbigpeyQoJyN2YXJpYWJsZW5hbWUnKS52YWwoJCgnc2VsZWN0W25hbWU9dmFyaWFibGVfdmFyaWFibGVcXFsnK2lkKydcXF1dIDpzZWxlY3RlZCcpLnRleHQoKSl9LGJ1dHRvbnM6e3VwZGF0ZTpmdW5jdGlvbigpe2lmKCQoJyN2YXJpYWJsZW5hbWUnKS52YWwoKSE9PScnKXskLnBvc3QoJy4uL2luY2x1ZGVzL2FqYXgvYWpheC52YXJpYWJsZXMucGhwJyx7dmFyaWFibGVpZDppZCx2YXJpYWJsZXRleHQ6JCgnI3ZhcmlhYmxlbmFtZScpLnZhbCgpfSxmdW5jdGlvbihkYXRhKXskKCdzZWxlY3RbbmFtZT12YXJpYWJsZV92YXJpYWJsZVxcWzFcXF1cXFsnK2lkKydcXF1dIDpzZWxlY3RlZCcpLnRleHQoJCgnI3ZhcmlhYmxlbmFtZScpLnZhbCgpKX0pLmZhaWwoZnVuY3Rpb24oZXJyKXthbGVydChlcnIucmVzcG9uc2VUZXh0KX0pOyQodGhpcykuZGlhbG9nKCdjbG9zZScpfWVsc2V7YWxlcnQoJ1ZhcmlhYmxlIE5hbWUgQ2Fubm90IEJlIEJsYW5rJywnRW50cnkgRXJyb3InKX19LGNsb3NlOmZ1bmN0aW9uKCl7JCh0aGlzKS5kaWFsb2coJ2Nsb3NlJyl9fX0pfQpmdW5jdGlvbiBjaGVja0NhcnRRdWFudGl0aWVzKHR5cGUsaWQpe3ZhciBxdHk9MDtpZih0eXBlb2YgdHlwZSE9J3VuZGVmaW5lZCcpe2lmKHR5cGU9PSdyZnEnKXskKCcjYWN0aW9uXFxbJytpZCsnXFxdJykudmFsKCdib3hfcmZxJyl9ZWxzZSBpZih0eXBlPT0nYnV5Jyl7JCgnI2FjdGlvblxcWycraWQrJ1xcXScpLnZhbCgnYm94X2J1eScpfQppZigkKCcjcHJvZHVjdGJveGVzJykuaXMoJzp2aXNpYmxlJykmJiQoJyNjYXJ0X3F1YW50aXR5X2JveGVzXFxbJytpZCsnXFxdJykubGVuZ3RoPjApeyQoJyNjYXJ0X3F1YW50aXR5X2JveGVzXFxbJytpZCsnXFxdJykuc3VibWl0KCl9ZWxzZSBpZigkKCcjcHJvZHVjdGJveGVzJykuaXMoJzp2aXNpYmxlJykmJiQoJyNjYXJ0X3F1YW50aXR5X3Jlc3BvbnNpdmUnKS5sZW5ndGg+MCl7JCgnI2NhcnRfcXVhbnRpdHlfcmVzcG9uc2l2ZScpLnN1Ym1pdCgpO3JldHVybiExfWVsc2V7JCgnI2NhcnRfcXVhbnRpdHlcXFsnK2lkKydcXF0nKS5zdWJtaXQoKX19CmlmKCQoJ2lucHV0LmNhcnRxdHknKS5sZW5ndGg+MCl7JCgnaW5wdXQuY2FydHF0eScpLmVhY2goZnVuY3Rpb24oKXtxdHkrPXBhcnNlSW50KCQodGhpcykudmFsKCkpO2lmKHR5cGU9PSdyZnEnKXskKHRoaXMpLmF0dHIoJ25hbWUnLCQodGhpcykuYXR0cignbmFtZScpLnJlcGxhY2UoJ3F0eV9jaGlsZElkJywncXR5X2NoaWxkUkZRSWQnKSl9fSl9CmlmKHF0eT4wKXskKCcjY2FydF9xdWFudGl0eScpLnN1Ym1pdCgpfWVsc2V7JCgnaW5wdXQuY2FydHF0eScpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsJ1RvbWF0bycpLnZhbCgwKX19CmZ1bmN0aW9uIGhpZGVDb2x1bW5zKGZpbHRlcmNsYXNzKXskKCdkaXYuJytmaWx0ZXJjbGFzcykuZWFjaChmdW5jdGlvbigpe3ZhciBlbGVtPSQodGhpcykuZmluZCgnYScpfSl9CmZ1bmN0aW9uIHNldEZpbHRlckhlaWdodChkZXB0aCl7JCgnZGl2LmZpbHRlcmNvbHVtbicpLmNzcygnaGVpZ2h0JywoMjAqZGVwdGgpKzcpOyQoJ2Rpdi5yZXNwb25zaXZlZmlsdGVyY29sdW1uJykuY3NzKCdoZWlnaHQnLCgyMCpkZXB0aCkrNyl9CmZ1bmN0aW9uIHRyaWdnZXJQQih0aWQpeyQoIiNwYl8iK3RpZCsiIC5wcmljZWJyZWFrc0xpc3RpbmdTZXQiKS50b2dnbGVDbGFzcygiaGlkZS1wYiIpfQpmdW5jdGlvbiB1cGRhdGVQcmljaW5nKGJiaWFycmF5KXskLnBvc3QoJ2luY2x1ZGVzL2FqYXgvYWpheC50YmUucGhwJyx7bW9kZWxzOmJiaWFycmF5fSxmdW5jdGlvbihkYXRhKXtmb3IodmFyIGtleSBpbiBkYXRhLm1vZGVscyl7dmFyIHByaWNlT2JqPSQoJyNyb3ctJytrZXkrIiB0ZC5wcm9kdWN0c19wcmljZSIpO3ZhciBwa2dTaXplT2JqPSQoJyNyb3ctJytrZXkrIiB0ZC5wcm9kdWN0X3F1YW50aXR5Iik7dmFyIGJ1eU9iaj0kKCcjcm93LScra2V5KyIgdGQuY2FsbF90b19hY3Rpb24iKTtwcmljZU9iai5odG1sKGRhdGEubW9kZWxzW2tleV0uaHRtbCk7cGtnU2l6ZU9iai5odG1sKGRhdGEubW9kZWxzW2tleV0ucGtnX3F0eSk7aWYoZGF0YS5tb2RlbHNba2V5XS5odG1sPT0nUkZRJyl7JCgnI2J1eV9waWQtJytkYXRhLm1vZGVsc1trZXldLnBpZCkucmVtb3ZlKCl9fQpyZXR1cm4hMX0sJ2pzb24nKS5mYWlsKGZ1bmN0aW9uKGVycil7Y29uc29sZS5sb2coZXJyLnJlc3BvbnNlVGV4dCl9KX0KZnVuY3Rpb24gcGxhY2VGYWNldGVkU2VhcmNoKCl7dmFyIHdpbmRvd1dpZHRoO2lmKCQoJy51aS13aWRnZXQuaW5mb0JveENvbnRhaW5lci5mYWNldGVkX3NlYXJjaCcpLmxlbmd0aD4wKXt3aW5kb3dXaWR0aD0kKHdpbmRvdykud2lkdGgoKTtpZih3aW5kb3dXaWR0aDw3NjgpeyQoJy51aS13aWRnZXQuaW5mb0JveENvbnRhaW5lci5mYWNldGVkX3NlYXJjaCcpLmFwcGVuZFRvKCcjZmFjZXRlZFNlYXJjaFBsYWNlaG9sZGVyJyl9ZWxzZXtpZigkKCcjZmFjZXRlZFNlYXJjaFBsYWNlaG9sZGVyIC51aS13aWRnZXQuaW5mb0JveENvbnRhaW5lci5mYWNldGVkX3NlYXJjaCcpLmxlbmd0aD4wKXskKCcudWktd2lkZ2V0LmluZm9Cb3hDb250YWluZXIuZmFjZXRlZF9zZWFyY2gnKS5hcHBlbmRUbygnI2NvbHVtbkxlZnQgI2xlZnRDb2x1bW5GYWNldGVkU2VhcmNoUGxhY2Vob2xkZXInKX19fX0KZnVuY3Rpb24gY2xvc2VSZXNwb25zaXZlRmFjZXRlZFNlYXJjaCgpe3ZhciBBUEk9JCgiI3Jlc3BvbnNpdmVfZmFjZXRlZF9zZWFyY2giKS5kYXRhKCJtbWVudSIpO0FQSS5jbG9zZSgpfQpmdW5jdGlvbiBjaGFuZ2VDaGVja2JveCh2YXJrZXksdmFsa2V5KXt2YXIgYm94PSQoJyN2YWx1ZVxcWycrdmFya2V5KydcXF1cXFsnK3ZhbGtleSsnXFxdJyk7Ym94LmNsaWNrKCk7dmFyIGJveD0kKCcjdmFsdWVfcmVzcG9uc2l2ZVxcWycrdmFya2V5KydcXF1cXFsnK3ZhbGtleSsnXFxdJyk7Ym94LmNsaWNrKCl9CmZ1bmN0aW9uIHVud3JhcFBhcmFtZXRlcnMoc3RyaW5nKXt2YXIgcGFyYW1zPXVuc2VyaWFsaXplKGRlY29kZTY0KHN0cmluZykpO3ZhciB2YXJzPVtdO2lmKHR5cGVvZiBwYXJhbXMuc2V0dmFyaWFibGVzIT0ndW5kZWZpbmVkJyl7Zm9yKHZhciBrZXkgaW4gcGFyYW1zLnNldHZhcmlhYmxlcyl7a2V5PWtleS5yZXBsYWNlKC9cIisvZywnIicpO3ZhcnNba2V5XT1bXTtmb3IodmFyIHZhbCBpbiBwYXJhbXMuc2V0dmFyaWFibGVzW2tleV0pe3ZhbD12YWwucmVwbGFjZSgvXCIrL2csJyInKTt2YXJzW2tleV1bdmFsXT12YWx9fTtwYXJhbXMuc2V0dmFyaWFibGVzPXZhcnN9CnJldHVybiBwYXJhbXN9CmZ1bmN0aW9uIHdyYXBQYXJhbWV0ZXJzKHN0cmluZyl7cmV0dXJuIGVuY29kZTY0KHNlcmlhbGl6ZShzdHJpbmcpKX0KZnVuY3Rpb24gbG9hZFBhcmFtZXRlcnModmFya2V5LHZhbGtleSl7aWYodHlwZW9mIHZhcmtleT09J3VuZGVmaW5lZCd8fHR5cGVvZiB2YWxrZXk9PSd1bmRlZmluZWQnKXtyZXR1cm4hMX0KaWYodHlwZW9mIHVud3JhcHBlZFBhcmFtZXRlcnMuc2V0dmFyaWFibGVzW3ZhcmtleV0hPSd1bmRlZmluZWQnJiZ0eXBlb2YgdW53cmFwcGVkUGFyYW1ldGVycy5zZXR2YXJpYWJsZXNbdmFya2V5XVt2YWxrZXldIT0ndW5kZWZpbmVkJyl7ZGVsZXRlIHVud3JhcHBlZFBhcmFtZXRlcnMuc2V0dmFyaWFibGVzW3ZhcmtleV1bdmFsa2V5XX0KaWYodHlwZW9mIHVud3JhcHBlZFBhcmFtZXRlcnMuc2V0dmFyaWFibGVzW3ZhcmtleV09PSd1bmRlZmluZWQnKXt1bndyYXBwZWRQYXJhbWV0ZXJzLnNldHZhcmlhYmxlc1t2YXJrZXldPVtdfQp1bndyYXBwZWRQYXJhbWV0ZXJzLnNldHZhcmlhYmxlc1t2YXJrZXldW3ZhbGtleV09dmFsa2V5O3Vud3JhcHBlZFBhcmFtZXRlcnMucmVzZXQ9MH0KZnVuY3Rpb24gc3VibWl0RmlsdGVycyh2YXJrZXkpeyQuZWFjaCgkKCcubXVsdGlwbGUtZmFjZXRlZC1jaGVja2JveCcpLGZ1bmN0aW9uKGtleSx2YWx1ZSl7aWYoJCh0aGlzKS5wcm9wKCdjaGVja2VkJyk9PSEwJiYkKHRoaXMpLmRhdGEoJ2tleScpPT12YXJrZXkpe2xvYWRQYXJhbWV0ZXJzKHZhcmtleSwkKHRoaXMpLmRhdGEoJ3ZhbCcpKX1lbHNlIGlmKCQodGhpcykuZGF0YSgna2V5Jyk9PXZhcmtleSl7aWYodHlwZW9mIHVud3JhcHBlZFBhcmFtZXRlcnMuc2V0dmFyaWFibGVzW3ZhcmtleV0hPSd1bmRlZmluZWQnJiZ0eXBlb2YgdW53cmFwcGVkUGFyYW1ldGVycy5zZXR2YXJpYWJsZXNbdmFya2V5XVskKHRoaXMpLmRhdGEoJ3ZhbCcpXSE9J3VuZGVmaW5lZCcpe2RlbGV0ZSB1bndyYXBwZWRQYXJhbWV0ZXJzLnNldHZhcmlhYmxlc1t2YXJrZXldWyQodGhpcykuZGF0YSgndmFsJyldfX19KTt1bndyYXBwZWRQYXJhbWV0ZXJzLmN1cnJlbnR2YXI9dmFya2V5O3VwZGF0ZUZpbHRlcnMod3JhcFBhcmFtZXRlcnModW53cmFwcGVkUGFyYW1ldGVycykpfQpmdW5jdGlvbiBjbGVhck1pbk1heCh2YXJpYWJsZSx2YWx1ZSl7JCgnI21pblxcWycrdmFyaWFibGUrJ1xcXScpLnZhbCgnJyk7JCgnI21heFxcWycrdmFyaWFibGUrJ1xcXScpLnZhbCgnJyk7JCgnI21pbnJlc3BcXFsnK3ZhcmlhYmxlKydcXF0nKS52YWwoJycpOyQoJyNtYXhyZXNwXFxbJyt2YXJpYWJsZSsnXFxdJykudmFsKCcnKTt1bndyYXBwZWRQYXJhbWV0ZXJzLm1pbj0wO3Vud3JhcHBlZFBhcmFtZXRlcnMubWF4PTB9CmZ1bmN0aW9uIGNoZWNrTWluTWF4KHZhcmtleSl7aWYoJCgnI21pblxcWycrdmFya2V5KydcXF0nKS52YWwoKT09Jycpe3Vud3JhcHBlZFBhcmFtZXRlcnMubWluPTB9ZWxzZXt1bndyYXBwZWRQYXJhbWV0ZXJzLnJlc2V0PTA7dW53cmFwcGVkUGFyYW1ldGVycy5taW49W107dW53cmFwcGVkUGFyYW1ldGVycy5taW5bdmFya2V5XT0kKCcjbWluXFxbJyt2YXJrZXkrJ1xcXScpLnZhbCgpfQppZigkKCcjbWF4XFxbJyt2YXJrZXkrJ1xcXScpLnZhbCgpPT0nJyl7dW53cmFwcGVkUGFyYW1ldGVycy5tYXg9MH1lbHNle3Vud3JhcHBlZFBhcmFtZXRlcnMucmVzZXQ9MDt1bndyYXBwZWRQYXJhbWV0ZXJzLm1heD1bXTt1bndyYXBwZWRQYXJhbWV0ZXJzLm1heFt2YXJrZXldPSQoJyNtYXhcXFsnK3ZhcmtleSsnXFxdJykudmFsKCl9fQpmdW5jdGlvbiBjbGVhckNoZWNrYm94ZXModmFyaWFibGUpeyQuZWFjaCgkKCcubXVsdGlwbGUtZmFjZXRlZC1jaGVja2JveCcpLGZ1bmN0aW9uKGtleSx2YWx1ZSl7aWYoJCh0aGlzKS5wcm9wKCdjaGVja2VkJyk9PSEwJiYkKHRoaXMpLmRhdGEoJ2tleScpPT12YXJpYWJsZSl7JCh0aGlzKS5wcm9wKCdjaGVja2VkJywhMSl9fSl9CmZ1bmN0aW9uIGNsZWFyVXBkYXRlKHBhcmFtZXRlcnMpeyQoJ2lucHV0Lm1pbicpLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLnZhbCgnJyl9KTskKCdpbnB1dC5tYXgnKS5lYWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS52YWwoJycpfSk7dXBkYXRlRmlsdGVycyhwYXJhbWV0ZXJzKX0KZnVuY3Rpb24gc2VsZWN0QWxsRmlsdGVycyh2YXJrZXkpeyQuZWFjaCgkKCcubXVsdGlwbGUtZmFjZXRlZC1jaGVja2JveCcpLGZ1bmN0aW9uKGtleSx2YWx1ZSl7aWYoJCh0aGlzKS5kYXRhKCdrZXknKT09dmFya2V5KXskKHRoaXMpLnByb3AoJ2NoZWNrZWQnLCEwKX19KX0KZnVuY3Rpb24gdXBkYXRlTWluKHZhcmtleSl7dmFyIG1pbj0kKCcjbWluXFxbJyt2YXJrZXkrJ1xcXScpO3ZhciBtaW5yZXNwPSQoJyNtaW5yZXNwXFxbJyt2YXJrZXkrJ1xcXScpO2lmKG1pbi52YWwoKT09JycmJm1pbnJlc3AudmFsKCkhPScnKXttaW4udmFsKG1pbnJlc3AudmFsKCkpfX0KZnVuY3Rpb24gdXBkYXRlTWF4KHZhcmtleSl7dmFyIG1heD0kKCcjbWF4XFxbJyt2YXJrZXkrJ1xcXScpO3ZhciBtYXhyZXNwPSQoJyNtYXhyZXNwXFxbJyt2YXJrZXkrJ1xcXScpO2lmKG1heC52YWwoKT09JycmJm1heHJlc3AudmFsKCkhPScnKXttYXgudmFsKG1heHJlc3AudmFsKCkpfX0KJC5mbi5jb2x1bW5zPWZ1bmN0aW9uKG51bV9jb2xzKXt2YXIgY29udGFpbmVyPXRoaXMsbGlzdEl0ZW09J2xpJyxsaXN0Q2xhc3M9J3N1Yi1saXN0Jztjb250YWluZXIuZWFjaChmdW5jdGlvbigpe3ZhciBpdGVtc19wZXJfY29sPW5ldyBBcnJheSgpLGl0ZW1zPSQodGhpcykuZmluZChsaXN0SXRlbSksbWluX2l0ZW1zX3Blcl9jb2w9TWF0aC5mbG9vcihpdGVtcy5sZW5ndGgvbnVtX2NvbHMpLGRpZmZlcmVuY2U9aXRlbXMubGVuZ3RoLShtaW5faXRlbXNfcGVyX2NvbCpudW1fY29scyk7Zm9yKHZhciBpPTA7aTxudW1fY29scztpKyspe2lmKGk8ZGlmZmVyZW5jZSl7aXRlbXNfcGVyX2NvbFtpXT1taW5faXRlbXNfcGVyX2NvbCsxfWVsc2V7aXRlbXNfcGVyX2NvbFtpXT1taW5faXRlbXNfcGVyX2NvbH19CmZvcih2YXIgaT0wO2k8bnVtX2NvbHM7aSsrKXskKHRoaXMpLmFwcGVuZCgkKCc8dWw+PC91bD4nKS5hZGRDbGFzcyhsaXN0Q2xhc3MpKTtmb3IodmFyIGo9MDtqPGl0ZW1zX3Blcl9jb2xbaV07aisrKXt2YXIgcG9pbnRlcj0wO2Zvcih2YXIgaz0wO2s8aTtrKyspe3BvaW50ZXIrPWl0ZW1zX3Blcl9jb2xba119CiQodGhpcykuZmluZCgnLicrbGlzdENsYXNzKS5sYXN0KCkuYXBwZW5kKGl0ZW1zW2orcG9pbnRlcl0pfX19KTskKCcuc3ViLWxpc3QnKS53cmFwKCc8bGkgY2xhc3M9InN1Yi1saXN0LWxpIj48L2xpPicpO2NvbnRhaW5lci5hZGRDbGFzcygndWktY29ybmVyLWFsbCcpfTshZnVuY3Rpb24oZmFjdG9yeSl7InVzZSBzdHJpY3QiOyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5Il0sZmFjdG9yeSk6alF1ZXJ5JiYhalF1ZXJ5LmZuLmhvdmVySW50ZW50JiZmYWN0b3J5KGpRdWVyeSl9KGZ1bmN0aW9uKCQpeyJ1c2Ugc3RyaWN0Ijt2YXIgY1gsY1ksX2NmZz17aW50ZXJ2YWw6MTAwLHNlbnNpdGl2aXR5OjYsdGltZW91dDowfSxJTlNUQU5DRV9DT1VOVD0wLHRyYWNrPWZ1bmN0aW9uKGV2KXtjWD1ldi5wYWdlWCxjWT1ldi5wYWdlWX0sY29tcGFyZT1mdW5jdGlvbihldiwkZWwscyxjZmcpe2lmKE1hdGguc3FydCgocy5wWC1jWCkqKHMucFgtY1gpKyhzLnBZLWNZKSoocy5wWS1jWSkpPGNmZy5zZW5zaXRpdml0eSlyZXR1cm4gJGVsLm9mZihzLmV2ZW50LHRyYWNrKSxkZWxldGUgcy50aW1lb3V0SWQscy5pc0FjdGl2ZT0hMCxldi5wYWdlWD1jWCxldi5wYWdlWT1jWSxkZWxldGUgcy5wWCxkZWxldGUgcy5wWSxjZmcub3Zlci5hcHBseSgkZWxbMF0sW2V2XSk7cy5wWD1jWCxzLnBZPWNZLHMudGltZW91dElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtjb21wYXJlKGV2LCRlbCxzLGNmZyl9LGNmZy5pbnRlcnZhbCl9LGRlbGF5PWZ1bmN0aW9uKGV2LCRlbCxzLG91dCl7cmV0dXJuIGRlbGV0ZSAkZWwuZGF0YSgiaG92ZXJJbnRlbnQiKVtzLmlkXSxvdXQuYXBwbHkoJGVsWzBdLFtldl0pfTskLmZuLmhvdmVySW50ZW50PWZ1bmN0aW9uKGhhbmRsZXJJbixoYW5kbGVyT3V0LHNlbGVjdG9yKXt2YXIgaW5zdGFuY2VJZD1JTlNUQU5DRV9DT1VOVCsrLGNmZz0kLmV4dGVuZCh7fSxfY2ZnKTskLmlzUGxhaW5PYmplY3QoaGFuZGxlckluKT8oY2ZnPSQuZXh0ZW5kKGNmZyxoYW5kbGVySW4pLCQuaXNGdW5jdGlvbihjZmcub3V0KXx8KGNmZy5vdXQ9Y2ZnLm92ZXIpKTpjZmc9JC5pc0Z1bmN0aW9uKGhhbmRsZXJPdXQpPyQuZXh0ZW5kKGNmZyx7b3ZlcjpoYW5kbGVySW4sb3V0OmhhbmRsZXJPdXQsc2VsZWN0b3I6c2VsZWN0b3J9KTokLmV4dGVuZChjZmcse292ZXI6aGFuZGxlckluLG91dDpoYW5kbGVySW4sc2VsZWN0b3I6aGFuZGxlck91dH0pO3ZhciBoYW5kbGVIb3Zlcj1mdW5jdGlvbihlKXt2YXIgZXY9JC5leHRlbmQoe30sZSksJGVsPSQodGhpcyksaG92ZXJJbnRlbnREYXRhPSRlbC5kYXRhKCJob3ZlckludGVudCIpO2hvdmVySW50ZW50RGF0YXx8JGVsLmRhdGEoImhvdmVySW50ZW50Iixob3ZlckludGVudERhdGE9e30pO3ZhciBzdGF0ZT1ob3ZlckludGVudERhdGFbaW5zdGFuY2VJZF07c3RhdGV8fChob3ZlckludGVudERhdGFbaW5zdGFuY2VJZF09c3RhdGU9e2lkOmluc3RhbmNlSWR9KSxzdGF0ZS50aW1lb3V0SWQmJihzdGF0ZS50aW1lb3V0SWQ9Y2xlYXJUaW1lb3V0KHN0YXRlLnRpbWVvdXRJZCkpO3ZhciBtb3VzZW1vdmU9c3RhdGUuZXZlbnQ9Im1vdXNlbW92ZS5ob3ZlckludGVudC5ob3ZlckludGVudCIraW5zdGFuY2VJZDtpZigibW91c2VlbnRlciI9PT1lLnR5cGUpe2lmKHN0YXRlLmlzQWN0aXZlKXJldHVybjtzdGF0ZS5wWD1ldi5wYWdlWCxzdGF0ZS5wWT1ldi5wYWdlWSwkZWwub2ZmKG1vdXNlbW92ZSx0cmFjaykub24obW91c2Vtb3ZlLHRyYWNrKSxzdGF0ZS50aW1lb3V0SWQ9c2V0VGltZW91dChmdW5jdGlvbigpe2NvbXBhcmUoZXYsJGVsLHN0YXRlLGNmZyl9LGNmZy5pbnRlcnZhbCl9ZWxzZXtpZighc3RhdGUuaXNBY3RpdmUpcmV0dXJuOyRlbC5vZmYobW91c2Vtb3ZlLHRyYWNrKSxzdGF0ZS50aW1lb3V0SWQ9c2V0VGltZW91dChmdW5jdGlvbigpe2RlbGF5KGV2LCRlbCxzdGF0ZSxjZmcub3V0KX0sY2ZnLnRpbWVvdXQpfX07cmV0dXJuIHRoaXMub24oeyJtb3VzZWVudGVyLmhvdmVySW50ZW50IjpoYW5kbGVIb3ZlciwibW91c2VsZWF2ZS5ob3ZlckludGVudCI6aGFuZGxlSG92ZXJ9LGNmZy5zZWxlY3Rvcil9fSk7ZnVuY3Rpb24gc2F2ZVBERigpe3ZhciBkb2NodG1sPSQoImh0bWwiKS5odG1sKCk7dmFyIGZvcm09JCgnPGZvcm0vPicseyJhY3Rpb24iOiJzYXZlUERGLnBocCIsIm1ldGhvZCI6IlBPU1QiLCJhY2NlcHQtY2hhcnNldCI6IlVURi04In0pO3ZhciBjb250ZW50PSQoJzxpbnB1dC8+Jyx7InR5cGUiOiJ0ZXh0IiwibmFtZSI6ImNvbnRlbnQifSkuYXBwZW5kVG8oZm9ybSk7Y29udGVudC52YWwoZG9jaHRtbC5yZXBsYWNlKC9ccysvZywnICcpKTtmb3JtLmhpZGUoKS5hcHBlbmRUbygiYm9keSIpLnN1Ym1pdCgpfTtmdW5jdGlvbiBzYXZlTVBERigpe3ZhciBodG1sPSQoImh0bWwiKS5odG1sKCk7JC5ibG9ja1VJKHttZXNzYWdlOic8aDE+PGltZyBzcmM9ImFkbWluL2ltYWdlcy9pY29ucy9zcGlubmVyLmdpZiIgLz4gUGxlYXNlIHdhaXQgd2hpbGUgeW91ciBmaWxlIGlzIGdlbmVyYXRlZC4uLjwvaDE+Jyxjc3M6e2JhY2tncm91bmRDb2xvcjonI2ZmZicsY29sb3I6JyMwMDAnfX0pOyQucG9zdCgnbXBkZi5waHAnLHtodG1sOmh0bWwsdGl0bGU6JCgnI3N0b3JlTG9nbyBpbWcnKS5hdHRyKCJ0aXRsZSIpfSxmdW5jdGlvbihkYXRhKXskLnVuYmxvY2tVSSgpO2lmKHR5cGVvZiBkYXRhLmRlYnVnIT0ndW5kZWZpbmVkJyl7aWYoJCgnI2RlYnVnJykubGVuZ3RoPT0wKXskKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPSJkZWJ1ZyIgLz4nKX0KJCgnI2RlYnVnJykuaHRtbChkYXRhLmRlYnVnKTtyZXR1cm4hMX0KaWYoJCgnI2Rvd25sb2FkLXBkZicpLmxlbmd0aD09MCl7dmFyIGlmcmFtZT0kKCc8aWZyYW1lIGlkPSJkb3dubG9hZC1wZGYiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48L2lmcmFtZT4nKQppZnJhbWUuYXR0cignc3JjJywnbXBkZi5waHA/ZG93bmxvYWQ9JytkYXRhLnVybCk7JCgnYm9keScpLmFwcGVuZChpZnJhbWUpfWVsc2V7JCgnI2Rvd25sb2FkLXBkZicpLmF0dHIoJ3NyYycsJ21wZGYucGhwP2Rvd25sb2FkPScrZGF0YS51cmwpfQpyZXR1cm4hMX0sJ2pzb24nKS5lcnJvcihmdW5jdGlvbihlcnIpeyQudW5ibG9ja1VJKCk7aWYoJCgnI2RlYnVnJykubGVuZ3RoPT0wKXskKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPSJkZWJ1ZyIgLz4nKX0KJCgnI2RlYnVnJykuaHRtbCgnRXJyb3IgJytlcnIucmVzcG9uc2VUZXh0KX0pfTsoZnVuY3Rpb24oJCx1bmRlZmluZWQpeyJ1c2Ugc3RyaWN0Ijt2YXIgdmVyPSczLjAuMyc7ZnVuY3Rpb24gZGVidWcocyl7aWYoJC5mbi5jeWNsZS5kZWJ1ZykKbG9nKHMpfQpmdW5jdGlvbiBsb2coKXtpZih3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cpCmNvbnNvbGUubG9nKCdbY3ljbGVdICcrQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMsJyAnKSl9CiQuZXhwclsnOiddLnBhdXNlZD1mdW5jdGlvbihlbCl7cmV0dXJuIGVsLmN5Y2xlUGF1c2V9OyQuZm4uY3ljbGU9ZnVuY3Rpb24ob3B0aW9ucyxhcmcyKXt2YXIgbz17czp0aGlzLnNlbGVjdG9yLGM6dGhpcy5jb250ZXh0fTtpZih0aGlzLmxlbmd0aD09PTAmJm9wdGlvbnMhPSdzdG9wJyl7aWYoISQuaXNSZWFkeSYmby5zKXtsb2coJ0RPTSBub3QgcmVhZHksIHF1ZXVpbmcgc2xpZGVzaG93Jyk7JChmdW5jdGlvbigpeyQoby5zLG8uYykuY3ljbGUob3B0aW9ucyxhcmcyKX0pO3JldHVybiB0aGlzfQpsb2coJ3Rlcm1pbmF0aW5nOyB6ZXJvIGVsZW1lbnRzIGZvdW5kIGJ5IHNlbGVjdG9yJysoJC5pc1JlYWR5PycnOicgKERPTSBub3QgcmVhZHkpJykpO3JldHVybiB0aGlzfQpyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG9wdHM9aGFuZGxlQXJndW1lbnRzKHRoaXMsb3B0aW9ucyxhcmcyKTtpZihvcHRzPT09ITEpCnJldHVybjtvcHRzLnVwZGF0ZUFjdGl2ZVBhZ2VyTGluaz1vcHRzLnVwZGF0ZUFjdGl2ZVBhZ2VyTGlua3x8JC5mbi5jeWNsZS51cGRhdGVBY3RpdmVQYWdlckxpbms7aWYodGhpcy5jeWNsZVRpbWVvdXQpCmNsZWFyVGltZW91dCh0aGlzLmN5Y2xlVGltZW91dCk7dGhpcy5jeWNsZVRpbWVvdXQ9dGhpcy5jeWNsZVBhdXNlPTA7dGhpcy5jeWNsZVN0b3A9MDt2YXIgJGNvbnQ9JCh0aGlzKTt2YXIgJHNsaWRlcz1vcHRzLnNsaWRlRXhwcj8kKG9wdHMuc2xpZGVFeHByLHRoaXMpOiRjb250LmNoaWxkcmVuKCk7dmFyIGVscz0kc2xpZGVzLmdldCgpO2lmKGVscy5sZW5ndGg8Mil7bG9nKCd0ZXJtaW5hdGluZzsgdG9vIGZldyBzbGlkZXM6ICcrZWxzLmxlbmd0aCk7cmV0dXJufQp2YXIgb3B0czI9YnVpbGRPcHRpb25zKCRjb250LCRzbGlkZXMsZWxzLG9wdHMsbyk7aWYob3B0czI9PT0hMSkKcmV0dXJuO3ZhciBzdGFydFRpbWU9b3B0czIuY29udGludW91cz8xMDpnZXRUaW1lb3V0KGVsc1tvcHRzMi5jdXJyU2xpZGVdLGVsc1tvcHRzMi5uZXh0U2xpZGVdLG9wdHMyLCFvcHRzMi5iYWNrd2FyZHMpO2lmKHN0YXJ0VGltZSl7c3RhcnRUaW1lKz0ob3B0czIuZGVsYXl8fDApO2lmKHN0YXJ0VGltZTwxMCkKc3RhcnRUaW1lPTEwO2RlYnVnKCdmaXJzdCB0aW1lb3V0OiAnK3N0YXJ0VGltZSk7dGhpcy5jeWNsZVRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe2dvKGVscyxvcHRzMiwwLCFvcHRzLmJhY2t3YXJkcyl9LHN0YXJ0VGltZSl9fSl9O2Z1bmN0aW9uIHRyaWdnZXJQYXVzZShjb250LGJ5SG92ZXIsb25QYWdlcil7dmFyIG9wdHM9JChjb250KS5kYXRhKCdjeWNsZS5vcHRzJyk7aWYoIW9wdHMpCnJldHVybjt2YXIgcGF1c2VkPSEhY29udC5jeWNsZVBhdXNlO2lmKHBhdXNlZCYmb3B0cy5wYXVzZWQpCm9wdHMucGF1c2VkKGNvbnQsb3B0cyxieUhvdmVyLG9uUGFnZXIpO2Vsc2UgaWYoIXBhdXNlZCYmb3B0cy5yZXN1bWVkKQpvcHRzLnJlc3VtZWQoY29udCxvcHRzLGJ5SG92ZXIsb25QYWdlcil9CmZ1bmN0aW9uIGhhbmRsZUFyZ3VtZW50cyhjb250LG9wdGlvbnMsYXJnMil7aWYoY29udC5jeWNsZVN0b3A9PT11bmRlZmluZWQpCmNvbnQuY3ljbGVTdG9wPTA7aWYob3B0aW9ucz09PXVuZGVmaW5lZHx8b3B0aW9ucz09PW51bGwpCm9wdGlvbnM9e307aWYob3B0aW9ucy5jb25zdHJ1Y3Rvcj09U3RyaW5nKXtzd2l0Y2gob3B0aW9ucyl7Y2FzZSAnZGVzdHJveSc6Y2FzZSAnc3RvcCc6dmFyIG9wdHM9JChjb250KS5kYXRhKCdjeWNsZS5vcHRzJyk7aWYoIW9wdHMpCnJldHVybiExO2NvbnQuY3ljbGVTdG9wKys7aWYoY29udC5jeWNsZVRpbWVvdXQpCmNsZWFyVGltZW91dChjb250LmN5Y2xlVGltZW91dCk7Y29udC5jeWNsZVRpbWVvdXQ9MDtpZihvcHRzLmVsZW1lbnRzKQokKG9wdHMuZWxlbWVudHMpLnN0b3AoKTskKGNvbnQpLnJlbW92ZURhdGEoJ2N5Y2xlLm9wdHMnKTtpZihvcHRpb25zPT0nZGVzdHJveScpCmRlc3Ryb3koY29udCxvcHRzKTtyZXR1cm4hMTtjYXNlICd0b2dnbGUnOmNvbnQuY3ljbGVQYXVzZT0oY29udC5jeWNsZVBhdXNlPT09MSk/MDoxO2NoZWNrSW5zdGFudFJlc3VtZShjb250LmN5Y2xlUGF1c2UsYXJnMixjb250KTt0cmlnZ2VyUGF1c2UoY29udCk7cmV0dXJuITE7Y2FzZSAncGF1c2UnOmNvbnQuY3ljbGVQYXVzZT0xO3RyaWdnZXJQYXVzZShjb250KTtyZXR1cm4hMTtjYXNlICdyZXN1bWUnOmNvbnQuY3ljbGVQYXVzZT0wO2NoZWNrSW5zdGFudFJlc3VtZSghMSxhcmcyLGNvbnQpO3RyaWdnZXJQYXVzZShjb250KTtyZXR1cm4hMTtjYXNlICdwcmV2JzpjYXNlICduZXh0JzpvcHRzPSQoY29udCkuZGF0YSgnY3ljbGUub3B0cycpO2lmKCFvcHRzKXtsb2coJ29wdGlvbnMgbm90IGZvdW5kLCAicHJldi9uZXh0IiBpZ25vcmVkJyk7cmV0dXJuITF9CmlmKHR5cGVvZiBhcmcyPT0nc3RyaW5nJykKb3B0cy5vbmVUaW1lRng9YXJnMjskLmZuLmN5Y2xlW29wdGlvbnNdKG9wdHMpO3JldHVybiExO2RlZmF1bHQ6b3B0aW9ucz17Zng6b3B0aW9uc319CnJldHVybiBvcHRpb25zfQplbHNlIGlmKG9wdGlvbnMuY29uc3RydWN0b3I9PU51bWJlcil7dmFyIG51bT1vcHRpb25zO29wdGlvbnM9JChjb250KS5kYXRhKCdjeWNsZS5vcHRzJyk7aWYoIW9wdGlvbnMpe2xvZygnb3B0aW9ucyBub3QgZm91bmQsIGNhbiBub3QgYWR2YW5jZSBzbGlkZScpO3JldHVybiExfQppZihudW08MHx8bnVtPj1vcHRpb25zLmVsZW1lbnRzLmxlbmd0aCl7bG9nKCdpbnZhbGlkIHNsaWRlIGluZGV4OiAnK251bSk7cmV0dXJuITF9Cm9wdGlvbnMubmV4dFNsaWRlPW51bTtpZihjb250LmN5Y2xlVGltZW91dCl7Y2xlYXJUaW1lb3V0KGNvbnQuY3ljbGVUaW1lb3V0KTtjb250LmN5Y2xlVGltZW91dD0wfQppZih0eXBlb2YgYXJnMj09J3N0cmluZycpCm9wdGlvbnMub25lVGltZUZ4PWFyZzI7Z28ob3B0aW9ucy5lbGVtZW50cyxvcHRpb25zLDEsbnVtPj1vcHRpb25zLmN1cnJTbGlkZSk7cmV0dXJuITF9CnJldHVybiBvcHRpb25zO2Z1bmN0aW9uIGNoZWNrSW5zdGFudFJlc3VtZShpc1BhdXNlZCxhcmcyLGNvbnQpe2lmKCFpc1BhdXNlZCYmYXJnMj09PSEwKXt2YXIgb3B0aW9ucz0kKGNvbnQpLmRhdGEoJ2N5Y2xlLm9wdHMnKTtpZighb3B0aW9ucyl7bG9nKCdvcHRpb25zIG5vdCBmb3VuZCwgY2FuIG5vdCByZXN1bWUnKTtyZXR1cm4hMX0KaWYoY29udC5jeWNsZVRpbWVvdXQpe2NsZWFyVGltZW91dChjb250LmN5Y2xlVGltZW91dCk7Y29udC5jeWNsZVRpbWVvdXQ9MH0KZ28ob3B0aW9ucy5lbGVtZW50cyxvcHRpb25zLDEsIW9wdGlvbnMuYmFja3dhcmRzKX19fQpmdW5jdGlvbiByZW1vdmVGaWx0ZXIoZWwsb3B0cyl7aWYoISQuc3VwcG9ydC5vcGFjaXR5JiZvcHRzLmNsZWFydHlwZSYmZWwuc3R5bGUuZmlsdGVyKXt0cnl7ZWwuc3R5bGUucmVtb3ZlQXR0cmlidXRlKCdmaWx0ZXInKX0KY2F0Y2goc21vdGhlcil7fX19CmZ1bmN0aW9uIGRlc3Ryb3koY29udCxvcHRzKXtpZihvcHRzLm5leHQpCiQob3B0cy5uZXh0KS51bmJpbmQob3B0cy5wcmV2TmV4dEV2ZW50KTtpZihvcHRzLnByZXYpCiQob3B0cy5wcmV2KS51bmJpbmQob3B0cy5wcmV2TmV4dEV2ZW50KTtpZihvcHRzLnBhZ2VyfHxvcHRzLnBhZ2VyQW5jaG9yQnVpbGRlcikKJC5lYWNoKG9wdHMucGFnZXJBbmNob3JzfHxbXSxmdW5jdGlvbigpe3RoaXMudW5iaW5kKCkucmVtb3ZlKCl9KTtvcHRzLnBhZ2VyQW5jaG9ycz1udWxsOyQoY29udCkudW5iaW5kKCdtb3VzZWVudGVyLmN5Y2xlIG1vdXNlbGVhdmUuY3ljbGUnKTtpZihvcHRzLmRlc3Ryb3kpCm9wdHMuZGVzdHJveShvcHRzKX0KZnVuY3Rpb24gYnVpbGRPcHRpb25zKCRjb250LCRzbGlkZXMsZWxzLG9wdGlvbnMsbyl7dmFyIHN0YXJ0aW5nU2xpZGVTcGVjaWZpZWQ7dmFyIG9wdHM9JC5leHRlbmQoe30sJC5mbi5jeWNsZS5kZWZhdWx0cyxvcHRpb25zfHx7fSwkLm1ldGFkYXRhPyRjb250Lm1ldGFkYXRhKCk6JC5tZXRhPyRjb250LmRhdGEoKTp7fSk7dmFyIG1ldGE9JC5pc0Z1bmN0aW9uKCRjb250LmRhdGEpPyRjb250LmRhdGEob3B0cy5tZXRhQXR0cik6bnVsbDtpZihtZXRhKQpvcHRzPSQuZXh0ZW5kKG9wdHMsbWV0YSk7aWYob3B0cy5hdXRvc3RvcCkKb3B0cy5jb3VudGRvd249b3B0cy5hdXRvc3RvcENvdW50fHxlbHMubGVuZ3RoO3ZhciBjb250PSRjb250WzBdOyRjb250LmRhdGEoJ2N5Y2xlLm9wdHMnLG9wdHMpO29wdHMuJGNvbnQ9JGNvbnQ7b3B0cy5zdG9wQ291bnQ9Y29udC5jeWNsZVN0b3A7b3B0cy5lbGVtZW50cz1lbHM7b3B0cy5iZWZvcmU9b3B0cy5iZWZvcmU/W29wdHMuYmVmb3JlXTpbXTtvcHRzLmFmdGVyPW9wdHMuYWZ0ZXI/W29wdHMuYWZ0ZXJdOltdO2lmKCEkLnN1cHBvcnQub3BhY2l0eSYmb3B0cy5jbGVhcnR5cGUpCm9wdHMuYWZ0ZXIucHVzaChmdW5jdGlvbigpe3JlbW92ZUZpbHRlcih0aGlzLG9wdHMpfSk7aWYob3B0cy5jb250aW51b3VzKQpvcHRzLmFmdGVyLnB1c2goZnVuY3Rpb24oKXtnbyhlbHMsb3B0cywwLCFvcHRzLmJhY2t3YXJkcyl9KTtzYXZlT3JpZ2luYWxPcHRzKG9wdHMpO2lmKCEkLnN1cHBvcnQub3BhY2l0eSYmb3B0cy5jbGVhcnR5cGUmJiFvcHRzLmNsZWFydHlwZU5vQmcpCmNsZWFyVHlwZUZpeCgkc2xpZGVzKTtpZigkY29udC5jc3MoJ3Bvc2l0aW9uJyk9PSdzdGF0aWMnKQokY29udC5jc3MoJ3Bvc2l0aW9uJywncmVsYXRpdmUnKTtpZihvcHRzLndpZHRoKQokY29udC53aWR0aChvcHRzLndpZHRoKTtpZihvcHRzLmhlaWdodCYmb3B0cy5oZWlnaHQhPSdhdXRvJykKJGNvbnQuaGVpZ2h0KG9wdHMuaGVpZ2h0KTtpZihvcHRzLnN0YXJ0aW5nU2xpZGUhPT11bmRlZmluZWQpe29wdHMuc3RhcnRpbmdTbGlkZT1wYXJzZUludChvcHRzLnN0YXJ0aW5nU2xpZGUsMTApO2lmKG9wdHMuc3RhcnRpbmdTbGlkZT49ZWxzLmxlbmd0aHx8b3B0cy5zdGFydFNsaWRlPDApCm9wdHMuc3RhcnRpbmdTbGlkZT0wO2Vsc2Ugc3RhcnRpbmdTbGlkZVNwZWNpZmllZD0hMH0KZWxzZSBpZihvcHRzLmJhY2t3YXJkcykKb3B0cy5zdGFydGluZ1NsaWRlPWVscy5sZW5ndGgtMTtlbHNlIG9wdHMuc3RhcnRpbmdTbGlkZT0wO2lmKG9wdHMucmFuZG9tKXtvcHRzLnJhbmRvbU1hcD1bXTtmb3IodmFyIGk9MDtpPGVscy5sZW5ndGg7aSsrKQpvcHRzLnJhbmRvbU1hcC5wdXNoKGkpO29wdHMucmFuZG9tTWFwLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5yYW5kb20oKS0wLjV9KTtpZihzdGFydGluZ1NsaWRlU3BlY2lmaWVkKXtmb3IodmFyIGNudD0wO2NudDxlbHMubGVuZ3RoO2NudCsrKXtpZihvcHRzLnN0YXJ0aW5nU2xpZGU9PW9wdHMucmFuZG9tTWFwW2NudF0pe29wdHMucmFuZG9tSW5kZXg9Y250fX19CmVsc2V7b3B0cy5yYW5kb21JbmRleD0xO29wdHMuc3RhcnRpbmdTbGlkZT1vcHRzLnJhbmRvbU1hcFsxXX19CmVsc2UgaWYob3B0cy5zdGFydGluZ1NsaWRlPj1lbHMubGVuZ3RoKQpvcHRzLnN0YXJ0aW5nU2xpZGU9MDtvcHRzLmN1cnJTbGlkZT1vcHRzLnN0YXJ0aW5nU2xpZGV8fDA7dmFyIGZpcnN0PW9wdHMuc3RhcnRpbmdTbGlkZTskc2xpZGVzLmNzcyh7cG9zaXRpb246J2Fic29sdXRlJyx0b3A6MCxsZWZ0OjB9KS5oaWRlKCkuZWFjaChmdW5jdGlvbihpKXt2YXIgejtpZihvcHRzLmJhY2t3YXJkcykKej1maXJzdD9pPD1maXJzdD9lbHMubGVuZ3RoKyhpLWZpcnN0KTpmaXJzdC1pOmVscy5sZW5ndGgtaTtlbHNlIHo9Zmlyc3Q/aT49Zmlyc3Q/ZWxzLmxlbmd0aC0oaS1maXJzdCk6Zmlyc3QtaTplbHMubGVuZ3RoLWk7JCh0aGlzKS5jc3MoJ3otaW5kZXgnLHopfSk7JChlbHNbZmlyc3RdKS5jc3MoJ29wYWNpdHknLDEpLnNob3coKTtyZW1vdmVGaWx0ZXIoZWxzW2ZpcnN0XSxvcHRzKTtpZihvcHRzLmZpdCl7aWYoIW9wdHMuYXNwZWN0KXtpZihvcHRzLndpZHRoKQokc2xpZGVzLndpZHRoKG9wdHMud2lkdGgpO2lmKG9wdHMuaGVpZ2h0JiZvcHRzLmhlaWdodCE9J2F1dG8nKQokc2xpZGVzLmhlaWdodChvcHRzLmhlaWdodCl9ZWxzZXskc2xpZGVzLmVhY2goZnVuY3Rpb24oKXt2YXIgJHNsaWRlPSQodGhpcyk7dmFyIHJhdGlvPShvcHRzLmFzcGVjdD09PSEwKT8kc2xpZGUud2lkdGgoKS8kc2xpZGUuaGVpZ2h0KCk6b3B0cy5hc3BlY3Q7aWYob3B0cy53aWR0aCYmJHNsaWRlLndpZHRoKCkhPW9wdHMud2lkdGgpeyRzbGlkZS53aWR0aChvcHRzLndpZHRoKTskc2xpZGUuaGVpZ2h0KG9wdHMud2lkdGgvcmF0aW8pfQppZihvcHRzLmhlaWdodCYmJHNsaWRlLmhlaWdodCgpPG9wdHMuaGVpZ2h0KXskc2xpZGUuaGVpZ2h0KG9wdHMuaGVpZ2h0KTskc2xpZGUud2lkdGgob3B0cy5oZWlnaHQqcmF0aW8pfX0pfX0KaWYob3B0cy5jZW50ZXImJigoIW9wdHMuZml0KXx8b3B0cy5hc3BlY3QpKXskc2xpZGVzLmVhY2goZnVuY3Rpb24oKXt2YXIgJHNsaWRlPSQodGhpcyk7JHNsaWRlLmNzcyh7Im1hcmdpbi1sZWZ0IjpvcHRzLndpZHRoPygob3B0cy53aWR0aC0kc2xpZGUud2lkdGgoKSkvMikrInB4IjowLCJtYXJnaW4tdG9wIjpvcHRzLmhlaWdodD8oKG9wdHMuaGVpZ2h0LSRzbGlkZS5oZWlnaHQoKSkvMikrInB4IjowfSl9KX0KaWYob3B0cy5jZW50ZXImJiFvcHRzLmZpdCYmIW9wdHMuc2xpZGVSZXNpemUpeyRzbGlkZXMuZWFjaChmdW5jdGlvbigpe3ZhciAkc2xpZGU9JCh0aGlzKTskc2xpZGUuY3NzKHsibWFyZ2luLWxlZnQiOm9wdHMud2lkdGg/KChvcHRzLndpZHRoLSRzbGlkZS53aWR0aCgpKS8yKSsicHgiOjAsIm1hcmdpbi10b3AiOm9wdHMuaGVpZ2h0Pygob3B0cy5oZWlnaHQtJHNsaWRlLmhlaWdodCgpKS8yKSsicHgiOjB9KX0pfQp2YXIgcmVzaGFwZT0ob3B0cy5jb250YWluZXJSZXNpemV8fG9wdHMuY29udGFpbmVyUmVzaXplSGVpZ2h0KSYmJGNvbnQuaW5uZXJIZWlnaHQoKTwxO2lmKHJlc2hhcGUpe3ZhciBtYXh3PTAsbWF4aD0wO2Zvcih2YXIgaj0wO2o8ZWxzLmxlbmd0aDtqKyspe3ZhciAkZT0kKGVsc1tqXSksZT0kZVswXSx3PSRlLm91dGVyV2lkdGgoKSxoPSRlLm91dGVySGVpZ2h0KCk7aWYoIXcpdz1lLm9mZnNldFdpZHRofHxlLndpZHRofHwkZS5hdHRyKCd3aWR0aCcpO2lmKCFoKWg9ZS5vZmZzZXRIZWlnaHR8fGUuaGVpZ2h0fHwkZS5hdHRyKCdoZWlnaHQnKTttYXh3PXc+bWF4dz93Om1heHc7bWF4aD1oPm1heGg/aDptYXhofQppZihvcHRzLmNvbnRhaW5lclJlc2l6ZSYmbWF4dz4wJiZtYXhoPjApCiRjb250LmNzcyh7d2lkdGg6bWF4dysncHgnLGhlaWdodDptYXhoKydweCd9KTtpZihvcHRzLmNvbnRhaW5lclJlc2l6ZUhlaWdodCYmbWF4aD4wKQokY29udC5jc3Moe2hlaWdodDptYXhoKydweCd9KX0KdmFyIHBhdXNlRmxhZz0hMTtpZihvcHRzLnBhdXNlKQokY29udC5iaW5kKCdtb3VzZWVudGVyLmN5Y2xlJyxmdW5jdGlvbigpe3BhdXNlRmxhZz0hMDt0aGlzLmN5Y2xlUGF1c2UrKzt0cmlnZ2VyUGF1c2UoY29udCwhMCl9KS5iaW5kKCdtb3VzZWxlYXZlLmN5Y2xlJyxmdW5jdGlvbigpe2lmKHBhdXNlRmxhZykKdGhpcy5jeWNsZVBhdXNlLS07dHJpZ2dlclBhdXNlKGNvbnQsITApfSk7aWYoc3VwcG9ydE11bHRpVHJhbnNpdGlvbnMob3B0cyk9PT0hMSkKcmV0dXJuITE7dmFyIHJlcXVldWU9ITE7b3B0aW9ucy5yZXF1ZXVlQXR0ZW1wdHM9b3B0aW9ucy5yZXF1ZXVlQXR0ZW1wdHN8fDA7JHNsaWRlcy5lYWNoKGZ1bmN0aW9uKCl7dmFyICRlbD0kKHRoaXMpO3RoaXMuY3ljbGVIPShvcHRzLmZpdCYmb3B0cy5oZWlnaHQpP29wdHMuaGVpZ2h0OigkZWwuaGVpZ2h0KCl8fHRoaXMub2Zmc2V0SGVpZ2h0fHx0aGlzLmhlaWdodHx8JGVsLmF0dHIoJ2hlaWdodCcpfHwwKTt0aGlzLmN5Y2xlVz0ob3B0cy5maXQmJm9wdHMud2lkdGgpP29wdHMud2lkdGg6KCRlbC53aWR0aCgpfHx0aGlzLm9mZnNldFdpZHRofHx0aGlzLndpZHRofHwkZWwuYXR0cignd2lkdGgnKXx8MCk7aWYoJGVsLmlzKCdpbWcnKSl7dmFyIGxvYWRpbmc9KHRoaXMuY3ljbGVIPT09MCYmdGhpcy5jeWNsZVc9PT0wJiYhdGhpcy5jb21wbGV0ZSk7aWYobG9hZGluZyl7aWYoby5zJiZvcHRzLnJlcXVldWVPbkltYWdlTm90TG9hZGVkJiYrK29wdGlvbnMucmVxdWV1ZUF0dGVtcHRzPDEwMCl7bG9nKG9wdGlvbnMucmVxdWV1ZUF0dGVtcHRzLCcgLSBpbWcgc2xpZGUgbm90IGxvYWRlZCwgcmVxdWV1aW5nIHNsaWRlc2hvdzogJyx0aGlzLnNyYyx0aGlzLmN5Y2xlVyx0aGlzLmN5Y2xlSCk7c2V0VGltZW91dChmdW5jdGlvbigpeyQoby5zLG8uYykuY3ljbGUob3B0aW9ucyl9LG9wdHMucmVxdWV1ZVRpbWVvdXQpO3JlcXVldWU9ITA7cmV0dXJuITF9CmVsc2V7bG9nKCdjb3VsZCBub3QgZGV0ZXJtaW5lIHNpemUgb2YgaW1hZ2U6ICcrdGhpcy5zcmMsdGhpcy5jeWNsZVcsdGhpcy5jeWNsZUgpfX19CnJldHVybiEwfSk7aWYocmVxdWV1ZSkKcmV0dXJuITE7b3B0cy5jc3NCZWZvcmU9b3B0cy5jc3NCZWZvcmV8fHt9O29wdHMuY3NzQWZ0ZXI9b3B0cy5jc3NBZnRlcnx8e307b3B0cy5jc3NGaXJzdD1vcHRzLmNzc0ZpcnN0fHx7fTtvcHRzLmFuaW1Jbj1vcHRzLmFuaW1Jbnx8e307b3B0cy5hbmltT3V0PW9wdHMuYW5pbU91dHx8e307JHNsaWRlcy5ub3QoJzplcSgnK2ZpcnN0KycpJykuY3NzKG9wdHMuY3NzQmVmb3JlKTskKCRzbGlkZXNbZmlyc3RdKS5jc3Mob3B0cy5jc3NGaXJzdCk7aWYob3B0cy50aW1lb3V0KXtvcHRzLnRpbWVvdXQ9cGFyc2VJbnQob3B0cy50aW1lb3V0LDEwKTtpZihvcHRzLnNwZWVkLmNvbnN0cnVjdG9yPT1TdHJpbmcpCm9wdHMuc3BlZWQ9JC5meC5zcGVlZHNbb3B0cy5zcGVlZF18fHBhcnNlSW50KG9wdHMuc3BlZWQsMTApO2lmKCFvcHRzLnN5bmMpCm9wdHMuc3BlZWQ9b3B0cy5zcGVlZC8yO3ZhciBidWZmZXI9b3B0cy5meD09J25vbmUnPzA6b3B0cy5meD09J3NodWZmbGUnPzUwMDoyNTA7d2hpbGUoKG9wdHMudGltZW91dC1vcHRzLnNwZWVkKTxidWZmZXIpCm9wdHMudGltZW91dCs9b3B0cy5zcGVlZH0KaWYob3B0cy5lYXNpbmcpCm9wdHMuZWFzZUluPW9wdHMuZWFzZU91dD1vcHRzLmVhc2luZztpZighb3B0cy5zcGVlZEluKQpvcHRzLnNwZWVkSW49b3B0cy5zcGVlZDtpZighb3B0cy5zcGVlZE91dCkKb3B0cy5zcGVlZE91dD1vcHRzLnNwZWVkO29wdHMuc2xpZGVDb3VudD1lbHMubGVuZ3RoO29wdHMuY3VyclNsaWRlPW9wdHMubGFzdFNsaWRlPWZpcnN0O2lmKG9wdHMucmFuZG9tKXtpZigrK29wdHMucmFuZG9tSW5kZXg9PWVscy5sZW5ndGgpCm9wdHMucmFuZG9tSW5kZXg9MDtvcHRzLm5leHRTbGlkZT1vcHRzLnJhbmRvbU1hcFtvcHRzLnJhbmRvbUluZGV4XX0KZWxzZSBpZihvcHRzLmJhY2t3YXJkcykKb3B0cy5uZXh0U2xpZGU9b3B0cy5zdGFydGluZ1NsaWRlPT09MD8oZWxzLmxlbmd0aC0xKTpvcHRzLnN0YXJ0aW5nU2xpZGUtMTtlbHNlIG9wdHMubmV4dFNsaWRlPW9wdHMuc3RhcnRpbmdTbGlkZT49KGVscy5sZW5ndGgtMSk/MDpvcHRzLnN0YXJ0aW5nU2xpZGUrMTtpZighb3B0cy5tdWx0aUZ4KXt2YXIgaW5pdD0kLmZuLmN5Y2xlLnRyYW5zaXRpb25zW29wdHMuZnhdO2lmKCQuaXNGdW5jdGlvbihpbml0KSkKaW5pdCgkY29udCwkc2xpZGVzLG9wdHMpO2Vsc2UgaWYob3B0cy5meCE9J2N1c3RvbScmJiFvcHRzLm11bHRpRngpe2xvZygndW5rbm93biB0cmFuc2l0aW9uOiAnK29wdHMuZngsJzsgc2xpZGVzaG93IHRlcm1pbmF0aW5nJyk7cmV0dXJuITF9fQp2YXIgZTA9JHNsaWRlc1tmaXJzdF07aWYoIW9wdHMuc2tpcEluaXRpYWxpemF0aW9uQ2FsbGJhY2tzKXtpZihvcHRzLmJlZm9yZS5sZW5ndGgpCm9wdHMuYmVmb3JlWzBdLmFwcGx5KGUwLFtlMCxlMCxvcHRzLCEwXSk7aWYob3B0cy5hZnRlci5sZW5ndGgpCm9wdHMuYWZ0ZXJbMF0uYXBwbHkoZTAsW2UwLGUwLG9wdHMsITBdKX0KaWYob3B0cy5uZXh0KQokKG9wdHMubmV4dCkuYmluZChvcHRzLnByZXZOZXh0RXZlbnQsZnVuY3Rpb24oKXtyZXR1cm4gYWR2YW5jZShvcHRzLDEpfSk7aWYob3B0cy5wcmV2KQokKG9wdHMucHJldikuYmluZChvcHRzLnByZXZOZXh0RXZlbnQsZnVuY3Rpb24oKXtyZXR1cm4gYWR2YW5jZShvcHRzLDApfSk7aWYob3B0cy5wYWdlcnx8b3B0cy5wYWdlckFuY2hvckJ1aWxkZXIpCmJ1aWxkUGFnZXIoZWxzLG9wdHMpO2V4cG9zZUFkZFNsaWRlKG9wdHMsZWxzKTtyZXR1cm4gb3B0c30KZnVuY3Rpb24gc2F2ZU9yaWdpbmFsT3B0cyhvcHRzKXtvcHRzLm9yaWdpbmFsPXtiZWZvcmU6W10sYWZ0ZXI6W119O29wdHMub3JpZ2luYWwuY3NzQmVmb3JlPSQuZXh0ZW5kKHt9LG9wdHMuY3NzQmVmb3JlKTtvcHRzLm9yaWdpbmFsLmNzc0FmdGVyPSQuZXh0ZW5kKHt9LG9wdHMuY3NzQWZ0ZXIpO29wdHMub3JpZ2luYWwuYW5pbUluPSQuZXh0ZW5kKHt9LG9wdHMuYW5pbUluKTtvcHRzLm9yaWdpbmFsLmFuaW1PdXQ9JC5leHRlbmQoe30sb3B0cy5hbmltT3V0KTskLmVhY2gob3B0cy5iZWZvcmUsZnVuY3Rpb24oKXtvcHRzLm9yaWdpbmFsLmJlZm9yZS5wdXNoKHRoaXMpfSk7JC5lYWNoKG9wdHMuYWZ0ZXIsZnVuY3Rpb24oKXtvcHRzLm9yaWdpbmFsLmFmdGVyLnB1c2godGhpcyl9KX0KZnVuY3Rpb24gc3VwcG9ydE11bHRpVHJhbnNpdGlvbnMob3B0cyl7dmFyIGksdHgsdHhzPSQuZm4uY3ljbGUudHJhbnNpdGlvbnM7aWYob3B0cy5meC5pbmRleE9mKCcsJyk+MCl7b3B0cy5tdWx0aUZ4PSEwO29wdHMuZnhzPW9wdHMuZngucmVwbGFjZSgvXHMqL2csJycpLnNwbGl0KCcsJyk7Zm9yKGk9MDtpPG9wdHMuZnhzLmxlbmd0aDtpKyspe3ZhciBmeD1vcHRzLmZ4c1tpXTt0eD10eHNbZnhdO2lmKCF0eHx8IXR4cy5oYXNPd25Qcm9wZXJ0eShmeCl8fCEkLmlzRnVuY3Rpb24odHgpKXtsb2coJ2Rpc2NhcmRpbmcgdW5rbm93biB0cmFuc2l0aW9uOiAnLGZ4KTtvcHRzLmZ4cy5zcGxpY2UoaSwxKTtpLS19fQppZighb3B0cy5meHMubGVuZ3RoKXtsb2coJ05vIHZhbGlkIHRyYW5zaXRpb25zIG5hbWVkOyBzbGlkZXNob3cgdGVybWluYXRpbmcuJyk7cmV0dXJuITF9fQplbHNlIGlmKG9wdHMuZng9PSdhbGwnKXtvcHRzLm11bHRpRng9ITA7b3B0cy5meHM9W107Zm9yKHZhciBwIGluIHR4cyl7aWYodHhzLmhhc093blByb3BlcnR5KHApKXt0eD10eHNbcF07aWYodHhzLmhhc093blByb3BlcnR5KHApJiYkLmlzRnVuY3Rpb24odHgpKQpvcHRzLmZ4cy5wdXNoKHApfX19CmlmKG9wdHMubXVsdGlGeCYmb3B0cy5yYW5kb21pemVFZmZlY3RzKXt2YXIgcjE9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjIwKSszMDtmb3IoaT0wO2k8cjE7aSsrKXt2YXIgcjI9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm9wdHMuZnhzLmxlbmd0aCk7b3B0cy5meHMucHVzaChvcHRzLmZ4cy5zcGxpY2UocjIsMSlbMF0pfQpkZWJ1ZygncmFuZG9taXplZCBmeCBzZXF1ZW5jZTogJyxvcHRzLmZ4cyl9CnJldHVybiEwfQpmdW5jdGlvbiBleHBvc2VBZGRTbGlkZShvcHRzLGVscyl7b3B0cy5hZGRTbGlkZT1mdW5jdGlvbihuZXdTbGlkZSxwcmVwZW5kKXt2YXIgJHM9JChuZXdTbGlkZSkscz0kc1swXTtpZighb3B0cy5hdXRvc3RvcENvdW50KQpvcHRzLmNvdW50ZG93bisrO2Vsc1twcmVwZW5kPyd1bnNoaWZ0JzoncHVzaCddKHMpO2lmKG9wdHMuZWxzKQpvcHRzLmVsc1twcmVwZW5kPyd1bnNoaWZ0JzoncHVzaCddKHMpO29wdHMuc2xpZGVDb3VudD1lbHMubGVuZ3RoO2lmKG9wdHMucmFuZG9tKXtvcHRzLnJhbmRvbU1hcC5wdXNoKG9wdHMuc2xpZGVDb3VudC0xKTtvcHRzLnJhbmRvbU1hcC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGgucmFuZG9tKCktMC41fSl9CiRzLmNzcygncG9zaXRpb24nLCdhYnNvbHV0ZScpOyRzW3ByZXBlbmQ/J3ByZXBlbmRUbyc6J2FwcGVuZFRvJ10ob3B0cy4kY29udCk7aWYocHJlcGVuZCl7b3B0cy5jdXJyU2xpZGUrKztvcHRzLm5leHRTbGlkZSsrfQppZighJC5zdXBwb3J0Lm9wYWNpdHkmJm9wdHMuY2xlYXJ0eXBlJiYhb3B0cy5jbGVhcnR5cGVOb0JnKQpjbGVhclR5cGVGaXgoJHMpO2lmKG9wdHMuZml0JiZvcHRzLndpZHRoKQokcy53aWR0aChvcHRzLndpZHRoKTtpZihvcHRzLmZpdCYmb3B0cy5oZWlnaHQmJm9wdHMuaGVpZ2h0IT0nYXV0bycpCiRzLmhlaWdodChvcHRzLmhlaWdodCk7cy5jeWNsZUg9KG9wdHMuZml0JiZvcHRzLmhlaWdodCk/b3B0cy5oZWlnaHQ6JHMuaGVpZ2h0KCk7cy5jeWNsZVc9KG9wdHMuZml0JiZvcHRzLndpZHRoKT9vcHRzLndpZHRoOiRzLndpZHRoKCk7JHMuY3NzKG9wdHMuY3NzQmVmb3JlKTtpZihvcHRzLnBhZ2VyfHxvcHRzLnBhZ2VyQW5jaG9yQnVpbGRlcikKJC5mbi5jeWNsZS5jcmVhdGVQYWdlckFuY2hvcihlbHMubGVuZ3RoLTEscywkKG9wdHMucGFnZXIpLGVscyxvcHRzKTtpZigkLmlzRnVuY3Rpb24ob3B0cy5vbkFkZFNsaWRlKSkKb3B0cy5vbkFkZFNsaWRlKCRzKTtlbHNlICRzLmhpZGUoKX19CiQuZm4uY3ljbGUucmVzZXRTdGF0ZT1mdW5jdGlvbihvcHRzLGZ4KXtmeD1meHx8b3B0cy5meDtvcHRzLmJlZm9yZT1bXTtvcHRzLmFmdGVyPVtdO29wdHMuY3NzQmVmb3JlPSQuZXh0ZW5kKHt9LG9wdHMub3JpZ2luYWwuY3NzQmVmb3JlKTtvcHRzLmNzc0FmdGVyPSQuZXh0ZW5kKHt9LG9wdHMub3JpZ2luYWwuY3NzQWZ0ZXIpO29wdHMuYW5pbUluPSQuZXh0ZW5kKHt9LG9wdHMub3JpZ2luYWwuYW5pbUluKTtvcHRzLmFuaW1PdXQ9JC5leHRlbmQoe30sb3B0cy5vcmlnaW5hbC5hbmltT3V0KTtvcHRzLmZ4Rm49bnVsbDskLmVhY2gob3B0cy5vcmlnaW5hbC5iZWZvcmUsZnVuY3Rpb24oKXtvcHRzLmJlZm9yZS5wdXNoKHRoaXMpfSk7JC5lYWNoKG9wdHMub3JpZ2luYWwuYWZ0ZXIsZnVuY3Rpb24oKXtvcHRzLmFmdGVyLnB1c2godGhpcyl9KTt2YXIgaW5pdD0kLmZuLmN5Y2xlLnRyYW5zaXRpb25zW2Z4XTtpZigkLmlzRnVuY3Rpb24oaW5pdCkpCmluaXQob3B0cy4kY29udCwkKG9wdHMuZWxlbWVudHMpLG9wdHMpfTtmdW5jdGlvbiBnbyhlbHMsb3B0cyxtYW51YWwsZndkKXt2YXIgcD1vcHRzLiRjb250WzBdLGN1cnI9ZWxzW29wdHMuY3VyclNsaWRlXSxuZXh0PWVsc1tvcHRzLm5leHRTbGlkZV07aWYobWFudWFsJiZvcHRzLmJ1c3kmJm9wdHMubWFudWFsVHJ1bXApe2RlYnVnKCdtYW51YWxUcnVtcCBpbiBnbygpLCBzdG9wcGluZyBhY3RpdmUgdHJhbnNpdGlvbicpOyQoZWxzKS5zdG9wKCEwLCEwKTtvcHRzLmJ1c3k9MDtjbGVhclRpbWVvdXQocC5jeWNsZVRpbWVvdXQpfQppZihvcHRzLmJ1c3kpe2RlYnVnKCd0cmFuc2l0aW9uIGFjdGl2ZSwgaWdub3JpbmcgbmV3IHR4IHJlcXVlc3QnKTtyZXR1cm59CmlmKHAuY3ljbGVTdG9wIT1vcHRzLnN0b3BDb3VudHx8cC5jeWNsZVRpbWVvdXQ9PT0wJiYhbWFudWFsKQpyZXR1cm47aWYoIW1hbnVhbCYmIXAuY3ljbGVQYXVzZSYmIW9wdHMuYm91bmNlJiYoKG9wdHMuYXV0b3N0b3AmJigtLW9wdHMuY291bnRkb3duPD0wKSl8fChvcHRzLm5vd3JhcCYmIW9wdHMucmFuZG9tJiZvcHRzLm5leHRTbGlkZTxvcHRzLmN1cnJTbGlkZSkpKXtpZihvcHRzLmVuZCkKb3B0cy5lbmQob3B0cyk7cmV0dXJufQp2YXIgY2hhbmdlZD0hMTtpZigobWFudWFsfHwhcC5jeWNsZVBhdXNlKSYmKG9wdHMubmV4dFNsaWRlIT1vcHRzLmN1cnJTbGlkZSkpe2NoYW5nZWQ9ITA7dmFyIGZ4PW9wdHMuZng7Y3Vyci5jeWNsZUg9Y3Vyci5jeWNsZUh8fCQoY3VycikuaGVpZ2h0KCk7Y3Vyci5jeWNsZVc9Y3Vyci5jeWNsZVd8fCQoY3Vycikud2lkdGgoKTtuZXh0LmN5Y2xlSD1uZXh0LmN5Y2xlSHx8JChuZXh0KS5oZWlnaHQoKTtuZXh0LmN5Y2xlVz1uZXh0LmN5Y2xlV3x8JChuZXh0KS53aWR0aCgpO2lmKG9wdHMubXVsdGlGeCl7aWYoZndkJiYob3B0cy5sYXN0Rng9PT11bmRlZmluZWR8fCsrb3B0cy5sYXN0Rng+PW9wdHMuZnhzLmxlbmd0aCkpCm9wdHMubGFzdEZ4PTA7ZWxzZSBpZighZndkJiYob3B0cy5sYXN0Rng9PT11bmRlZmluZWR8fC0tb3B0cy5sYXN0Rng8MCkpCm9wdHMubGFzdEZ4PW9wdHMuZnhzLmxlbmd0aC0xO2Z4PW9wdHMuZnhzW29wdHMubGFzdEZ4XX0KaWYob3B0cy5vbmVUaW1lRngpe2Z4PW9wdHMub25lVGltZUZ4O29wdHMub25lVGltZUZ4PW51bGx9CiQuZm4uY3ljbGUucmVzZXRTdGF0ZShvcHRzLGZ4KTtpZihvcHRzLmJlZm9yZS5sZW5ndGgpCiQuZWFjaChvcHRzLmJlZm9yZSxmdW5jdGlvbihpLG8pe2lmKHAuY3ljbGVTdG9wIT1vcHRzLnN0b3BDb3VudClyZXR1cm47by5hcHBseShuZXh0LFtjdXJyLG5leHQsb3B0cyxmd2RdKX0pO3ZhciBhZnRlcj1mdW5jdGlvbigpe29wdHMuYnVzeT0wOyQuZWFjaChvcHRzLmFmdGVyLGZ1bmN0aW9uKGksbyl7aWYocC5jeWNsZVN0b3AhPW9wdHMuc3RvcENvdW50KXJldHVybjtvLmFwcGx5KG5leHQsW2N1cnIsbmV4dCxvcHRzLGZ3ZF0pfSk7aWYoIXAuY3ljbGVTdG9wKXtxdWV1ZU5leHQoKX19O2RlYnVnKCd0eCBmaXJpbmcoJytmeCsnKTsgY3VyclNsaWRlOiAnK29wdHMuY3VyclNsaWRlKyc7IG5leHRTbGlkZTogJytvcHRzLm5leHRTbGlkZSk7b3B0cy5idXN5PTE7aWYob3B0cy5meEZuKQpvcHRzLmZ4Rm4oY3VycixuZXh0LG9wdHMsYWZ0ZXIsZndkLG1hbnVhbCYmb3B0cy5mYXN0T25FdmVudCk7ZWxzZSBpZigkLmlzRnVuY3Rpb24oJC5mbi5jeWNsZVtvcHRzLmZ4XSkpCiQuZm4uY3ljbGVbb3B0cy5meF0oY3VycixuZXh0LG9wdHMsYWZ0ZXIsZndkLG1hbnVhbCYmb3B0cy5mYXN0T25FdmVudCk7ZWxzZSAkLmZuLmN5Y2xlLmN1c3RvbShjdXJyLG5leHQsb3B0cyxhZnRlcixmd2QsbWFudWFsJiZvcHRzLmZhc3RPbkV2ZW50KX0KZWxzZXtxdWV1ZU5leHQoKX0KaWYoY2hhbmdlZHx8b3B0cy5uZXh0U2xpZGU9PW9wdHMuY3VyclNsaWRlKXt2YXIgcm9sbDtvcHRzLmxhc3RTbGlkZT1vcHRzLmN1cnJTbGlkZTtpZihvcHRzLnJhbmRvbSl7b3B0cy5jdXJyU2xpZGU9b3B0cy5uZXh0U2xpZGU7aWYoKytvcHRzLnJhbmRvbUluZGV4PT1lbHMubGVuZ3RoKXtvcHRzLnJhbmRvbUluZGV4PTA7b3B0cy5yYW5kb21NYXAuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLnJhbmRvbSgpLTAuNX0pfQpvcHRzLm5leHRTbGlkZT1vcHRzLnJhbmRvbU1hcFtvcHRzLnJhbmRvbUluZGV4XTtpZihvcHRzLm5leHRTbGlkZT09b3B0cy5jdXJyU2xpZGUpCm9wdHMubmV4dFNsaWRlPShvcHRzLmN1cnJTbGlkZT09b3B0cy5zbGlkZUNvdW50LTEpPzA6b3B0cy5jdXJyU2xpZGUrMX0KZWxzZSBpZihvcHRzLmJhY2t3YXJkcyl7cm9sbD0ob3B0cy5uZXh0U2xpZGUtMSk8MDtpZihyb2xsJiZvcHRzLmJvdW5jZSl7b3B0cy5iYWNrd2FyZHM9IW9wdHMuYmFja3dhcmRzO29wdHMubmV4dFNsaWRlPTE7b3B0cy5jdXJyU2xpZGU9MH0KZWxzZXtvcHRzLm5leHRTbGlkZT1yb2xsPyhlbHMubGVuZ3RoLTEpOm9wdHMubmV4dFNsaWRlLTE7b3B0cy5jdXJyU2xpZGU9cm9sbD8wOm9wdHMubmV4dFNsaWRlKzF9fQplbHNle3JvbGw9KG9wdHMubmV4dFNsaWRlKzEpPT1lbHMubGVuZ3RoO2lmKHJvbGwmJm9wdHMuYm91bmNlKXtvcHRzLmJhY2t3YXJkcz0hb3B0cy5iYWNrd2FyZHM7b3B0cy5uZXh0U2xpZGU9ZWxzLmxlbmd0aC0yO29wdHMuY3VyclNsaWRlPWVscy5sZW5ndGgtMX0KZWxzZXtvcHRzLm5leHRTbGlkZT1yb2xsPzA6b3B0cy5uZXh0U2xpZGUrMTtvcHRzLmN1cnJTbGlkZT1yb2xsP2Vscy5sZW5ndGgtMTpvcHRzLm5leHRTbGlkZS0xfX19CmlmKGNoYW5nZWQmJm9wdHMucGFnZXIpCm9wdHMudXBkYXRlQWN0aXZlUGFnZXJMaW5rKG9wdHMucGFnZXIsb3B0cy5jdXJyU2xpZGUsb3B0cy5hY3RpdmVQYWdlckNsYXNzKTtmdW5jdGlvbiBxdWV1ZU5leHQoKXt2YXIgbXM9MCx0aW1lb3V0PW9wdHMudGltZW91dDtpZihvcHRzLnRpbWVvdXQmJiFvcHRzLmNvbnRpbnVvdXMpe21zPWdldFRpbWVvdXQoZWxzW29wdHMuY3VyclNsaWRlXSxlbHNbb3B0cy5uZXh0U2xpZGVdLG9wdHMsZndkKTtpZihvcHRzLmZ4PT0nc2h1ZmZsZScpCm1zLT1vcHRzLnNwZWVkT3V0fQplbHNlIGlmKG9wdHMuY29udGludW91cyYmcC5jeWNsZVBhdXNlKQptcz0xMDtpZihtcz4wKQpwLmN5Y2xlVGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Z28oZWxzLG9wdHMsMCwhb3B0cy5iYWNrd2FyZHMpfSxtcyl9fQokLmZuLmN5Y2xlLnVwZGF0ZUFjdGl2ZVBhZ2VyTGluaz1mdW5jdGlvbihwYWdlcixjdXJyU2xpZGUsY2xzTmFtZSl7JChwYWdlcikuZWFjaChmdW5jdGlvbigpeyQodGhpcykuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcyhjbHNOYW1lKS5lcShjdXJyU2xpZGUpLmFkZENsYXNzKGNsc05hbWUpfSl9O2Z1bmN0aW9uIGdldFRpbWVvdXQoY3VycixuZXh0LG9wdHMsZndkKXtpZihvcHRzLnRpbWVvdXRGbil7dmFyIHQ9b3B0cy50aW1lb3V0Rm4uY2FsbChjdXJyLGN1cnIsbmV4dCxvcHRzLGZ3ZCk7d2hpbGUob3B0cy5meCE9J25vbmUnJiYodC1vcHRzLnNwZWVkKTwyNTApCnQrPW9wdHMuc3BlZWQ7ZGVidWcoJ2NhbGN1bGF0ZWQgdGltZW91dDogJyt0Kyc7IHNwZWVkOiAnK29wdHMuc3BlZWQpO2lmKHQhPT0hMSkKcmV0dXJuIHR9CnJldHVybiBvcHRzLnRpbWVvdXR9CiQuZm4uY3ljbGUubmV4dD1mdW5jdGlvbihvcHRzKXthZHZhbmNlKG9wdHMsMSl9OyQuZm4uY3ljbGUucHJldj1mdW5jdGlvbihvcHRzKXthZHZhbmNlKG9wdHMsMCl9O2Z1bmN0aW9uIGFkdmFuY2Uob3B0cyxtb3ZlRm9yd2FyZCl7dmFyIHZhbD1tb3ZlRm9yd2FyZD8xOi0xO3ZhciBlbHM9b3B0cy5lbGVtZW50czt2YXIgcD1vcHRzLiRjb250WzBdLHRpbWVvdXQ9cC5jeWNsZVRpbWVvdXQ7aWYodGltZW91dCl7Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO3AuY3ljbGVUaW1lb3V0PTB9CmlmKG9wdHMucmFuZG9tJiZ2YWw8MCl7b3B0cy5yYW5kb21JbmRleC0tO2lmKC0tb3B0cy5yYW5kb21JbmRleD09LTIpCm9wdHMucmFuZG9tSW5kZXg9ZWxzLmxlbmd0aC0yO2Vsc2UgaWYob3B0cy5yYW5kb21JbmRleD09LTEpCm9wdHMucmFuZG9tSW5kZXg9ZWxzLmxlbmd0aC0xO29wdHMubmV4dFNsaWRlPW9wdHMucmFuZG9tTWFwW29wdHMucmFuZG9tSW5kZXhdfQplbHNlIGlmKG9wdHMucmFuZG9tKXtvcHRzLm5leHRTbGlkZT1vcHRzLnJhbmRvbU1hcFtvcHRzLnJhbmRvbUluZGV4XX0KZWxzZXtvcHRzLm5leHRTbGlkZT1vcHRzLmN1cnJTbGlkZSt2YWw7aWYob3B0cy5uZXh0U2xpZGU8MCl7aWYob3B0cy5ub3dyYXApcmV0dXJuITE7b3B0cy5uZXh0U2xpZGU9ZWxzLmxlbmd0aC0xfQplbHNlIGlmKG9wdHMubmV4dFNsaWRlPj1lbHMubGVuZ3RoKXtpZihvcHRzLm5vd3JhcClyZXR1cm4hMTtvcHRzLm5leHRTbGlkZT0wfX0KdmFyIGNiPW9wdHMub25QcmV2TmV4dEV2ZW50fHxvcHRzLnByZXZOZXh0Q2xpY2s7aWYoJC5pc0Z1bmN0aW9uKGNiKSkKY2IodmFsPjAsb3B0cy5uZXh0U2xpZGUsZWxzW29wdHMubmV4dFNsaWRlXSk7Z28oZWxzLG9wdHMsMSxtb3ZlRm9yd2FyZCk7cmV0dXJuITF9CmZ1bmN0aW9uIGJ1aWxkUGFnZXIoZWxzLG9wdHMpe3ZhciAkcD0kKG9wdHMucGFnZXIpOyQuZWFjaChlbHMsZnVuY3Rpb24oaSxvKXskLmZuLmN5Y2xlLmNyZWF0ZVBhZ2VyQW5jaG9yKGksbywkcCxlbHMsb3B0cyl9KTtvcHRzLnVwZGF0ZUFjdGl2ZVBhZ2VyTGluayhvcHRzLnBhZ2VyLG9wdHMuc3RhcnRpbmdTbGlkZSxvcHRzLmFjdGl2ZVBhZ2VyQ2xhc3MpfQokLmZuLmN5Y2xlLmNyZWF0ZVBhZ2VyQW5jaG9yPWZ1bmN0aW9uKGksZWwsJHAsZWxzLG9wdHMpe3ZhciBhO2lmKCQuaXNGdW5jdGlvbihvcHRzLnBhZ2VyQW5jaG9yQnVpbGRlcikpe2E9b3B0cy5wYWdlckFuY2hvckJ1aWxkZXIoaSxlbCk7ZGVidWcoJ3BhZ2VyQW5jaG9yQnVpbGRlcignK2krJywgZWwpIHJldHVybmVkOiAnK2EpfQplbHNlIGE9JzxhIGhyZWY9IiMiPicrKGkrMSkrJzwvYT4nO2lmKCFhKQpyZXR1cm47dmFyICRhPSQoYSk7aWYoJGEucGFyZW50cygnYm9keScpLmxlbmd0aD09PTApe3ZhciBhcnI9W107aWYoJHAubGVuZ3RoPjEpeyRwLmVhY2goZnVuY3Rpb24oKXt2YXIgJGNsb25lPSRhLmNsb25lKCEwKTskKHRoaXMpLmFwcGVuZCgkY2xvbmUpO2Fyci5wdXNoKCRjbG9uZVswXSl9KTskYT0kKGFycil9CmVsc2V7JGEuYXBwZW5kVG8oJHApfX0Kb3B0cy5wYWdlckFuY2hvcnM9b3B0cy5wYWdlckFuY2hvcnN8fFtdO29wdHMucGFnZXJBbmNob3JzLnB1c2goJGEpO3ZhciBwYWdlckZuPWZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKTtvcHRzLm5leHRTbGlkZT1pO3ZhciBwPW9wdHMuJGNvbnRbMF0sdGltZW91dD1wLmN5Y2xlVGltZW91dDtpZih0aW1lb3V0KXtjbGVhclRpbWVvdXQodGltZW91dCk7cC5jeWNsZVRpbWVvdXQ9MH0KdmFyIGNiPW9wdHMub25QYWdlckV2ZW50fHxvcHRzLnBhZ2VyQ2xpY2s7aWYoJC5pc0Z1bmN0aW9uKGNiKSkKY2Iob3B0cy5uZXh0U2xpZGUsZWxzW29wdHMubmV4dFNsaWRlXSk7Z28oZWxzLG9wdHMsMSxvcHRzLmN1cnJTbGlkZTxpKX07aWYoL21vdXNlZW50ZXJ8bW91c2VvdmVyL2kudGVzdChvcHRzLnBhZ2VyRXZlbnQpKXskYS5ob3ZlcihwYWdlckZuLGZ1bmN0aW9uKCl7fSl9CmVsc2V7JGEuYmluZChvcHRzLnBhZ2VyRXZlbnQscGFnZXJGbil9CmlmKCEvXmNsaWNrLy50ZXN0KG9wdHMucGFnZXJFdmVudCkmJiFvcHRzLmFsbG93UGFnZXJDbGlja0J1YmJsZSkKJGEuYmluZCgnY2xpY2suY3ljbGUnLGZ1bmN0aW9uKCl7cmV0dXJuITF9KTt2YXIgY29udD1vcHRzLiRjb250WzBdO3ZhciBwYXVzZUZsYWc9ITE7aWYob3B0cy5wYXVzZU9uUGFnZXJIb3Zlcil7JGEuaG92ZXIoZnVuY3Rpb24oKXtwYXVzZUZsYWc9ITA7Y29udC5jeWNsZVBhdXNlKys7dHJpZ2dlclBhdXNlKGNvbnQsITAsITApfSxmdW5jdGlvbigpe2lmKHBhdXNlRmxhZykKY29udC5jeWNsZVBhdXNlLS07dHJpZ2dlclBhdXNlKGNvbnQsITAsITApfSl9fTskLmZuLmN5Y2xlLmhvcHNGcm9tTGFzdD1mdW5jdGlvbihvcHRzLGZ3ZCl7dmFyIGhvcHMsbD1vcHRzLmxhc3RTbGlkZSxjPW9wdHMuY3VyclNsaWRlO2lmKGZ3ZCkKaG9wcz1jPmw/Yy1sOm9wdHMuc2xpZGVDb3VudC1sO2Vsc2UgaG9wcz1jPGw/bC1jOmwrb3B0cy5zbGlkZUNvdW50LWM7cmV0dXJuIGhvcHN9O2Z1bmN0aW9uIGNsZWFyVHlwZUZpeCgkc2xpZGVzKXtkZWJ1ZygnYXBwbHlpbmcgY2xlYXJUeXBlIGJhY2tncm91bmQtY29sb3IgaGFjaycpO2Z1bmN0aW9uIGhleChzKXtzPXBhcnNlSW50KHMsMTApLnRvU3RyaW5nKDE2KTtyZXR1cm4gcy5sZW5ndGg8Mj8nMCcrczpzfQpmdW5jdGlvbiBnZXRCZyhlKXtmb3IoO2UmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9J2h0bWwnO2U9ZS5wYXJlbnROb2RlKXt2YXIgdj0kLmNzcyhlLCdiYWNrZ3JvdW5kLWNvbG9yJyk7aWYodiYmdi5pbmRleE9mKCdyZ2InKT49MCl7dmFyIHJnYj12Lm1hdGNoKC9cZCsvZyk7cmV0dXJuJyMnK2hleChyZ2JbMF0pK2hleChyZ2JbMV0pK2hleChyZ2JbMl0pfQppZih2JiZ2IT0ndHJhbnNwYXJlbnQnKQpyZXR1cm4gdn0KcmV0dXJuJyNmZmZmZmYnfQokc2xpZGVzLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsZ2V0QmcodGhpcykpfSl9CiQuZm4uY3ljbGUuY29tbW9uUmVzZXQ9ZnVuY3Rpb24oY3VycixuZXh0LG9wdHMsdyxoLHJldil7JChvcHRzLmVsZW1lbnRzKS5ub3QoY3VycikuaGlkZSgpO2lmKHR5cGVvZiBvcHRzLmNzc0JlZm9yZS5vcGFjaXR5PT0ndW5kZWZpbmVkJykKb3B0cy5jc3NCZWZvcmUub3BhY2l0eT0xO29wdHMuY3NzQmVmb3JlLmRpc3BsYXk9J2Jsb2NrJztpZihvcHRzLnNsaWRlUmVzaXplJiZ3IT09ITEmJm5leHQuY3ljbGVXPjApCm9wdHMuY3NzQmVmb3JlLndpZHRoPW5leHQuY3ljbGVXO2lmKG9wdHMuc2xpZGVSZXNpemUmJmghPT0hMSYmbmV4dC5jeWNsZUg+MCkKb3B0cy5jc3NCZWZvcmUuaGVpZ2h0PW5leHQuY3ljbGVIO29wdHMuY3NzQWZ0ZXI9b3B0cy5jc3NBZnRlcnx8e307b3B0cy5jc3NBZnRlci5kaXNwbGF5PSdub25lJzskKGN1cnIpLmNzcygnekluZGV4JyxvcHRzLnNsaWRlQ291bnQrKHJldj09PSEwPzE6MCkpOyQobmV4dCkuY3NzKCd6SW5kZXgnLG9wdHMuc2xpZGVDb3VudCsocmV2PT09ITA/MDoxKSl9OyQuZm4uY3ljbGUuY3VzdG9tPWZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzLGNiLGZ3ZCxzcGVlZE92ZXJyaWRlKXt2YXIgJGw9JChjdXJyKSwkbj0kKG5leHQpO3ZhciBzcGVlZEluPW9wdHMuc3BlZWRJbixzcGVlZE91dD1vcHRzLnNwZWVkT3V0LGVhc2VJbj1vcHRzLmVhc2VJbixlYXNlT3V0PW9wdHMuZWFzZU91dCxhbmltSW5EZWxheT1vcHRzLmFuaW1JbkRlbGF5LGFuaW1PdXREZWxheT1vcHRzLmFuaW1PdXREZWxheTskbi5jc3Mob3B0cy5jc3NCZWZvcmUpO2lmKHNwZWVkT3ZlcnJpZGUpe2lmKHR5cGVvZiBzcGVlZE92ZXJyaWRlPT0nbnVtYmVyJykKc3BlZWRJbj1zcGVlZE91dD1zcGVlZE92ZXJyaWRlO2Vsc2Ugc3BlZWRJbj1zcGVlZE91dD0xO2Vhc2VJbj1lYXNlT3V0PW51bGx9CnZhciBmbj1mdW5jdGlvbigpeyRuLmRlbGF5KGFuaW1JbkRlbGF5KS5hbmltYXRlKG9wdHMuYW5pbUluLHNwZWVkSW4sZWFzZUluLGZ1bmN0aW9uKCl7Y2IoKX0pfTskbC5kZWxheShhbmltT3V0RGVsYXkpLmFuaW1hdGUob3B0cy5hbmltT3V0LHNwZWVkT3V0LGVhc2VPdXQsZnVuY3Rpb24oKXskbC5jc3Mob3B0cy5jc3NBZnRlcik7aWYoIW9wdHMuc3luYykKZm4oKX0pO2lmKG9wdHMuc3luYylmbigpfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zPXtmYWRlOmZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7JHNsaWRlcy5ub3QoJzplcSgnK29wdHMuY3VyclNsaWRlKycpJykuY3NzKCdvcGFjaXR5JywwKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzKTtvcHRzLmNzc0JlZm9yZS5vcGFjaXR5PTB9KTtvcHRzLmFuaW1Jbj17b3BhY2l0eToxfTtvcHRzLmFuaW1PdXQ9e29wYWNpdHk6MH07b3B0cy5jc3NCZWZvcmU9e3RvcDowLGxlZnQ6MH19fTskLmZuLmN5Y2xlLnZlcj1mdW5jdGlvbigpe3JldHVybiB2ZXJ9OyQuZm4uY3ljbGUuZGVmYXVsdHM9e2FjdGl2ZVBhZ2VyQ2xhc3M6J2FjdGl2ZVNsaWRlJyxhZnRlcjpudWxsLGFsbG93UGFnZXJDbGlja0J1YmJsZTohMSxhbmltSW46bnVsbCxhbmltSW5EZWxheTowLGFuaW1PdXQ6bnVsbCxhbmltT3V0RGVsYXk6MCxhc3BlY3Q6ITEsYXV0b3N0b3A6MCxhdXRvc3RvcENvdW50OjAsYmFja3dhcmRzOiExLGJlZm9yZTpudWxsLGNlbnRlcjpudWxsLGNsZWFydHlwZTohJC5zdXBwb3J0Lm9wYWNpdHksY2xlYXJ0eXBlTm9CZzohMSxjb250YWluZXJSZXNpemU6MSxjb250YWluZXJSZXNpemVIZWlnaHQ6MCxjb250aW51b3VzOjAsY3NzQWZ0ZXI6bnVsbCxjc3NCZWZvcmU6bnVsbCxkZWxheTowLGVhc2VJbjpudWxsLGVhc2VPdXQ6bnVsbCxlYXNpbmc6bnVsbCxlbmQ6bnVsbCxmYXN0T25FdmVudDowLGZpdDowLGZ4OidmYWRlJyxmeEZuOm51bGwsaGVpZ2h0OidhdXRvJyxtYW51YWxUcnVtcDohMCxtZXRhQXR0cjonY3ljbGUnLG5leHQ6bnVsbCxub3dyYXA6MCxvblBhZ2VyRXZlbnQ6bnVsbCxvblByZXZOZXh0RXZlbnQ6bnVsbCxwYWdlcjpudWxsLHBhZ2VyQW5jaG9yQnVpbGRlcjpudWxsLHBhZ2VyRXZlbnQ6J2NsaWNrLmN5Y2xlJyxwYXVzZTowLHBhdXNlT25QYWdlckhvdmVyOjAscHJldjpudWxsLHByZXZOZXh0RXZlbnQ6J2NsaWNrLmN5Y2xlJyxyYW5kb206MCxyYW5kb21pemVFZmZlY3RzOjEscmVxdWV1ZU9uSW1hZ2VOb3RMb2FkZWQ6ITAscmVxdWV1ZVRpbWVvdXQ6MjUwLHJldjowLHNodWZmbGU6bnVsbCxza2lwSW5pdGlhbGl6YXRpb25DYWxsYmFja3M6ITEsc2xpZGVFeHByOm51bGwsc2xpZGVSZXNpemU6MSxzcGVlZDoxMDAwLHNwZWVkSW46bnVsbCxzcGVlZE91dDpudWxsLHN0YXJ0aW5nU2xpZGU6dW5kZWZpbmVkLHN5bmM6MSx0aW1lb3V0OjQwMDAsdGltZW91dEZuOm51bGwsdXBkYXRlQWN0aXZlUGFnZXJMaW5rOm51bGwsd2lkdGg6bnVsbH19KShqUXVlcnkpOyhmdW5jdGlvbigkKXsidXNlIHN0cmljdCI7JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5ub25lPWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7b3B0cy5meEZuPWZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzLGFmdGVyKXskKG5leHQpLnNob3coKTskKGN1cnIpLmhpZGUoKTthZnRlcigpfX07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5mYWRlb3V0PWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7JHNsaWRlcy5ub3QoJzplcSgnK29wdHMuY3VyclNsaWRlKycpJykuY3NzKHtkaXNwbGF5OidibG9jaycsJ29wYWNpdHknOjF9KTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzLHcsaCxyZXYpeyQoY3VycikuY3NzKCd6SW5kZXgnLG9wdHMuc2xpZGVDb3VudCsocmV2IT09ITA/MTowKSk7JChuZXh0KS5jc3MoJ3pJbmRleCcsb3B0cy5zbGlkZUNvdW50KyhyZXYhPT0hMD8wOjEpKX0pO29wdHMuYW5pbUluLm9wYWNpdHk9MTtvcHRzLmFuaW1PdXQub3BhY2l0eT0wO29wdHMuY3NzQmVmb3JlLm9wYWNpdHk9MTtvcHRzLmNzc0JlZm9yZS5kaXNwbGF5PSdibG9jayc7b3B0cy5jc3NBZnRlci56SW5kZXg9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5zY3JvbGxVcD1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpeyRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKTtvcHRzLmJlZm9yZS5wdXNoKCQuZm4uY3ljbGUuY29tbW9uUmVzZXQpO3ZhciBoPSRjb250LmhlaWdodCgpO29wdHMuY3NzQmVmb3JlLnRvcD1oO29wdHMuY3NzQmVmb3JlLmxlZnQ9MDtvcHRzLmNzc0ZpcnN0LnRvcD0wO29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbU91dC50b3A9LWh9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2Nyb2xsRG93bj1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpeyRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKTtvcHRzLmJlZm9yZS5wdXNoKCQuZm4uY3ljbGUuY29tbW9uUmVzZXQpO3ZhciBoPSRjb250LmhlaWdodCgpO29wdHMuY3NzRmlyc3QudG9wPTA7b3B0cy5jc3NCZWZvcmUudG9wPS1oO29wdHMuY3NzQmVmb3JlLmxlZnQ9MDtvcHRzLmFuaW1Jbi50b3A9MDtvcHRzLmFuaW1PdXQudG9wPWh9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2Nyb2xsTGVmdD1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpeyRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKTtvcHRzLmJlZm9yZS5wdXNoKCQuZm4uY3ljbGUuY29tbW9uUmVzZXQpO3ZhciB3PSRjb250LndpZHRoKCk7b3B0cy5jc3NGaXJzdC5sZWZ0PTA7b3B0cy5jc3NCZWZvcmUubGVmdD13O29wdHMuY3NzQmVmb3JlLnRvcD0wO29wdHMuYW5pbUluLmxlZnQ9MDtvcHRzLmFuaW1PdXQubGVmdD0wLXd9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2Nyb2xsUmlnaHQ9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXskY29udC5jc3MoJ292ZXJmbG93JywnaGlkZGVuJyk7b3B0cy5iZWZvcmUucHVzaCgkLmZuLmN5Y2xlLmNvbW1vblJlc2V0KTt2YXIgdz0kY29udC53aWR0aCgpO29wdHMuY3NzRmlyc3QubGVmdD0wO29wdHMuY3NzQmVmb3JlLmxlZnQ9LXc7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5hbmltSW4ubGVmdD0wO29wdHMuYW5pbU91dC5sZWZ0PXd9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2Nyb2xsSG9yej1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpeyRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKS53aWR0aCgpO29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMsZndkKXtpZihvcHRzLnJldikKZndkPSFmd2Q7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cyk7b3B0cy5jc3NCZWZvcmUubGVmdD1md2Q/KG5leHQuY3ljbGVXLTEpOigxLW5leHQuY3ljbGVXKTtvcHRzLmFuaW1PdXQubGVmdD1md2Q/LWN1cnIuY3ljbGVXOmN1cnIuY3ljbGVXfSk7b3B0cy5jc3NGaXJzdC5sZWZ0PTA7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5hbmltSW4ubGVmdD0wO29wdHMuYW5pbU91dC50b3A9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5zY3JvbGxWZXJ0PWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7JGNvbnQuY3NzKCdvdmVyZmxvdycsJ2hpZGRlbicpO29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMsZndkKXtpZihvcHRzLnJldikKZndkPSFmd2Q7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cyk7b3B0cy5jc3NCZWZvcmUudG9wPWZ3ZD8oMS1uZXh0LmN5Y2xlSCk6KG5leHQuY3ljbGVILTEpO29wdHMuYW5pbU91dC50b3A9ZndkP2N1cnIuY3ljbGVIOi1jdXJyLmN5Y2xlSH0pO29wdHMuY3NzRmlyc3QudG9wPTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wO29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbU91dC5sZWZ0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2xpZGVYPWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7b3B0cy5iZWZvcmUucHVzaChmdW5jdGlvbihjdXJyLG5leHQsb3B0cyl7JChvcHRzLmVsZW1lbnRzKS5ub3QoY3VycikuaGlkZSgpOyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITEsITApO29wdHMuYW5pbUluLndpZHRoPW5leHQuY3ljbGVXfSk7b3B0cy5jc3NCZWZvcmUubGVmdD0wO29wdHMuY3NzQmVmb3JlLnRvcD0wO29wdHMuY3NzQmVmb3JlLndpZHRoPTA7b3B0cy5hbmltSW4ud2lkdGg9J3Nob3cnO29wdHMuYW5pbU91dC53aWR0aD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnNsaWRlWT1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQob3B0cy5lbGVtZW50cykubm90KGN1cnIpLmhpZGUoKTskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCExKTtvcHRzLmFuaW1Jbi5oZWlnaHQ9bmV4dC5jeWNsZUh9KTtvcHRzLmNzc0JlZm9yZS5sZWZ0PTA7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5hbmltSW4uaGVpZ2h0PSdzaG93JztvcHRzLmFuaW1PdXQuaGVpZ2h0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2h1ZmZsZT1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe3ZhciBpLHc9JGNvbnQuY3NzKCdvdmVyZmxvdycsJ3Zpc2libGUnKS53aWR0aCgpOyRzbGlkZXMuY3NzKHtsZWZ0OjAsdG9wOjB9KTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCEwLCEwKX0pO2lmKCFvcHRzLnNwZWVkQWRqdXN0ZWQpe29wdHMuc3BlZWQ9b3B0cy5zcGVlZC8yO29wdHMuc3BlZWRBZGp1c3RlZD0hMH0Kb3B0cy5yYW5kb209MDtvcHRzLnNodWZmbGU9b3B0cy5zaHVmZmxlfHx7bGVmdDotdyx0b3A6MTV9O29wdHMuZWxzPVtdO2ZvcihpPTA7aTwkc2xpZGVzLmxlbmd0aDtpKyspCm9wdHMuZWxzLnB1c2goJHNsaWRlc1tpXSk7Zm9yKGk9MDtpPG9wdHMuY3VyclNsaWRlO2krKykKb3B0cy5lbHMucHVzaChvcHRzLmVscy5zaGlmdCgpKTtvcHRzLmZ4Rm49ZnVuY3Rpb24oY3VycixuZXh0LG9wdHMsY2IsZndkKXtpZihvcHRzLnJldikKZndkPSFmd2Q7dmFyICRlbD1md2Q/JChjdXJyKTokKG5leHQpOyQobmV4dCkuY3NzKG9wdHMuY3NzQmVmb3JlKTt2YXIgY291bnQ9b3B0cy5zbGlkZUNvdW50OyRlbC5hbmltYXRlKG9wdHMuc2h1ZmZsZSxvcHRzLnNwZWVkSW4sb3B0cy5lYXNlSW4sZnVuY3Rpb24oKXt2YXIgaG9wcz0kLmZuLmN5Y2xlLmhvcHNGcm9tTGFzdChvcHRzLGZ3ZCk7Zm9yKHZhciBrPTA7azxob3BzO2srKyl7aWYoZndkKQpvcHRzLmVscy5wdXNoKG9wdHMuZWxzLnNoaWZ0KCkpO2Vsc2Ugb3B0cy5lbHMudW5zaGlmdChvcHRzLmVscy5wb3AoKSl9CmlmKGZ3ZCl7Zm9yKHZhciBpPTAsbGVuPW9wdHMuZWxzLmxlbmd0aDtpPGxlbjtpKyspCiQob3B0cy5lbHNbaV0pLmNzcygnei1pbmRleCcsbGVuLWkrY291bnQpO30KZWxzZXt2YXIgej0kKGN1cnIpLmNzcygnei1pbmRleCcpOyRlbC5jc3MoJ3otaW5kZXgnLHBhcnNlSW50KHosMTApKzErY291bnQpfQokZWwuYW5pbWF0ZSh7bGVmdDowLHRvcDowfSxvcHRzLnNwZWVkT3V0LG9wdHMuZWFzZU91dCxmdW5jdGlvbigpeyQoZndkP3RoaXM6Y3VycikuaGlkZSgpO2lmKGNiKWNiKCl9KX0pfTskLmV4dGVuZChvcHRzLmNzc0JlZm9yZSx7ZGlzcGxheTonYmxvY2snLG9wYWNpdHk6MSx0b3A6MCxsZWZ0OjB9KX07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy50dXJuVXA9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCExKTtvcHRzLmNzc0JlZm9yZS50b3A9bmV4dC5jeWNsZUg7b3B0cy5hbmltSW4uaGVpZ2h0PW5leHQuY3ljbGVIO29wdHMuYW5pbU91dC53aWR0aD1uZXh0LmN5Y2xlV30pO29wdHMuY3NzRmlyc3QudG9wPTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wO29wdHMuY3NzQmVmb3JlLmhlaWdodD0wO29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbU91dC5oZWlnaHQ9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy50dXJuRG93bj1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITAsITEpO29wdHMuYW5pbUluLmhlaWdodD1uZXh0LmN5Y2xlSDtvcHRzLmFuaW1PdXQudG9wPWN1cnIuY3ljbGVIfSk7b3B0cy5jc3NGaXJzdC50b3A9MDtvcHRzLmNzc0JlZm9yZS5sZWZ0PTA7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5hbmltT3V0LmhlaWdodD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnR1cm5MZWZ0PWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7b3B0cy5iZWZvcmUucHVzaChmdW5jdGlvbihjdXJyLG5leHQsb3B0cyl7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cywhMSwhMCk7b3B0cy5jc3NCZWZvcmUubGVmdD1uZXh0LmN5Y2xlVztvcHRzLmFuaW1Jbi53aWR0aD1uZXh0LmN5Y2xlV30pO29wdHMuY3NzQmVmb3JlLnRvcD0wO29wdHMuY3NzQmVmb3JlLndpZHRoPTA7b3B0cy5hbmltSW4ubGVmdD0wO29wdHMuYW5pbU91dC53aWR0aD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnR1cm5SaWdodD1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITEsITApO29wdHMuYW5pbUluLndpZHRoPW5leHQuY3ljbGVXO29wdHMuYW5pbU91dC5sZWZ0PWN1cnIuY3ljbGVXfSk7JC5leHRlbmQob3B0cy5jc3NCZWZvcmUse3RvcDowLGxlZnQ6MCx3aWR0aDowfSk7b3B0cy5hbmltSW4ubGVmdD0wO29wdHMuYW5pbU91dC53aWR0aD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnpvb209ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCExLCExLCEwKTtvcHRzLmNzc0JlZm9yZS50b3A9bmV4dC5jeWNsZUgvMjtvcHRzLmNzc0JlZm9yZS5sZWZ0PW5leHQuY3ljbGVXLzI7JC5leHRlbmQob3B0cy5hbmltSW4se3RvcDowLGxlZnQ6MCx3aWR0aDpuZXh0LmN5Y2xlVyxoZWlnaHQ6bmV4dC5jeWNsZUh9KTskLmV4dGVuZChvcHRzLmFuaW1PdXQse3dpZHRoOjAsaGVpZ2h0OjAsdG9wOmN1cnIuY3ljbGVILzIsbGVmdDpjdXJyLmN5Y2xlVy8yfSl9KTtvcHRzLmNzc0ZpcnN0LnRvcD0wO29wdHMuY3NzRmlyc3QubGVmdD0wO29wdHMuY3NzQmVmb3JlLndpZHRoPTA7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuZmFkZVpvb209ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCExLCExKTtvcHRzLmNzc0JlZm9yZS5sZWZ0PW5leHQuY3ljbGVXLzI7b3B0cy5jc3NCZWZvcmUudG9wPW5leHQuY3ljbGVILzI7JC5leHRlbmQob3B0cy5hbmltSW4se3RvcDowLGxlZnQ6MCx3aWR0aDpuZXh0LmN5Y2xlVyxoZWlnaHQ6bmV4dC5jeWNsZUh9KX0pO29wdHMuY3NzQmVmb3JlLndpZHRoPTA7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5hbmltT3V0Lm9wYWNpdHk9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5ibGluZFg9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXt2YXIgdz0kY29udC5jc3MoJ292ZXJmbG93JywnaGlkZGVuJykud2lkdGgoKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzKTtvcHRzLmFuaW1Jbi53aWR0aD1uZXh0LmN5Y2xlVztvcHRzLmFuaW1PdXQubGVmdD1jdXJyLmN5Y2xlV30pO29wdHMuY3NzQmVmb3JlLmxlZnQ9dztvcHRzLmNzc0JlZm9yZS50b3A9MDtvcHRzLmFuaW1Jbi5sZWZ0PTA7b3B0cy5hbmltT3V0LmxlZnQ9d307JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5ibGluZFk9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXt2YXIgaD0kY29udC5jc3MoJ292ZXJmbG93JywnaGlkZGVuJykuaGVpZ2h0KCk7b3B0cy5iZWZvcmUucHVzaChmdW5jdGlvbihjdXJyLG5leHQsb3B0cyl7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cyk7b3B0cy5hbmltSW4uaGVpZ2h0PW5leHQuY3ljbGVIO29wdHMuYW5pbU91dC50b3A9Y3Vyci5jeWNsZUh9KTtvcHRzLmNzc0JlZm9yZS50b3A9aDtvcHRzLmNzc0JlZm9yZS5sZWZ0PTA7b3B0cy5hbmltSW4udG9wPTA7b3B0cy5hbmltT3V0LnRvcD1ofTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLmJsaW5kWj1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe3ZhciBoPSRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKS5oZWlnaHQoKTt2YXIgdz0kY29udC53aWR0aCgpO29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMpO29wdHMuYW5pbUluLmhlaWdodD1uZXh0LmN5Y2xlSDtvcHRzLmFuaW1PdXQudG9wPWN1cnIuY3ljbGVIfSk7b3B0cy5jc3NCZWZvcmUudG9wPWg7b3B0cy5jc3NCZWZvcmUubGVmdD13O29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbUluLmxlZnQ9MDtvcHRzLmFuaW1PdXQudG9wPWg7b3B0cy5hbmltT3V0LmxlZnQ9d307JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5ncm93WD1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITEsITApO29wdHMuY3NzQmVmb3JlLmxlZnQ9dGhpcy5jeWNsZVcvMjtvcHRzLmFuaW1Jbi5sZWZ0PTA7b3B0cy5hbmltSW4ud2lkdGg9dGhpcy5jeWNsZVc7b3B0cy5hbmltT3V0LmxlZnQ9MH0pO29wdHMuY3NzQmVmb3JlLnRvcD0wO29wdHMuY3NzQmVmb3JlLndpZHRoPTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuZ3Jvd1k9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCExKTtvcHRzLmNzc0JlZm9yZS50b3A9dGhpcy5jeWNsZUgvMjtvcHRzLmFuaW1Jbi50b3A9MDtvcHRzLmFuaW1Jbi5oZWlnaHQ9dGhpcy5jeWNsZUg7b3B0cy5hbmltT3V0LnRvcD0wfSk7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLmN1cnRhaW5YPWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7b3B0cy5iZWZvcmUucHVzaChmdW5jdGlvbihjdXJyLG5leHQsb3B0cyl7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cywhMSwhMCwhMCk7b3B0cy5jc3NCZWZvcmUubGVmdD1uZXh0LmN5Y2xlVy8yO29wdHMuYW5pbUluLmxlZnQ9MDtvcHRzLmFuaW1Jbi53aWR0aD10aGlzLmN5Y2xlVztvcHRzLmFuaW1PdXQubGVmdD1jdXJyLmN5Y2xlVy8yO29wdHMuYW5pbU91dC53aWR0aD0wfSk7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5jc3NCZWZvcmUud2lkdGg9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5jdXJ0YWluWT1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITAsITEsITApO29wdHMuY3NzQmVmb3JlLnRvcD1uZXh0LmN5Y2xlSC8yO29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbUluLmhlaWdodD1uZXh0LmN5Y2xlSDtvcHRzLmFuaW1PdXQudG9wPWN1cnIuY3ljbGVILzI7b3B0cy5hbmltT3V0LmhlaWdodD0wfSk7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLmNvdmVyPWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7dmFyIGQ9b3B0cy5kaXJlY3Rpb258fCdsZWZ0Jzt2YXIgdz0kY29udC5jc3MoJ292ZXJmbG93JywnaGlkZGVuJykud2lkdGgoKTt2YXIgaD0kY29udC5oZWlnaHQoKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzKTtvcHRzLmNzc0FmdGVyLmRpc3BsYXk9Jyc7aWYoZD09J3JpZ2h0JykKb3B0cy5jc3NCZWZvcmUubGVmdD0tdztlbHNlIGlmKGQ9PSd1cCcpCm9wdHMuY3NzQmVmb3JlLnRvcD1oO2Vsc2UgaWYoZD09J2Rvd24nKQpvcHRzLmNzc0JlZm9yZS50b3A9LWg7ZWxzZSBvcHRzLmNzc0JlZm9yZS5sZWZ0PXd9KTtvcHRzLmFuaW1Jbi5sZWZ0PTA7b3B0cy5hbmltSW4udG9wPTA7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnVuY292ZXI9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXt2YXIgZD1vcHRzLmRpcmVjdGlvbnx8J2xlZnQnO3ZhciB3PSRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKS53aWR0aCgpO3ZhciBoPSRjb250LmhlaWdodCgpO29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITAsITAsITApO2lmKGQ9PSdyaWdodCcpCm9wdHMuYW5pbU91dC5sZWZ0PXc7ZWxzZSBpZihkPT0ndXAnKQpvcHRzLmFuaW1PdXQudG9wPS1oO2Vsc2UgaWYoZD09J2Rvd24nKQpvcHRzLmFuaW1PdXQudG9wPWg7ZWxzZSBvcHRzLmFuaW1PdXQubGVmdD0td30pO29wdHMuYW5pbUluLmxlZnQ9MDtvcHRzLmFuaW1Jbi50b3A9MDtvcHRzLmNzc0JlZm9yZS50b3A9MDtvcHRzLmNzc0JlZm9yZS5sZWZ0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMudG9zcz1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe3ZhciB3PSRjb250LmNzcygnb3ZlcmZsb3cnLCd2aXNpYmxlJykud2lkdGgoKTt2YXIgaD0kY29udC5oZWlnaHQoKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCEwLCEwKTtpZighb3B0cy5hbmltT3V0LmxlZnQmJiFvcHRzLmFuaW1PdXQudG9wKQokLmV4dGVuZChvcHRzLmFuaW1PdXQse2xlZnQ6dyoyLHRvcDotaC8yLG9wYWNpdHk6MH0pO2Vsc2Ugb3B0cy5hbmltT3V0Lm9wYWNpdHk9MH0pO29wdHMuY3NzQmVmb3JlLmxlZnQ9MDtvcHRzLmNzc0JlZm9yZS50b3A9MDtvcHRzLmFuaW1Jbi5sZWZ0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMud2lwZT1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe3ZhciB3PSRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKS53aWR0aCgpO3ZhciBoPSRjb250LmhlaWdodCgpO29wdHMuY3NzQmVmb3JlPW9wdHMuY3NzQmVmb3JlfHx7fTt2YXIgY2xpcDtpZihvcHRzLmNsaXApe2lmKC9sMnIvLnRlc3Qob3B0cy5jbGlwKSkKY2xpcD0ncmVjdCgwcHggMHB4ICcraCsncHggMHB4KSc7ZWxzZSBpZigvcjJsLy50ZXN0KG9wdHMuY2xpcCkpCmNsaXA9J3JlY3QoMHB4ICcrdysncHggJytoKydweCAnK3crJ3B4KSc7ZWxzZSBpZigvdDJiLy50ZXN0KG9wdHMuY2xpcCkpCmNsaXA9J3JlY3QoMHB4ICcrdysncHggMHB4IDBweCknO2Vsc2UgaWYoL2IydC8udGVzdChvcHRzLmNsaXApKQpjbGlwPSdyZWN0KCcraCsncHggJyt3KydweCAnK2grJ3B4IDBweCknO2Vsc2UgaWYoL3pvb20vLnRlc3Qob3B0cy5jbGlwKSl7dmFyIHRvcD1wYXJzZUludChoLzIsMTApO3ZhciBsZWZ0PXBhcnNlSW50KHcvMiwxMCk7Y2xpcD0ncmVjdCgnK3RvcCsncHggJytsZWZ0KydweCAnK3RvcCsncHggJytsZWZ0KydweCknfX0Kb3B0cy5jc3NCZWZvcmUuY2xpcD1vcHRzLmNzc0JlZm9yZS5jbGlwfHxjbGlwfHwncmVjdCgwcHggMHB4IDBweCAwcHgpJzt2YXIgZD1vcHRzLmNzc0JlZm9yZS5jbGlwLm1hdGNoKC8oXGQrKS9nKTt2YXIgdD1wYXJzZUludChkWzBdLDEwKSxyPXBhcnNlSW50KGRbMV0sMTApLGI9cGFyc2VJbnQoZFsyXSwxMCksbD1wYXJzZUludChkWzNdLDEwKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXtpZihjdXJyPT1uZXh0KXJldHVybjt2YXIgJGN1cnI9JChjdXJyKSwkbmV4dD0kKG5leHQpOyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITAsITAsITEpO29wdHMuY3NzQWZ0ZXIuZGlzcGxheT0nYmxvY2snO3ZhciBzdGVwPTEsY291bnQ9cGFyc2VJbnQoKG9wdHMuc3BlZWRJbi8xMyksMTApLTE7KGZ1bmN0aW9uIGYoKXt2YXIgdHQ9dD90LXBhcnNlSW50KHN0ZXAqKHQvY291bnQpLDEwKTowO3ZhciBsbD1sP2wtcGFyc2VJbnQoc3RlcCoobC9jb3VudCksMTApOjA7dmFyIGJiPWI8aD9iK3BhcnNlSW50KHN0ZXAqKChoLWIpL2NvdW50fHwxKSwxMCk6aDt2YXIgcnI9cjx3P3IrcGFyc2VJbnQoc3RlcCooKHctcikvY291bnR8fDEpLDEwKTp3OyRuZXh0LmNzcyh7Y2xpcDoncmVjdCgnK3R0KydweCAnK3JyKydweCAnK2JiKydweCAnK2xsKydweCknfSk7KHN0ZXArKzw9Y291bnQpP3NldFRpbWVvdXQoZiwxMyk6JGN1cnIuY3NzKCdkaXNwbGF5Jywnbm9uZScpfSkoKX0pOyQuZXh0ZW5kKG9wdHMuY3NzQmVmb3JlLHtkaXNwbGF5OidibG9jaycsb3BhY2l0eToxLHRvcDowLGxlZnQ6MH0pO29wdHMuYW5pbUluPXtsZWZ0OjB9O29wdHMuYW5pbU91dD17bGVmdDowfX19KShqUXVlcnkpO3ZhciBtZW51RGVsYXk9MTUwOyQoZnVuY3Rpb24oKXtpZigkKCcubWVnYS1uYXYnKS5sZW5ndGg+MCl7dmFyIGNvbHVtbnM9W107JCgndWwuY29sdW1uJykuZWFjaChmdW5jdGlvbigpe2NvbHVtbnMucHVzaCgkKHRoaXMpLmRhdGEoJ2NvbHVtbmlkJykpfSk7Y29sdW1ucz0kLnVuaXF1ZShjb2x1bW5zKTskLmVhY2goY29sdW1ucyxmdW5jdGlvbihrZXksdmFsdWUpe3ZhciBjb2w9dmFsdWUubWF0Y2goL1x3Ky1cZCstKFxkKykvKVsxXTskKCcuJyt2YWx1ZSsnID4gLm5hdl8xJykudW53cmFwKCkud3JhcEFsbCgnPGxpIGlkPSInK3ZhbHVlKyciIGNsYXNzPSJjb2x1bW4gY29sdW1uLScrY29sKyciPjwvbGk+Jyl9KX0KJCgndWwubWVnYS1uYXYudG9wLWxldmVsLW5hdiB1bC5uYXZfMScpLmVhY2goZnVuY3Rpb24oKXtzZXRNZW51UG9zaXRpb24oJCh0aGlzKSl9KTtoYW5kbGVUb3BOYXZJdGVtSG92ZXIoKX0pO2Z1bmN0aW9uIHNldE1lbnVQb3NpdGlvbihuYXYpe3ZhciBwYXJlbnRMaVBvc2l0aW9uO3ZhciBsZWZ0O25hdi5lYWNoKGZ1bmN0aW9uKCl7aWYoISQodGhpcykucGFyZW50KCkuaGFzQ2xhc3MoJ2Z1bGwtd2lkdGgnKSl7dmFyIG1lZ2FOYXY9JCh0aGlzKS5wYXJlbnRzKCdkaXYubWVnYV9uYXYnKTt2YXIgbWVnYU5hdldpZHRoPW1lZ2FOYXYud2lkdGgoKTt2YXIgcGFyZW50TGk9JCh0aGlzKS5wYXJlbnQoKTtwYXJlbnRMaVBvc2l0aW9uPXBhcmVudExpLnBvc2l0aW9uKCk7aWYoJCh0aGlzKS53aWR0aCgpPm1lZ2FOYXZXaWR0aCl7dmFyIGNoaWxkcmVuPSQodGhpcykuY2hpbGRyZW4oKTt2YXIgY29sdW1uV2lkdGg9cGFyc2VJbnQobWVnYU5hdldpZHRoL2NoaWxkcmVuLmxlbmd0aCk7Y2hpbGRyZW4uZWFjaChmdW5jdGlvbigpeyQodGhpcykuY3NzKCdtaW4td2lkdGgnLGNvbHVtbldpZHRoKydweCcpfSl9CnZhciByaWdodFNpZGVQb3NpdGlvbj0kKHRoaXMpLndpZHRoKCkrcGFyZW50TGlQb3NpdGlvbi5sZWZ0O2lmKHJpZ2h0U2lkZVBvc2l0aW9uPm1lZ2FOYXZXaWR0aCl7bGVmdD1yaWdodFNpZGVQb3NpdGlvbi1tZWdhTmF2V2lkdGg7JCh0aGlzKS5jc3MoJ2xlZnQnLChsZWZ0Ki0xKSsncHgnKX19ZWxzZXt2YXIgbGlDb3VudD0kKHRoaXMpLmNoaWxkcmVuKCdsaS5jb2x1bW4nKS5sZW5ndGg7dmFyIHdpZHRoPTEwMC9saUNvdW50OyQodGhpcykuY2hpbGRyZW4oJ2xpJykuY3NzKCd3aWR0aCcsd2lkdGgrJyUnKX19KX0KZnVuY3Rpb24gaGFuZGxlVG9wTmF2SXRlbUhvdmVyKCl7dmFyIHRvcE5hdkl0ZW1zPSQoJy5tZWdhX25hdiBsaS5uYXZfMScpO3RvcE5hdkl0ZW1zLmhvdmVyKGZ1bmN0aW9uKCl7dmFyIGljb249JCh0aGlzKS5maW5kKCdpbWcuaW1nLXJlc3BvbnNpdmUnKTt2YXIgY3VycmVudFNyYz1pY29uLmF0dHIoJ3NyYycpO2lmKCFjdXJyZW50U3JjLmluY2x1ZGVzKCdfaG92ZXIucG5nJykpe3ZhciBuZXdTcmM9Y3VycmVudFNyYy5zbGljZSgwLC00KSsiX2hvdmVyLnBuZyI7aWNvbi5hdHRyKCdzcmMnLG5ld1NyYyl9fSxmdW5jdGlvbigpe3ZhciBpY29uPSQodGhpcykuZmluZCgnaW1nLmltZy1yZXNwb25zaXZlJyk7dmFyIGN1cnJlbnRTcmM9aWNvbi5hdHRyKCdzcmMnKTtpZihjdXJyZW50U3JjLmluY2x1ZGVzKCdfaG92ZXIucG5nJykpe3ZhciBuZXdTcmM9Y3VycmVudFNyYy5zbGljZSgwLC0xMCkrIi5wbmciO2ljb24uYXR0cignc3JjJyxuZXdTcmMpfX0pfTskKGZ1bmN0aW9uKCl7aWYoYXV0b2NvbXBsZXRlPT0hMCl7JCgiI3F1aWNrc2VhcmNoX2tleXdvcmRzIikuYXV0b2NvbXBsZXRlKHttaW5MZW5ndGg6MyxkZWxheTo1MDAscG9zaXRpb246e215OiJyaWdodCB0b3AiLGF0OiJyaWdodCBib3R0b20ifSxzZWxlY3Q6ZnVuY3Rpb24oZXZlbnQsdWkpe2lmKHVpLml0ZW0ubGFiZWwhPSJObyBSZXN1bHRzIEZvdW5kIil7d2luZG93LmxvY2F0aW9uLmhyZWY9dWkuaXRlbS5saW5rfX0sc291cmNlOmZ1bmN0aW9uKHJlcXVlc3QscmVzcG9uc2UpeyQucG9zdCgiaW5jbHVkZXMvYWpheC9hamF4LnNlYXJjaF9hdXRvY29tcGxldGUucGhwIix7cmVxdWVzdDpyZXF1ZXN0LnRlcm0sdHlwZTokKCJpbnB1dC5zZWFyY2hfdHlwZTpjaGVja2VkIikudmFsKCl9LGZ1bmN0aW9uKGRhdGEpe3Jlc3BvbnNlKGRhdGEpfSwianNvbiIpLmZhaWwoZnVuY3Rpb24oZXJyKXtjb25zb2xlLmxvZyhlcnIucmVzcG9uc2VUZXh0KX0pfX0pfQokKCIuc2VhcmNoX3R5cGUiKS5jbGljayhmdW5jdGlvbigpeyQoIiN0eXBlIikudmFsKCQodGhpcykudmFsKCkpfSl9KTtmdW5jdGlvbiBjaGFuZ2VQYWdlKHBhZ2UpeyQoJyNwYWdlJykudmFsKHBhZ2UpfTshZnVuY3Rpb24odCl7dmFyIGU9e21vZGU6Imhvcml6b250YWwiLHNsaWRlU2VsZWN0b3I6IiIsaW5maW5pdGVMb29wOiEwLGhpZGVDb250cm9sT25FbmQ6ITEsc3BlZWQ6NTAwLGVhc2luZzpudWxsLHNsaWRlTWFyZ2luOjAsc3RhcnRTbGlkZTowLHJhbmRvbVN0YXJ0OiExLGNhcHRpb25zOiExLHRpY2tlcjohMSx0aWNrZXJIb3ZlcjohMSxhZGFwdGl2ZUhlaWdodDohMSxhZGFwdGl2ZUhlaWdodFNwZWVkOjUwMCx2aWRlbzohMSx1c2VDU1M6ITAscHJlbG9hZEltYWdlczoidmlzaWJsZSIscmVzcG9uc2l2ZTohMCxzbGlkZVpJbmRleDo1MCx3cmFwcGVyQ2xhc3M6ImJ4LXdyYXBwZXIiLHRvdWNoRW5hYmxlZDohMCxzd2lwZVRocmVzaG9sZDo1MCxvbmVUb09uZVRvdWNoOiEwLHByZXZlbnREZWZhdWx0U3dpcGVYOiEwLHByZXZlbnREZWZhdWx0U3dpcGVZOiExLGFyaWFMaXZlOiEwLGFyaWFIaWRkZW46ITAsa2V5Ym9hcmRFbmFibGVkOiExLHBhZ2VyOiEwLHBhZ2VyVHlwZToiZnVsbCIscGFnZXJTaG9ydFNlcGFyYXRvcjoiIC8gIixwYWdlclNlbGVjdG9yOm51bGwsYnVpbGRQYWdlcjpudWxsLHBhZ2VyQ3VzdG9tOm51bGwsY29udHJvbHM6ITAsbmV4dFRleHQ6Ik5leHQiLHByZXZUZXh0OiJQcmV2IixuZXh0U2VsZWN0b3I6bnVsbCxwcmV2U2VsZWN0b3I6bnVsbCxhdXRvQ29udHJvbHM6ITEsc3RhcnRUZXh0OiJTdGFydCIsc3RvcFRleHQ6IlN0b3AiLGF1dG9Db250cm9sc0NvbWJpbmU6ITEsYXV0b0NvbnRyb2xzU2VsZWN0b3I6bnVsbCxhdXRvOiExLHBhdXNlOjRlMyxhdXRvU3RhcnQ6ITAsYXV0b0RpcmVjdGlvbjoibmV4dCIsc3RvcEF1dG9PbkNsaWNrOiExLGF1dG9Ib3ZlcjohMSxhdXRvRGVsYXk6MCxhdXRvU2xpZGVGb3JPbmVQYWdlOiExLG1pblNsaWRlczoxLG1heFNsaWRlczoxLG1vdmVTbGlkZXM6MCxzbGlkZVdpZHRoOjAsc2hyaW5rSXRlbXM6ITEsb25TbGlkZXJMb2FkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG9uU2xpZGVCZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sb25TbGlkZUFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG9uU2xpZGVOZXh0OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG9uU2xpZGVQcmV2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG9uU2xpZGVyUmVzaXplOmZ1bmN0aW9uKCl7cmV0dXJuITB9fTt0LmZuLmJ4U2xpZGVyPWZ1bmN0aW9uKG4pe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4gdGhpcztpZih0aGlzLmxlbmd0aD4xKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLmJ4U2xpZGVyKG4pfSksdGhpczt2YXIgcz17fSxvPXRoaXMscj10KHdpbmRvdykud2lkdGgoKSxhPXQod2luZG93KS5oZWlnaHQoKTtpZighdChvKS5kYXRhKCJieFNsaWRlciIpKXt2YXIgbD1mdW5jdGlvbigpe3QobykuZGF0YSgiYnhTbGlkZXIiKXx8KHMuc2V0dGluZ3M9dC5leHRlbmQoe30sZSxuKSxzLnNldHRpbmdzLnNsaWRlV2lkdGg9cGFyc2VJbnQocy5zZXR0aW5ncy5zbGlkZVdpZHRoKSxzLmNoaWxkcmVuPW8uY2hpbGRyZW4ocy5zZXR0aW5ncy5zbGlkZVNlbGVjdG9yKSxzLmNoaWxkcmVuLmxlbmd0aDxzLnNldHRpbmdzLm1pblNsaWRlcyYmKHMuc2V0dGluZ3MubWluU2xpZGVzPXMuY2hpbGRyZW4ubGVuZ3RoKSxzLmNoaWxkcmVuLmxlbmd0aDxzLnNldHRpbmdzLm1heFNsaWRlcyYmKHMuc2V0dGluZ3MubWF4U2xpZGVzPXMuY2hpbGRyZW4ubGVuZ3RoKSxzLnNldHRpbmdzLnJhbmRvbVN0YXJ0JiYocy5zZXR0aW5ncy5zdGFydFNsaWRlPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpzLmNoaWxkcmVuLmxlbmd0aCkpLHMuYWN0aXZlPXtpbmRleDpzLnNldHRpbmdzLnN0YXJ0U2xpZGV9LHMuY2Fyb3VzZWw9cy5zZXR0aW5ncy5taW5TbGlkZXM+MXx8cy5zZXR0aW5ncy5tYXhTbGlkZXM+MSxzLmNhcm91c2VsJiYocy5zZXR0aW5ncy5wcmVsb2FkSW1hZ2VzPSJhbGwiKSxzLm1pblRocmVzaG9sZD1zLnNldHRpbmdzLm1pblNsaWRlcypzLnNldHRpbmdzLnNsaWRlV2lkdGgrKHMuc2V0dGluZ3MubWluU2xpZGVzLTEpKnMuc2V0dGluZ3Muc2xpZGVNYXJnaW4scy5tYXhUaHJlc2hvbGQ9cy5zZXR0aW5ncy5tYXhTbGlkZXMqcy5zZXR0aW5ncy5zbGlkZVdpZHRoKyhzLnNldHRpbmdzLm1heFNsaWRlcy0xKSpzLnNldHRpbmdzLnNsaWRlTWFyZ2luLHMud29ya2luZz0hMSxzLmNvbnRyb2xzPXt9LHMuaW50ZXJ2YWw9bnVsbCxzLmFuaW1Qcm9wPSJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGU/InRvcCI6ImxlZnQiLHMudXNpbmdDU1M9cy5zZXR0aW5ncy51c2VDU1MmJiJmYWRlIiE9PXMuc2V0dGluZ3MubW9kZSYmZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1bIldlYmtpdFBlcnNwZWN0aXZlIiwiTW96UGVyc3BlY3RpdmUiLCJPUGVyc3BlY3RpdmUiLCJtc1BlcnNwZWN0aXZlIl0saT0wO2k8ZS5sZW5ndGg7aSsrKWlmKHZvaWQgMCE9PXQuc3R5bGVbZVtpXV0pcmV0dXJuIHMuY3NzUHJlZml4PWVbaV0ucmVwbGFjZSgiUGVyc3BlY3RpdmUiLCIiKS50b0xvd2VyQ2FzZSgpLHMuYW5pbVByb3A9Ii0iK3MuY3NzUHJlZml4KyItdHJhbnNmb3JtIiwhMDtyZXR1cm4hMX0oKSwidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlJiYocy5zZXR0aW5ncy5tYXhTbGlkZXM9cy5zZXR0aW5ncy5taW5TbGlkZXMpLG8uZGF0YSgib3JpZ1N0eWxlIixvLmF0dHIoInN0eWxlIikpLG8uY2hpbGRyZW4ocy5zZXR0aW5ncy5zbGlkZVNlbGVjdG9yKS5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS5kYXRhKCJvcmlnU3R5bGUiLHQodGhpcykuYXR0cigic3R5bGUiKSl9KSxkKCkpfSxkPWZ1bmN0aW9uKCl7dmFyIGU9cy5jaGlsZHJlbi5lcShzLnNldHRpbmdzLnN0YXJ0U2xpZGUpO28ud3JhcCgnPGRpdiBjbGFzcz0iJytzLnNldHRpbmdzLndyYXBwZXJDbGFzcysnIj48ZGl2IGNsYXNzPSJieC12aWV3cG9ydCI+PC9kaXY+PC9kaXY+Jykscy52aWV3cG9ydD1vLnBhcmVudCgpLHMuc2V0dGluZ3MuYXJpYUxpdmUmJiFzLnNldHRpbmdzLnRpY2tlciYmcy52aWV3cG9ydC5hdHRyKCJhcmlhLWxpdmUiLCJwb2xpdGUiKSxzLmxvYWRlcj10KCc8ZGl2IGNsYXNzPSJieC1sb2FkaW5nIiAvPicpLHMudmlld3BvcnQucHJlcGVuZChzLmxvYWRlciksby5jc3Moe3dpZHRoOiJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8xZTMqcy5jaGlsZHJlbi5sZW5ndGgrMjE1KyIlIjoiYXV0byIscG9zaXRpb246InJlbGF0aXZlIn0pLHMudXNpbmdDU1MmJnMuc2V0dGluZ3MuZWFzaW5nP28uY3NzKCItIitzLmNzc1ByZWZpeCsiLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIixzLnNldHRpbmdzLmVhc2luZyk6cy5zZXR0aW5ncy5lYXNpbmd8fChzLnNldHRpbmdzLmVhc2luZz0ic3dpbmciKSxzLnZpZXdwb3J0LmNzcyh7d2lkdGg6IjEwMCUiLG92ZXJmbG93OiJoaWRkZW4iLHBvc2l0aW9uOiJyZWxhdGl2ZSJ9KSxzLnZpZXdwb3J0LnBhcmVudCgpLmNzcyh7bWF4V2lkdGg6dSgpfSkscy5jaGlsZHJlbi5jc3Moe2Zsb2F0OiJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8ibGVmdCI6Im5vbmUiLGxpc3RTdHlsZToibm9uZSIscG9zaXRpb246InJlbGF0aXZlIn0pLHMuY2hpbGRyZW4uY3NzKCJ3aWR0aCIsaCgpKSwiaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGUmJnMuc2V0dGluZ3Muc2xpZGVNYXJnaW4+MCYmcy5jaGlsZHJlbi5jc3MoIm1hcmdpblJpZ2h0IixzLnNldHRpbmdzLnNsaWRlTWFyZ2luKSwidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlJiZzLnNldHRpbmdzLnNsaWRlTWFyZ2luPjAmJnMuY2hpbGRyZW4uY3NzKCJtYXJnaW5Cb3R0b20iLHMuc2V0dGluZ3Muc2xpZGVNYXJnaW4pLCJmYWRlIj09PXMuc2V0dGluZ3MubW9kZSYmKHMuY2hpbGRyZW4uY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHpJbmRleDowLGRpc3BsYXk6Im5vbmUifSkscy5jaGlsZHJlbi5lcShzLnNldHRpbmdzLnN0YXJ0U2xpZGUpLmNzcyh7ekluZGV4OnMuc2V0dGluZ3Muc2xpZGVaSW5kZXgsZGlzcGxheToiYmxvY2sifSkpLHMuY29udHJvbHMuZWw9dCgnPGRpdiBjbGFzcz0iYngtY29udHJvbHMiIC8+Jykscy5zZXR0aW5ncy5jYXB0aW9ucyYmUCgpLHMuYWN0aXZlLmxhc3Q9cy5zZXR0aW5ncy5zdGFydFNsaWRlPT09ZigpLTEscy5zZXR0aW5ncy52aWRlbyYmby5maXRWaWRzKCksKCJhbGwiPT09cy5zZXR0aW5ncy5wcmVsb2FkSW1hZ2VzfHxzLnNldHRpbmdzLnRpY2tlcikmJihlPXMuY2hpbGRyZW4pLHMuc2V0dGluZ3MudGlja2VyP3Muc2V0dGluZ3MucGFnZXI9ITE6KHMuc2V0dGluZ3MuY29udHJvbHMmJkMoKSxzLnNldHRpbmdzLmF1dG8mJnMuc2V0dGluZ3MuYXV0b0NvbnRyb2xzJiZUKCkscy5zZXR0aW5ncy5wYWdlciYmdygpLChzLnNldHRpbmdzLmNvbnRyb2xzfHxzLnNldHRpbmdzLmF1dG9Db250cm9sc3x8cy5zZXR0aW5ncy5wYWdlcikmJnMudmlld3BvcnQuYWZ0ZXIocy5jb250cm9scy5lbCkpLGMoZSxnKX0sYz1mdW5jdGlvbihlLGkpe3ZhciBuPWUuZmluZCgnaW1nOm5vdChbc3JjPSIiXSksIGlmcmFtZScpLmxlbmd0aCxzPTA7cmV0dXJuIDA9PT1uP3ZvaWQgaSgpOnZvaWQgZS5maW5kKCdpbWc6bm90KFtzcmM9IiJdKSwgaWZyYW1lJykuZWFjaChmdW5jdGlvbigpe3QodGhpcykub25lKCJsb2FkIGVycm9yIixmdW5jdGlvbigpeysrcz09PW4mJmkoKX0pLmVhY2goZnVuY3Rpb24oKXt0aGlzLmNvbXBsZXRlJiZ0KHRoaXMpLnRyaWdnZXIoImxvYWQiKX0pfSl9LGc9ZnVuY3Rpb24oKXtpZihzLnNldHRpbmdzLmluZmluaXRlTG9vcCYmImZhZGUiIT09cy5zZXR0aW5ncy5tb2RlJiYhcy5zZXR0aW5ncy50aWNrZXIpe3ZhciBlPSJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGU/cy5zZXR0aW5ncy5taW5TbGlkZXM6cy5zZXR0aW5ncy5tYXhTbGlkZXMsaT1zLmNoaWxkcmVuLnNsaWNlKDAsZSkuY2xvbmUoITApLmFkZENsYXNzKCJieC1jbG9uZSIpLG49cy5jaGlsZHJlbi5zbGljZSgtZSkuY2xvbmUoITApLmFkZENsYXNzKCJieC1jbG9uZSIpO3Muc2V0dGluZ3MuYXJpYUhpZGRlbiYmKGkuYXR0cigiYXJpYS1oaWRkZW4iLCEwKSxuLmF0dHIoImFyaWEtaGlkZGVuIiwhMCkpLG8uYXBwZW5kKGkpLnByZXBlbmQobil9cy5sb2FkZXIucmVtb3ZlKCksbSgpLCJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGUmJihzLnNldHRpbmdzLmFkYXB0aXZlSGVpZ2h0PSEwKSxzLnZpZXdwb3J0LmhlaWdodChwKCkpLG8ucmVkcmF3U2xpZGVyKCkscy5zZXR0aW5ncy5vblNsaWRlckxvYWQuY2FsbChvLHMuYWN0aXZlLmluZGV4KSxzLmluaXRpYWxpemVkPSEwLHMuc2V0dGluZ3MucmVzcG9uc2l2ZSYmdCh3aW5kb3cpLmJpbmQoInJlc2l6ZSIsWikscy5zZXR0aW5ncy5hdXRvJiZzLnNldHRpbmdzLmF1dG9TdGFydCYmKGYoKT4xfHxzLnNldHRpbmdzLmF1dG9TbGlkZUZvck9uZVBhZ2UpJiZIKCkscy5zZXR0aW5ncy50aWNrZXImJlcoKSxzLnNldHRpbmdzLnBhZ2VyJiZJKHMuc2V0dGluZ3Muc3RhcnRTbGlkZSkscy5zZXR0aW5ncy5jb250cm9scyYmRCgpLHMuc2V0dGluZ3MudG91Y2hFbmFibGVkJiYhcy5zZXR0aW5ncy50aWNrZXImJk4oKSxzLnNldHRpbmdzLmtleWJvYXJkRW5hYmxlZCYmIXMuc2V0dGluZ3MudGlja2VyJiZ0KGRvY3VtZW50KS5rZXlkb3duKEYpfSxwPWZ1bmN0aW9uKCl7dmFyIGU9MCxuPXQoKTtpZigidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlfHxzLnNldHRpbmdzLmFkYXB0aXZlSGVpZ2h0KWlmKHMuY2Fyb3VzZWwpe3ZhciBvPTE9PT1zLnNldHRpbmdzLm1vdmVTbGlkZXM/cy5hY3RpdmUuaW5kZXg6cy5hY3RpdmUuaW5kZXgqeCgpO2ZvcihuPXMuY2hpbGRyZW4uZXEobyksaT0xO2k8PXMuc2V0dGluZ3MubWF4U2xpZGVzLTE7aSsrKW49bytpPj1zLmNoaWxkcmVuLmxlbmd0aD9uLmFkZChzLmNoaWxkcmVuLmVxKGktMSkpOm4uYWRkKHMuY2hpbGRyZW4uZXEobytpKSl9ZWxzZSBuPXMuY2hpbGRyZW4uZXEocy5hY3RpdmUuaW5kZXgpO2Vsc2Ugbj1zLmNoaWxkcmVuO3JldHVybiJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGU/KG4uZWFjaChmdW5jdGlvbihpKXtlKz10KHRoaXMpLm91dGVySGVpZ2h0KCl9KSxzLnNldHRpbmdzLnNsaWRlTWFyZ2luPjAmJihlKz1zLnNldHRpbmdzLnNsaWRlTWFyZ2luKihzLnNldHRpbmdzLm1pblNsaWRlcy0xKSkpOmU9TWF0aC5tYXguYXBwbHkoTWF0aCxuLm1hcChmdW5jdGlvbigpe3JldHVybiB0KHRoaXMpLm91dGVySGVpZ2h0KCExKX0pLmdldCgpKSwiYm9yZGVyLWJveCI9PT1zLnZpZXdwb3J0LmNzcygiYm94LXNpemluZyIpP2UrPXBhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoInBhZGRpbmctdG9wIikpK3BhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoInBhZGRpbmctYm90dG9tIikpK3BhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoImJvcmRlci10b3Atd2lkdGgiKSkrcGFyc2VGbG9hdChzLnZpZXdwb3J0LmNzcygiYm9yZGVyLWJvdHRvbS13aWR0aCIpKToicGFkZGluZy1ib3giPT09cy52aWV3cG9ydC5jc3MoImJveC1zaXppbmciKSYmKGUrPXBhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoInBhZGRpbmctdG9wIikpK3BhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoInBhZGRpbmctYm90dG9tIikpKSxlfSx1PWZ1bmN0aW9uKCl7dmFyIHQ9IjEwMCUiO3JldHVybiBzLnNldHRpbmdzLnNsaWRlV2lkdGg+MCYmKHQ9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlP3Muc2V0dGluZ3MubWF4U2xpZGVzKnMuc2V0dGluZ3Muc2xpZGVXaWR0aCsocy5zZXR0aW5ncy5tYXhTbGlkZXMtMSkqcy5zZXR0aW5ncy5zbGlkZU1hcmdpbjpzLnNldHRpbmdzLnNsaWRlV2lkdGgpLHR9LGg9ZnVuY3Rpb24oKXt2YXIgdD1zLnNldHRpbmdzLnNsaWRlV2lkdGgsZT1zLnZpZXdwb3J0LndpZHRoKCk7aWYoMD09PXMuc2V0dGluZ3Muc2xpZGVXaWR0aHx8cy5zZXR0aW5ncy5zbGlkZVdpZHRoPmUmJiFzLmNhcm91c2VsfHwidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlKXQ9ZTtlbHNlIGlmKHMuc2V0dGluZ3MubWF4U2xpZGVzPjEmJiJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZSl7aWYoZT5zLm1heFRocmVzaG9sZClyZXR1cm4gdDtlPHMubWluVGhyZXNob2xkP3Q9KGUtcy5zZXR0aW5ncy5zbGlkZU1hcmdpbioocy5zZXR0aW5ncy5taW5TbGlkZXMtMSkpL3Muc2V0dGluZ3MubWluU2xpZGVzOnMuc2V0dGluZ3Muc2hyaW5rSXRlbXMmJih0PU1hdGguZmxvb3IoKGUrcy5zZXR0aW5ncy5zbGlkZU1hcmdpbikvTWF0aC5jZWlsKChlK3Muc2V0dGluZ3Muc2xpZGVNYXJnaW4pLyh0K3Muc2V0dGluZ3Muc2xpZGVNYXJnaW4pKS1zLnNldHRpbmdzLnNsaWRlTWFyZ2luKSl9cmV0dXJuIHR9LHY9ZnVuY3Rpb24oKXt2YXIgdD0xLGU9bnVsbDtyZXR1cm4iaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGUmJnMuc2V0dGluZ3Muc2xpZGVXaWR0aD4wP3Mudmlld3BvcnQud2lkdGgoKTxzLm1pblRocmVzaG9sZD90PXMuc2V0dGluZ3MubWluU2xpZGVzOnMudmlld3BvcnQud2lkdGgoKT5zLm1heFRocmVzaG9sZD90PXMuc2V0dGluZ3MubWF4U2xpZGVzOihlPXMuY2hpbGRyZW4uZmlyc3QoKS53aWR0aCgpK3Muc2V0dGluZ3Muc2xpZGVNYXJnaW4sdD1NYXRoLmZsb29yKChzLnZpZXdwb3J0LndpZHRoKCkrcy5zZXR0aW5ncy5zbGlkZU1hcmdpbikvZSkpOiJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGUmJih0PXMuc2V0dGluZ3MubWluU2xpZGVzKSx0fSxmPWZ1bmN0aW9uKCl7dmFyIHQ9MCxlPTAsaT0wO2lmKHMuc2V0dGluZ3MubW92ZVNsaWRlcz4wKWlmKHMuc2V0dGluZ3MuaW5maW5pdGVMb29wKXQ9TWF0aC5jZWlsKHMuY2hpbGRyZW4ubGVuZ3RoL3goKSk7ZWxzZSBmb3IoO2U8cy5jaGlsZHJlbi5sZW5ndGg7KSsrdCxlPWkrdigpLGkrPXMuc2V0dGluZ3MubW92ZVNsaWRlczw9digpP3Muc2V0dGluZ3MubW92ZVNsaWRlczp2KCk7ZWxzZSB0PU1hdGguY2VpbChzLmNoaWxkcmVuLmxlbmd0aC92KCkpO3JldHVybiB0fSx4PWZ1bmN0aW9uKCl7cmV0dXJuIHMuc2V0dGluZ3MubW92ZVNsaWRlcz4wJiZzLnNldHRpbmdzLm1vdmVTbGlkZXM8PXYoKT9zLnNldHRpbmdzLm1vdmVTbGlkZXM6digpfSxtPWZ1bmN0aW9uKCl7dmFyIHQsZSxpO3MuY2hpbGRyZW4ubGVuZ3RoPnMuc2V0dGluZ3MubWF4U2xpZGVzJiZzLmFjdGl2ZS5sYXN0JiYhcy5zZXR0aW5ncy5pbmZpbml0ZUxvb3A/Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPyhlPXMuY2hpbGRyZW4ubGFzdCgpLHQ9ZS5wb3NpdGlvbigpLFMoLSh0LmxlZnQtKHMudmlld3BvcnQud2lkdGgoKS1lLm91dGVyV2lkdGgoKSkpLCJyZXNldCIsMCkpOiJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGUmJihpPXMuY2hpbGRyZW4ubGVuZ3RoLXMuc2V0dGluZ3MubWluU2xpZGVzLHQ9cy5jaGlsZHJlbi5lcShpKS5wb3NpdGlvbigpLFMoLXQudG9wLCJyZXNldCIsMCkpOih0PXMuY2hpbGRyZW4uZXEocy5hY3RpdmUuaW5kZXgqeCgpKS5wb3NpdGlvbigpLHMuYWN0aXZlLmluZGV4PT09ZigpLTEmJihzLmFjdGl2ZS5sYXN0PSEwKSx2b2lkIDAhPT10JiYoImhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlP1MoLXQubGVmdCwicmVzZXQiLDApOiJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGUmJlMoLXQudG9wLCJyZXNldCIsMCkpKX0sUz1mdW5jdGlvbihlLGksbixyKXt2YXIgYSxsO3MudXNpbmdDU1M/KGw9InZlcnRpY2FsIj09PXMuc2V0dGluZ3MubW9kZT8idHJhbnNsYXRlM2QoMCwgIitlKyJweCwgMCkiOiJ0cmFuc2xhdGUzZCgiK2UrInB4LCAwLCAwKSIsby5jc3MoIi0iK3MuY3NzUHJlZml4KyItdHJhbnNpdGlvbi1kdXJhdGlvbiIsbi8xZTMrInMiKSwic2xpZGUiPT09aT8oby5jc3Mocy5hbmltUHJvcCxsKSwwIT09bj9vLmJpbmQoInRyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQiLGZ1bmN0aW9uKGUpe3QoZS50YXJnZXQpLmlzKG8pJiYoby51bmJpbmQoInRyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQiKSxxKCkpfSk6cSgpKToicmVzZXQiPT09aT9vLmNzcyhzLmFuaW1Qcm9wLGwpOiJ0aWNrZXIiPT09aSYmKG8uY3NzKCItIitzLmNzc1ByZWZpeCsiLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIiwibGluZWFyIiksby5jc3Mocy5hbmltUHJvcCxsKSwwIT09bj9vLmJpbmQoInRyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQiLGZ1bmN0aW9uKGUpe3QoZS50YXJnZXQpLmlzKG8pJiYoby51bmJpbmQoInRyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQiKSxTKHIucmVzZXRWYWx1ZSwicmVzZXQiLDApLEwoKSl9KTooUyhyLnJlc2V0VmFsdWUsInJlc2V0IiwwKSxMKCkpKSk6KGE9e30sYVtzLmFuaW1Qcm9wXT1lLCJzbGlkZSI9PT1pP28uYW5pbWF0ZShhLG4scy5zZXR0aW5ncy5lYXNpbmcsZnVuY3Rpb24oKXtxKCl9KToicmVzZXQiPT09aT9vLmNzcyhzLmFuaW1Qcm9wLGUpOiJ0aWNrZXIiPT09aSYmby5hbmltYXRlKGEsbiwibGluZWFyIixmdW5jdGlvbigpe1Moci5yZXNldFZhbHVlLCJyZXNldCIsMCksTCgpfSkpfSxiPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPSIiLGk9IiIsbj1mKCksbz0wO288bjtvKyspaT0iIixzLnNldHRpbmdzLmJ1aWxkUGFnZXImJnQuaXNGdW5jdGlvbihzLnNldHRpbmdzLmJ1aWxkUGFnZXIpfHxzLnNldHRpbmdzLnBhZ2VyQ3VzdG9tPyhpPXMuc2V0dGluZ3MuYnVpbGRQYWdlcihvKSxzLnBhZ2VyRWwuYWRkQ2xhc3MoImJ4LWN1c3RvbS1wYWdlciIpKTooaT1vKzEscy5wYWdlckVsLmFkZENsYXNzKCJieC1kZWZhdWx0LXBhZ2VyIikpLGUrPSc8ZGl2IGNsYXNzPSJieC1wYWdlci1pdGVtIj48YSBocmVmPSIiIGRhdGEtc2xpZGUtaW5kZXg9IicrbysnIiBjbGFzcz0iYngtcGFnZXItbGluayI+JytpKyI8L2E+PC9kaXY+IjtzLnBhZ2VyRWwuaHRtbChlKX0sdz1mdW5jdGlvbigpe3Muc2V0dGluZ3MucGFnZXJDdXN0b20/cy5wYWdlckVsPXQocy5zZXR0aW5ncy5wYWdlckN1c3RvbSk6KHMucGFnZXJFbD10KCc8ZGl2IGNsYXNzPSJieC1wYWdlciIgLz4nKSxzLnNldHRpbmdzLnBhZ2VyU2VsZWN0b3I/dChzLnNldHRpbmdzLnBhZ2VyU2VsZWN0b3IpLmh0bWwocy5wYWdlckVsKTpzLmNvbnRyb2xzLmVsLmFkZENsYXNzKCJieC1oYXMtcGFnZXIiKS5hcHBlbmQocy5wYWdlckVsKSxiKCkpLHMucGFnZXJFbC5vbigiY2xpY2sgdG91Y2hlbmQiLCJhIix6KX0sQz1mdW5jdGlvbigpe3MuY29udHJvbHMubmV4dD10KCc8YSBjbGFzcz0iYngtbmV4dCIgaHJlZj0iIj4nK3Muc2V0dGluZ3MubmV4dFRleHQrIjwvYT4iKSxzLmNvbnRyb2xzLnByZXY9dCgnPGEgY2xhc3M9ImJ4LXByZXYiIGhyZWY9IiI+JytzLnNldHRpbmdzLnByZXZUZXh0KyI8L2E+Iikscy5jb250cm9scy5uZXh0LmJpbmQoImNsaWNrIHRvdWNoZW5kIixFKSxzLmNvbnRyb2xzLnByZXYuYmluZCgiY2xpY2sgdG91Y2hlbmQiLGspLHMuc2V0dGluZ3MubmV4dFNlbGVjdG9yJiZ0KHMuc2V0dGluZ3MubmV4dFNlbGVjdG9yKS5hcHBlbmQocy5jb250cm9scy5uZXh0KSxzLnNldHRpbmdzLnByZXZTZWxlY3RvciYmdChzLnNldHRpbmdzLnByZXZTZWxlY3RvcikuYXBwZW5kKHMuY29udHJvbHMucHJldikscy5zZXR0aW5ncy5uZXh0U2VsZWN0b3J8fHMuc2V0dGluZ3MucHJldlNlbGVjdG9yfHwocy5jb250cm9scy5kaXJlY3Rpb25FbD10KCc8ZGl2IGNsYXNzPSJieC1jb250cm9scy1kaXJlY3Rpb24iIC8+Jykscy5jb250cm9scy5kaXJlY3Rpb25FbC5hcHBlbmQocy5jb250cm9scy5wcmV2KS5hcHBlbmQocy5jb250cm9scy5uZXh0KSxzLmNvbnRyb2xzLmVsLmFkZENsYXNzKCJieC1oYXMtY29udHJvbHMtZGlyZWN0aW9uIikuYXBwZW5kKHMuY29udHJvbHMuZGlyZWN0aW9uRWwpKX0sVD1mdW5jdGlvbigpe3MuY29udHJvbHMuc3RhcnQ9dCgnPGRpdiBjbGFzcz0iYngtY29udHJvbHMtYXV0by1pdGVtIj48YSBjbGFzcz0iYngtc3RhcnQiIGhyZWY9IiI+JytzLnNldHRpbmdzLnN0YXJ0VGV4dCsiPC9hPjwvZGl2PiIpLHMuY29udHJvbHMuc3RvcD10KCc8ZGl2IGNsYXNzPSJieC1jb250cm9scy1hdXRvLWl0ZW0iPjxhIGNsYXNzPSJieC1zdG9wIiBocmVmPSIiPicrcy5zZXR0aW5ncy5zdG9wVGV4dCsiPC9hPjwvZGl2PiIpLHMuY29udHJvbHMuYXV0b0VsPXQoJzxkaXYgY2xhc3M9ImJ4LWNvbnRyb2xzLWF1dG8iIC8+Jykscy5jb250cm9scy5hdXRvRWwub24oImNsaWNrIiwiLmJ4LXN0YXJ0IixNKSxzLmNvbnRyb2xzLmF1dG9FbC5vbigiY2xpY2siLCIuYngtc3RvcCIseSkscy5zZXR0aW5ncy5hdXRvQ29udHJvbHNDb21iaW5lP3MuY29udHJvbHMuYXV0b0VsLmFwcGVuZChzLmNvbnRyb2xzLnN0YXJ0KTpzLmNvbnRyb2xzLmF1dG9FbC5hcHBlbmQocy5jb250cm9scy5zdGFydCkuYXBwZW5kKHMuY29udHJvbHMuc3RvcCkscy5zZXR0aW5ncy5hdXRvQ29udHJvbHNTZWxlY3Rvcj90KHMuc2V0dGluZ3MuYXV0b0NvbnRyb2xzU2VsZWN0b3IpLmh0bWwocy5jb250cm9scy5hdXRvRWwpOnMuY29udHJvbHMuZWwuYWRkQ2xhc3MoImJ4LWhhcy1jb250cm9scy1hdXRvIikuYXBwZW5kKHMuY29udHJvbHMuYXV0b0VsKSxBKHMuc2V0dGluZ3MuYXV0b1N0YXJ0PyJzdG9wIjoic3RhcnQiKX0sUD1mdW5jdGlvbigpe3MuY2hpbGRyZW4uZWFjaChmdW5jdGlvbihlKXt2YXIgaT10KHRoaXMpLmZpbmQoImltZzpmaXJzdCIpLmF0dHIoInRpdGxlIik7dm9pZCAwIT09aSYmKCIiK2kpLmxlbmd0aCYmdCh0aGlzKS5hcHBlbmQoJzxkaXYgY2xhc3M9ImJ4LWNhcHRpb24iPjxzcGFuPicraSsiPC9zcGFuPjwvZGl2PiIpfSl9LEU9ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHMuY29udHJvbHMuZWwuaGFzQ2xhc3MoImRpc2FibGVkIil8fChzLnNldHRpbmdzLmF1dG8mJnMuc2V0dGluZ3Muc3RvcEF1dG9PbkNsaWNrJiZvLnN0b3BBdXRvKCksby5nb1RvTmV4dFNsaWRlKCkpfSxrPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSxzLmNvbnRyb2xzLmVsLmhhc0NsYXNzKCJkaXNhYmxlZCIpfHwocy5zZXR0aW5ncy5hdXRvJiZzLnNldHRpbmdzLnN0b3BBdXRvT25DbGljayYmby5zdG9wQXV0bygpLG8uZ29Ub1ByZXZTbGlkZSgpKX0sTT1mdW5jdGlvbih0KXtvLnN0YXJ0QXV0bygpLHQucHJldmVudERlZmF1bHQoKX0seT1mdW5jdGlvbih0KXtvLnN0b3BBdXRvKCksdC5wcmV2ZW50RGVmYXVsdCgpfSx6PWZ1bmN0aW9uKGUpe3ZhciBpLG47ZS5wcmV2ZW50RGVmYXVsdCgpLHMuY29udHJvbHMuZWwuaGFzQ2xhc3MoImRpc2FibGVkIil8fChzLnNldHRpbmdzLmF1dG8mJnMuc2V0dGluZ3Muc3RvcEF1dG9PbkNsaWNrJiZvLnN0b3BBdXRvKCksaT10KGUuY3VycmVudFRhcmdldCksdm9pZCAwIT09aS5hdHRyKCJkYXRhLXNsaWRlLWluZGV4IikmJihuPXBhcnNlSW50KGkuYXR0cigiZGF0YS1zbGlkZS1pbmRleCIpKSxuIT09cy5hY3RpdmUuaW5kZXgmJm8uZ29Ub1NsaWRlKG4pKSl9LEk9ZnVuY3Rpb24oZSl7dmFyIGk9cy5jaGlsZHJlbi5sZW5ndGg7cmV0dXJuInNob3J0Ij09PXMuc2V0dGluZ3MucGFnZXJUeXBlPyhzLnNldHRpbmdzLm1heFNsaWRlcz4xJiYoaT1NYXRoLmNlaWwocy5jaGlsZHJlbi5sZW5ndGgvcy5zZXR0aW5ncy5tYXhTbGlkZXMpKSx2b2lkIHMucGFnZXJFbC5odG1sKGUrMStzLnNldHRpbmdzLnBhZ2VyU2hvcnRTZXBhcmF0b3IraSkpOihzLnBhZ2VyRWwuZmluZCgiYSIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSx2b2lkIHMucGFnZXJFbC5lYWNoKGZ1bmN0aW9uKGksbil7dChuKS5maW5kKCJhIikuZXEoZSkuYWRkQ2xhc3MoImFjdGl2ZSIpfSkpfSxxPWZ1bmN0aW9uKCl7aWYocy5zZXR0aW5ncy5pbmZpbml0ZUxvb3Ape3ZhciB0PSIiOzA9PT1zLmFjdGl2ZS5pbmRleD90PXMuY2hpbGRyZW4uZXEoMCkucG9zaXRpb24oKTpzLmFjdGl2ZS5pbmRleD09PWYoKS0xJiZzLmNhcm91c2VsP3Q9cy5jaGlsZHJlbi5lcSgoZigpLTEpKngoKSkucG9zaXRpb24oKTpzLmFjdGl2ZS5pbmRleD09PXMuY2hpbGRyZW4ubGVuZ3RoLTEmJih0PXMuY2hpbGRyZW4uZXEocy5jaGlsZHJlbi5sZW5ndGgtMSkucG9zaXRpb24oKSksdCYmKCJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT9TKC10LmxlZnQsInJlc2V0IiwwKToidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlJiZTKC10LnRvcCwicmVzZXQiLDApKX1zLndvcmtpbmc9ITEscy5zZXR0aW5ncy5vblNsaWRlQWZ0ZXIuY2FsbChvLHMuY2hpbGRyZW4uZXEocy5hY3RpdmUuaW5kZXgpLHMub2xkSW5kZXgscy5hY3RpdmUuaW5kZXgpfSxBPWZ1bmN0aW9uKHQpe3Muc2V0dGluZ3MuYXV0b0NvbnRyb2xzQ29tYmluZT9zLmNvbnRyb2xzLmF1dG9FbC5odG1sKHMuY29udHJvbHNbdF0pOihzLmNvbnRyb2xzLmF1dG9FbC5maW5kKCJhIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLHMuY29udHJvbHMuYXV0b0VsLmZpbmQoImE6bm90KC5ieC0iK3QrIikiKS5hZGRDbGFzcygiYWN0aXZlIikpfSxEPWZ1bmN0aW9uKCl7MT09PWYoKT8ocy5jb250cm9scy5wcmV2LmFkZENsYXNzKCJkaXNhYmxlZCIpLHMuY29udHJvbHMubmV4dC5hZGRDbGFzcygiZGlzYWJsZWQiKSk6IXMuc2V0dGluZ3MuaW5maW5pdGVMb29wJiZzLnNldHRpbmdzLmhpZGVDb250cm9sT25FbmQmJigwPT09cy5hY3RpdmUuaW5kZXg/KHMuY29udHJvbHMucHJldi5hZGRDbGFzcygiZGlzYWJsZWQiKSxzLmNvbnRyb2xzLm5leHQucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikpOnMuYWN0aXZlLmluZGV4PT09ZigpLTE/KHMuY29udHJvbHMubmV4dC5hZGRDbGFzcygiZGlzYWJsZWQiKSxzLmNvbnRyb2xzLnByZXYucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikpOihzLmNvbnRyb2xzLnByZXYucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikscy5jb250cm9scy5uZXh0LnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpKSl9LEg9ZnVuY3Rpb24oKXtpZihzLnNldHRpbmdzLmF1dG9EZWxheT4wKXtzZXRUaW1lb3V0KG8uc3RhcnRBdXRvLHMuc2V0dGluZ3MuYXV0b0RlbGF5KX1lbHNlIG8uc3RhcnRBdXRvKCksdCh3aW5kb3cpLmZvY3VzKGZ1bmN0aW9uKCl7by5zdGFydEF1dG8oKX0pLmJsdXIoZnVuY3Rpb24oKXtvLnN0b3BBdXRvKCl9KTtzLnNldHRpbmdzLmF1dG9Ib3ZlciYmby5ob3ZlcihmdW5jdGlvbigpe3MuaW50ZXJ2YWwmJihvLnN0b3BBdXRvKCEwKSxzLmF1dG9QYXVzZWQ9ITApfSxmdW5jdGlvbigpe3MuYXV0b1BhdXNlZCYmKG8uc3RhcnRBdXRvKCEwKSxzLmF1dG9QYXVzZWQ9bnVsbCl9KX0sVz1mdW5jdGlvbigpe3ZhciBlLGksbixyLGEsbCxkLGMsZz0wOyJuZXh0Ij09PXMuc2V0dGluZ3MuYXV0b0RpcmVjdGlvbj9vLmFwcGVuZChzLmNoaWxkcmVuLmNsb25lKCkuYWRkQ2xhc3MoImJ4LWNsb25lIikpOihvLnByZXBlbmQocy5jaGlsZHJlbi5jbG9uZSgpLmFkZENsYXNzKCJieC1jbG9uZSIpKSxlPXMuY2hpbGRyZW4uZmlyc3QoKS5wb3NpdGlvbigpLGc9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPy1lLmxlZnQ6LWUudG9wKSxTKGcsInJlc2V0IiwwKSxzLnNldHRpbmdzLnBhZ2VyPSExLHMuc2V0dGluZ3MuY29udHJvbHM9ITEscy5zZXR0aW5ncy5hdXRvQ29udHJvbHM9ITEscy5zZXR0aW5ncy50aWNrZXJIb3ZlciYmKHMudXNpbmdDU1M/KHI9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPzQ6NSxzLnZpZXdwb3J0LmhvdmVyKGZ1bmN0aW9uKCl7aT1vLmNzcygiLSIrcy5jc3NQcmVmaXgrIi10cmFuc2Zvcm0iKSxuPXBhcnNlRmxvYXQoaS5zcGxpdCgiLCIpW3JdKSxTKG4sInJlc2V0IiwwKX0sZnVuY3Rpb24oKXtjPTAscy5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKGUpe2MrPSJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT90KHRoaXMpLm91dGVyV2lkdGgoITApOnQodGhpcykub3V0ZXJIZWlnaHQoITApfSksYT1zLnNldHRpbmdzLnNwZWVkL2MsbD0iaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGU/ImxlZnQiOiJ0b3AiLGQ9YSooYy1NYXRoLmFicyhwYXJzZUludChuKSkpLEwoZCl9KSk6cy52aWV3cG9ydC5ob3ZlcihmdW5jdGlvbigpe28uc3RvcCgpfSxmdW5jdGlvbigpe2M9MCxzLmNoaWxkcmVuLmVhY2goZnVuY3Rpb24oZSl7Yys9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlP3QodGhpcykub3V0ZXJXaWR0aCghMCk6dCh0aGlzKS5vdXRlckhlaWdodCghMCl9KSxhPXMuc2V0dGluZ3Muc3BlZWQvYyxsPSJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8ibGVmdCI6InRvcCIsZD1hKihjLU1hdGguYWJzKHBhcnNlSW50KG8uY3NzKGwpKSkpLEwoZCl9KSksTCgpfSxMPWZ1bmN0aW9uKHQpe3ZhciBlLGksbixyPXQ/dDpzLnNldHRpbmdzLnNwZWVkLGE9e2xlZnQ6MCx0b3A6MH0sbD17bGVmdDowLHRvcDowfTsibmV4dCI9PT1zLnNldHRpbmdzLmF1dG9EaXJlY3Rpb24/YT1vLmZpbmQoIi5ieC1jbG9uZSIpLmZpcnN0KCkucG9zaXRpb24oKTpsPXMuY2hpbGRyZW4uZmlyc3QoKS5wb3NpdGlvbigpLGU9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPy1hLmxlZnQ6LWEudG9wLGk9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPy1sLmxlZnQ6LWwudG9wLG49e3Jlc2V0VmFsdWU6aX0sUyhlLCJ0aWNrZXIiLHIsbil9LE89ZnVuY3Rpb24oZSl7dmFyIGk9dCh3aW5kb3cpLG49e3RvcDppLnNjcm9sbFRvcCgpLGxlZnQ6aS5zY3JvbGxMZWZ0KCl9LHM9ZS5vZmZzZXQoKTtyZXR1cm4gbi5yaWdodD1uLmxlZnQraS53aWR0aCgpLG4uYm90dG9tPW4udG9wK2kuaGVpZ2h0KCkscy5yaWdodD1zLmxlZnQrZS5vdXRlcldpZHRoKCkscy5ib3R0b209cy50b3ArZS5vdXRlckhlaWdodCgpLCEobi5yaWdodDxzLmxlZnR8fG4ubGVmdD5zLnJpZ2h0fHxuLmJvdHRvbTxzLnRvcHx8bi50b3A+cy5ib3R0b20pfSxGPWZ1bmN0aW9uKHQpe3ZhciBlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpLGk9ImlucHV0fHRleHRhcmVhIixuPW5ldyBSZWdFeHAoZSxbImkiXSkscz1uLmV4ZWMoaSk7aWYobnVsbD09cyYmTyhvKSl7aWYoMzk9PT10LmtleUNvZGUpcmV0dXJuIEUodCksITE7aWYoMzc9PT10LmtleUNvZGUpcmV0dXJuIGsodCksITF9fSxOPWZ1bmN0aW9uKCl7cy50b3VjaD17c3RhcnQ6e3g6MCx5OjB9LGVuZDp7eDowLHk6MH19LHMudmlld3BvcnQuYmluZCgidG91Y2hzdGFydCBNU1BvaW50ZXJEb3duIHBvaW50ZXJkb3duIixYKSxzLnZpZXdwb3J0Lm9uKCJjbGljayIsIi5ieHNsaWRlciBhIixmdW5jdGlvbih0KXtzLnZpZXdwb3J0Lmhhc0NsYXNzKCJjbGljay1kaXNhYmxlZCIpJiYodC5wcmV2ZW50RGVmYXVsdCgpLHMudmlld3BvcnQucmVtb3ZlQ2xhc3MoImNsaWNrLWRpc2FibGVkIikpfSl9LFg9ZnVuY3Rpb24odCl7aWYocy5jb250cm9scy5lbC5hZGRDbGFzcygiZGlzYWJsZWQiKSxzLndvcmtpbmcpdC5wcmV2ZW50RGVmYXVsdCgpLHMuY29udHJvbHMuZWwucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7ZWxzZXtzLnRvdWNoLm9yaWdpbmFsUG9zPW8ucG9zaXRpb24oKTt2YXIgZT10Lm9yaWdpbmFsRXZlbnQsaT0idW5kZWZpbmVkIiE9dHlwZW9mIGUuY2hhbmdlZFRvdWNoZXM/ZS5jaGFuZ2VkVG91Y2hlczpbZV07cy50b3VjaC5zdGFydC54PWlbMF0ucGFnZVgscy50b3VjaC5zdGFydC55PWlbMF0ucGFnZVkscy52aWV3cG9ydC5nZXQoMCkuc2V0UG9pbnRlckNhcHR1cmUmJihzLnBvaW50ZXJJZD1lLnBvaW50ZXJJZCxzLnZpZXdwb3J0LmdldCgwKS5zZXRQb2ludGVyQ2FwdHVyZShzLnBvaW50ZXJJZCkpLHMudmlld3BvcnQuYmluZCgidG91Y2htb3ZlIE1TUG9pbnRlck1vdmUgcG9pbnRlcm1vdmUiLFYpLHMudmlld3BvcnQuYmluZCgidG91Y2hlbmQgTVNQb2ludGVyVXAgcG9pbnRlcnVwIixSKSxzLnZpZXdwb3J0LmJpbmQoIk1TUG9pbnRlckNhbmNlbCBwb2ludGVyY2FuY2VsIixZKX19LFk9ZnVuY3Rpb24odCl7UyhzLnRvdWNoLm9yaWdpbmFsUG9zLmxlZnQsInJlc2V0IiwwKSxzLmNvbnRyb2xzLmVsLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpLHMudmlld3BvcnQudW5iaW5kKCJNU1BvaW50ZXJDYW5jZWwgcG9pbnRlcmNhbmNlbCIsWSkscy52aWV3cG9ydC51bmJpbmQoInRvdWNobW92ZSBNU1BvaW50ZXJNb3ZlIHBvaW50ZXJtb3ZlIixWKSxzLnZpZXdwb3J0LnVuYmluZCgidG91Y2hlbmQgTVNQb2ludGVyVXAgcG9pbnRlcnVwIixSKSxzLnZpZXdwb3J0LmdldCgwKS5yZWxlYXNlUG9pbnRlckNhcHR1cmUmJnMudmlld3BvcnQuZ2V0KDApLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShzLnBvaW50ZXJJZCl9LFY9ZnVuY3Rpb24odCl7dmFyIGU9dC5vcmlnaW5hbEV2ZW50LGk9InVuZGVmaW5lZCIhPXR5cGVvZiBlLmNoYW5nZWRUb3VjaGVzP2UuY2hhbmdlZFRvdWNoZXM6W2VdLG49TWF0aC5hYnMoaVswXS5wYWdlWC1zLnRvdWNoLnN0YXJ0LngpLG89TWF0aC5hYnMoaVswXS5wYWdlWS1zLnRvdWNoLnN0YXJ0LnkpLHI9MCxhPTA7MypuPm8mJnMuc2V0dGluZ3MucHJldmVudERlZmF1bHRTd2lwZVg/dC5wcmV2ZW50RGVmYXVsdCgpOjMqbz5uJiZzLnNldHRpbmdzLnByZXZlbnREZWZhdWx0U3dpcGVZJiZ0LnByZXZlbnREZWZhdWx0KCksImZhZGUiIT09cy5zZXR0aW5ncy5tb2RlJiZzLnNldHRpbmdzLm9uZVRvT25lVG91Y2gmJigiaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGU/KGE9aVswXS5wYWdlWC1zLnRvdWNoLnN0YXJ0Lngscj1zLnRvdWNoLm9yaWdpbmFsUG9zLmxlZnQrYSk6KGE9aVswXS5wYWdlWS1zLnRvdWNoLnN0YXJ0Lnkscj1zLnRvdWNoLm9yaWdpbmFsUG9zLnRvcCthKSxTKHIsInJlc2V0IiwwKSl9LFI9ZnVuY3Rpb24odCl7cy52aWV3cG9ydC51bmJpbmQoInRvdWNobW92ZSBNU1BvaW50ZXJNb3ZlIHBvaW50ZXJtb3ZlIixWKSxzLmNvbnRyb2xzLmVsLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO3ZhciBlPXQub3JpZ2luYWxFdmVudCxpPSJ1bmRlZmluZWQiIT10eXBlb2YgZS5jaGFuZ2VkVG91Y2hlcz9lLmNoYW5nZWRUb3VjaGVzOltlXSxuPTAscj0wO3MudG91Y2guZW5kLng9aVswXS5wYWdlWCxzLnRvdWNoLmVuZC55PWlbMF0ucGFnZVksImZhZGUiPT09cy5zZXR0aW5ncy5tb2RlPyhyPU1hdGguYWJzKHMudG91Y2guc3RhcnQueC1zLnRvdWNoLmVuZC54KSxyPj1zLnNldHRpbmdzLnN3aXBlVGhyZXNob2xkJiYocy50b3VjaC5zdGFydC54PnMudG91Y2guZW5kLng/by5nb1RvTmV4dFNsaWRlKCk6by5nb1RvUHJldlNsaWRlKCksby5zdG9wQXV0bygpKSk6KCJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8ocj1zLnRvdWNoLmVuZC54LXMudG91Y2guc3RhcnQueCxuPXMudG91Y2gub3JpZ2luYWxQb3MubGVmdCk6KHI9cy50b3VjaC5lbmQueS1zLnRvdWNoLnN0YXJ0Lnksbj1zLnRvdWNoLm9yaWdpbmFsUG9zLnRvcCksIXMuc2V0dGluZ3MuaW5maW5pdGVMb29wJiYoMD09PXMuYWN0aXZlLmluZGV4JiZyPjB8fHMuYWN0aXZlLmxhc3QmJnI8MCk/UyhuLCJyZXNldCIsMjAwKTpNYXRoLmFicyhyKT49cy5zZXR0aW5ncy5zd2lwZVRocmVzaG9sZD8ocjwwP28uZ29Ub05leHRTbGlkZSgpOm8uZ29Ub1ByZXZTbGlkZSgpLG8uc3RvcEF1dG8oKSk6UyhuLCJyZXNldCIsMjAwKSkscy52aWV3cG9ydC51bmJpbmQoInRvdWNoZW5kIE1TUG9pbnRlclVwIHBvaW50ZXJ1cCIsUikscy52aWV3cG9ydC5nZXQoMCkucmVsZWFzZVBvaW50ZXJDYXB0dXJlJiZzLnZpZXdwb3J0LmdldCgwKS5yZWxlYXNlUG9pbnRlckNhcHR1cmUocy5wb2ludGVySWQpfSxaPWZ1bmN0aW9uKGUpe2lmKHMuaW5pdGlhbGl6ZWQpaWYocy53b3JraW5nKXdpbmRvdy5zZXRUaW1lb3V0KFosMTApO2Vsc2V7dmFyIGk9dCh3aW5kb3cpLndpZHRoKCksbj10KHdpbmRvdykuaGVpZ2h0KCk7cj09PWkmJmE9PT1ufHwocj1pLGE9bixvLnJlZHJhd1NsaWRlcigpLHMuc2V0dGluZ3Mub25TbGlkZXJSZXNpemUuY2FsbChvLHMuYWN0aXZlLmluZGV4KSl9fSxCPWZ1bmN0aW9uKHQpe3ZhciBlPXYoKTtzLnNldHRpbmdzLmFyaWFIaWRkZW4mJiFzLnNldHRpbmdzLnRpY2tlciYmKHMuY2hpbGRyZW4uYXR0cigiYXJpYS1oaWRkZW4iLCJ0cnVlIikscy5jaGlsZHJlbi5zbGljZSh0LHQrZSkuYXR0cigiYXJpYS1oaWRkZW4iLCJmYWxzZSIpKX0sVT1mdW5jdGlvbih0KXtyZXR1cm4gdDwwP3Muc2V0dGluZ3MuaW5maW5pdGVMb29wP2YoKS0xOnMuYWN0aXZlLmluZGV4OnQ+PWYoKT9zLnNldHRpbmdzLmluZmluaXRlTG9vcD8wOnMuYWN0aXZlLmluZGV4OnR9O3JldHVybiBvLmdvVG9TbGlkZT1mdW5jdGlvbihlLGkpe3ZhciBuLHIsYSxsLGQ9ITAsYz0wLGc9e2xlZnQ6MCx0b3A6MH0sdT1udWxsO2lmKHMub2xkSW5kZXg9cy5hY3RpdmUuaW5kZXgscy5hY3RpdmUuaW5kZXg9VShlKSwhcy53b3JraW5nJiZzLmFjdGl2ZS5pbmRleCE9PXMub2xkSW5kZXgpe2lmKHMud29ya2luZz0hMCxkPXMuc2V0dGluZ3Mub25TbGlkZUJlZm9yZS5jYWxsKG8scy5jaGlsZHJlbi5lcShzLmFjdGl2ZS5pbmRleCkscy5vbGRJbmRleCxzLmFjdGl2ZS5pbmRleCksInVuZGVmaW5lZCIhPXR5cGVvZiBkJiYhZClyZXR1cm4gcy5hY3RpdmUuaW5kZXg9cy5vbGRJbmRleCx2b2lkKHMud29ya2luZz0hMSk7Im5leHQiPT09aT9zLnNldHRpbmdzLm9uU2xpZGVOZXh0LmNhbGwobyxzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KSxzLm9sZEluZGV4LHMuYWN0aXZlLmluZGV4KXx8KGQ9ITEpOiJwcmV2Ij09PWkmJihzLnNldHRpbmdzLm9uU2xpZGVQcmV2LmNhbGwobyxzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KSxzLm9sZEluZGV4LHMuYWN0aXZlLmluZGV4KXx8KGQ9ITEpKSxzLmFjdGl2ZS5sYXN0PXMuYWN0aXZlLmluZGV4Pj1mKCktMSwocy5zZXR0aW5ncy5wYWdlcnx8cy5zZXR0aW5ncy5wYWdlckN1c3RvbSkmJkkocy5hY3RpdmUuaW5kZXgpLHMuc2V0dGluZ3MuY29udHJvbHMmJkQoKSwiZmFkZSI9PT1zLnNldHRpbmdzLm1vZGU/KHMuc2V0dGluZ3MuYWRhcHRpdmVIZWlnaHQmJnMudmlld3BvcnQuaGVpZ2h0KCkhPT1wKCkmJnMudmlld3BvcnQuYW5pbWF0ZSh7aGVpZ2h0OnAoKX0scy5zZXR0aW5ncy5hZGFwdGl2ZUhlaWdodFNwZWVkKSxzLmNoaWxkcmVuLmZpbHRlcigiOnZpc2libGUiKS5mYWRlT3V0KHMuc2V0dGluZ3Muc3BlZWQpLmNzcyh7ekluZGV4OjB9KSxzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KS5jc3MoInpJbmRleCIscy5zZXR0aW5ncy5zbGlkZVpJbmRleCsxKS5mYWRlSW4ocy5zZXR0aW5ncy5zcGVlZCxmdW5jdGlvbigpe3QodGhpcykuY3NzKCJ6SW5kZXgiLHMuc2V0dGluZ3Muc2xpZGVaSW5kZXgpLHEoKX0pKToocy5zZXR0aW5ncy5hZGFwdGl2ZUhlaWdodCYmcy52aWV3cG9ydC5oZWlnaHQoKSE9PXAoKSYmcy52aWV3cG9ydC5hbmltYXRlKHtoZWlnaHQ6cCgpfSxzLnNldHRpbmdzLmFkYXB0aXZlSGVpZ2h0U3BlZWQpLCFzLnNldHRpbmdzLmluZmluaXRlTG9vcCYmcy5jYXJvdXNlbCYmcy5hY3RpdmUubGFzdD8iaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGU/KHU9cy5jaGlsZHJlbi5lcShzLmNoaWxkcmVuLmxlbmd0aC0xKSxnPXUucG9zaXRpb24oKSxjPXMudmlld3BvcnQud2lkdGgoKS11Lm91dGVyV2lkdGgoKSk6KG49cy5jaGlsZHJlbi5sZW5ndGgtcy5zZXR0aW5ncy5taW5TbGlkZXMsZz1zLmNoaWxkcmVuLmVxKG4pLnBvc2l0aW9uKCkpOnMuY2Fyb3VzZWwmJnMuYWN0aXZlLmxhc3QmJiJwcmV2Ij09PWk/KHI9MT09PXMuc2V0dGluZ3MubW92ZVNsaWRlcz9zLnNldHRpbmdzLm1heFNsaWRlcy14KCk6KGYoKS0xKSp4KCktKHMuY2hpbGRyZW4ubGVuZ3RoLXMuc2V0dGluZ3MubWF4U2xpZGVzKSx1PW8uY2hpbGRyZW4oIi5ieC1jbG9uZSIpLmVxKHIpLGc9dS5wb3NpdGlvbigpKToibmV4dCI9PT1pJiYwPT09cy5hY3RpdmUuaW5kZXg/KGc9by5maW5kKCI+IC5ieC1jbG9uZSIpLmVxKHMuc2V0dGluZ3MubWF4U2xpZGVzKS5wb3NpdGlvbigpLHMuYWN0aXZlLmxhc3Q9ITEpOmU+PTAmJihsPWUqcGFyc2VJbnQoeCgpKSxnPXMuY2hpbGRyZW4uZXEobCkucG9zaXRpb24oKSksInVuZGVmaW5lZCIhPXR5cGVvZiBnPyhhPSJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8tKGcubGVmdC1jKTotZy50b3AsUyhhLCJzbGlkZSIscy5zZXR0aW5ncy5zcGVlZCkpOnMud29ya2luZz0hMSkscy5zZXR0aW5ncy5hcmlhSGlkZGVuJiZCKHMuYWN0aXZlLmluZGV4KngoKSl9fSxvLmdvVG9OZXh0U2xpZGU9ZnVuY3Rpb24oKXtpZihzLnNldHRpbmdzLmluZmluaXRlTG9vcHx8IXMuYWN0aXZlLmxhc3Qpe3ZhciB0PXBhcnNlSW50KHMuYWN0aXZlLmluZGV4KSsxO28uZ29Ub1NsaWRlKHQsIm5leHQiKX19LG8uZ29Ub1ByZXZTbGlkZT1mdW5jdGlvbigpe2lmKHMuc2V0dGluZ3MuaW5maW5pdGVMb29wfHwwIT09cy5hY3RpdmUuaW5kZXgpe3ZhciB0PXBhcnNlSW50KHMuYWN0aXZlLmluZGV4KS0xO28uZ29Ub1NsaWRlKHQsInByZXYiKX19LG8uc3RhcnRBdXRvPWZ1bmN0aW9uKHQpe3MuaW50ZXJ2YWx8fChzLmludGVydmFsPXNldEludGVydmFsKGZ1bmN0aW9uKCl7Im5leHQiPT09cy5zZXR0aW5ncy5hdXRvRGlyZWN0aW9uP28uZ29Ub05leHRTbGlkZSgpOm8uZ29Ub1ByZXZTbGlkZSgpfSxzLnNldHRpbmdzLnBhdXNlKSxzLnNldHRpbmdzLmF1dG9Db250cm9scyYmdCE9PSEwJiZBKCJzdG9wIikpfSxvLnN0b3BBdXRvPWZ1bmN0aW9uKHQpe3MuaW50ZXJ2YWwmJihjbGVhckludGVydmFsKHMuaW50ZXJ2YWwpLHMuaW50ZXJ2YWw9bnVsbCxzLnNldHRpbmdzLmF1dG9Db250cm9scyYmdCE9PSEwJiZBKCJzdGFydCIpKX0sby5nZXRDdXJyZW50U2xpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gcy5hY3RpdmUuaW5kZXh9LG8uZ2V0Q3VycmVudFNsaWRlRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiBzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KX0sby5nZXRTbGlkZUVsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHMuY2hpbGRyZW4uZXEodCl9LG8uZ2V0U2xpZGVDb3VudD1mdW5jdGlvbigpe3JldHVybiBzLmNoaWxkcmVuLmxlbmd0aH0sby5pc1dvcmtpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gcy53b3JraW5nfSxvLnJlZHJhd1NsaWRlcj1mdW5jdGlvbigpe3MuY2hpbGRyZW4uYWRkKG8uZmluZCgiLmJ4LWNsb25lIikpLm91dGVyV2lkdGgoaCgpKSxzLnZpZXdwb3J0LmNzcygiaGVpZ2h0IixwKCkpLHMuc2V0dGluZ3MudGlja2VyfHxtKCkscy5hY3RpdmUubGFzdCYmKHMuYWN0aXZlLmluZGV4PWYoKS0xKSxzLmFjdGl2ZS5pbmRleD49ZigpJiYocy5hY3RpdmUubGFzdD0hMCkscy5zZXR0aW5ncy5wYWdlciYmIXMuc2V0dGluZ3MucGFnZXJDdXN0b20mJihiKCksSShzLmFjdGl2ZS5pbmRleCkpLHMuc2V0dGluZ3MuYXJpYUhpZGRlbiYmQihzLmFjdGl2ZS5pbmRleCp4KCkpfSxvLmRlc3Ryb3lTbGlkZXI9ZnVuY3Rpb24oKXtzLmluaXRpYWxpemVkJiYocy5pbml0aWFsaXplZD0hMSx0KCIuYngtY2xvbmUiLHRoaXMpLnJlbW92ZSgpLHMuY2hpbGRyZW4uZWFjaChmdW5jdGlvbigpe3ZvaWQgMCE9PXQodGhpcykuZGF0YSgib3JpZ1N0eWxlIik/dCh0aGlzKS5hdHRyKCJzdHlsZSIsdCh0aGlzKS5kYXRhKCJvcmlnU3R5bGUiKSk6dCh0aGlzKS5yZW1vdmVBdHRyKCJzdHlsZSIpfSksdm9pZCAwIT09dCh0aGlzKS5kYXRhKCJvcmlnU3R5bGUiKT90aGlzLmF0dHIoInN0eWxlIix0KHRoaXMpLmRhdGEoIm9yaWdTdHlsZSIpKTp0KHRoaXMpLnJlbW92ZUF0dHIoInN0eWxlIiksdCh0aGlzKS51bndyYXAoKS51bndyYXAoKSxzLmNvbnRyb2xzLmVsJiZzLmNvbnRyb2xzLmVsLnJlbW92ZSgpLHMuY29udHJvbHMubmV4dCYmcy5jb250cm9scy5uZXh0LnJlbW92ZSgpLHMuY29udHJvbHMucHJldiYmcy5jb250cm9scy5wcmV2LnJlbW92ZSgpLHMucGFnZXJFbCYmcy5zZXR0aW5ncy5jb250cm9scyYmIXMuc2V0dGluZ3MucGFnZXJDdXN0b20mJnMucGFnZXJFbC5yZW1vdmUoKSx0KCIuYngtY2FwdGlvbiIsdGhpcykucmVtb3ZlKCkscy5jb250cm9scy5hdXRvRWwmJnMuY29udHJvbHMuYXV0b0VsLnJlbW92ZSgpLGNsZWFySW50ZXJ2YWwocy5pbnRlcnZhbCkscy5zZXR0aW5ncy5yZXNwb25zaXZlJiZ0KHdpbmRvdykudW5iaW5kKCJyZXNpemUiLFopLHMuc2V0dGluZ3Mua2V5Ym9hcmRFbmFibGVkJiZ0KGRvY3VtZW50KS51bmJpbmQoImtleWRvd24iLEYpLHQodGhpcykucmVtb3ZlRGF0YSgiYnhTbGlkZXIiKSl9LG8ucmVsb2FkU2xpZGVyPWZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUmJihuPWUpLG8uZGVzdHJveVNsaWRlcigpLGwoKSx0KG8pLmRhdGEoImJ4U2xpZGVyIix0aGlzKX0sbCgpLHQobykuZGF0YSgiYnhTbGlkZXIiLHRoaXMpLHRoaXN9fX0oalF1ZXJ5KTsoZnVuY3Rpb24oJCl7JC5mbi5ldmVuWm9vbT1mdW5jdGlvbihvcHRpb25zKXt2YXIgZXZlblpvb209bmV3IEV2ZW5ab29tKCQodGhpcyksb3B0aW9ucyk7JCh0aGlzKS5tb3VzZWVudGVyKGZ1bmN0aW9uKCl7ZXZlblpvb20uY2hlY2tJbWFnZUNoYW5nZWQoJCh0aGlzKSk7ZXZlblpvb20uc2hvd0xlbnMoKX0pLm1vdXNlbW92ZShmdW5jdGlvbihlKXtldmVuWm9vbS5tb3ZlTGVucyhlLnBhZ2VYLGUucGFnZVkpfSkubW91c2VsZWF2ZShmdW5jdGlvbigpe2V2ZW5ab29tLmhpZGVMZW5zKCl9KX07ZnVuY3Rpb24gRXZlblpvb20oJGNvbnRhaW5lcixvcHRpb25zKXt0aGlzLl9pbml0PWZ1bmN0aW9uKHNldHRpbmdzKXtpZih0eXBlb2Ygc2V0dGluZ3MhPSJvYmplY3QiKXtzZXR0aW5ncz17fX0KdGhpcy5zZXR0aW5ncz17bGVuc1Bpbm5pbmdEaXN0YW5jZToyMH07dGhpcy5zZXR0aW5ncz0kLmV4dGVuZCh0aGlzLnNldHRpbmdzLHNldHRpbmdzKTt0aGlzLiRjb250YWluZXI9JGNvbnRhaW5lcjt0aGlzLiRjb250YWluZXIuYWRkQ2xhc3MoImV2ZW5ab29tIikuYXBwZW5kKCI8ZGl2IGNsYXNzPVwiZXZlblpvb21MZW5zIGhpZGRlblwiPjwvZGl2PiIpO3RoaXMuX2NhbGN1bGF0ZUltYWdlc1NpemUoKTt0aGlzLiRsZW5zPSQoIi5ldmVuWm9vbUxlbnMiLHRoaXMuJGNvbnRhaW5lcik7dGhpcy4kbGVucy5jc3MoImJhY2tncm91bmQtaW1hZ2UiLCJ1cmwoJyIrdGhpcy56b29tZWRJbWdTcmMrIicpIik7dGhpcy5sZW5zV2lkdGg9dGhpcy4kbGVucy53aWR0aCgpO3RoaXMubGVuc0hlaWdodD10aGlzLiRsZW5zLmhlaWdodCgpO3RoaXMubGVuc1dpZHRoSGFsZj10aGlzLmxlbnNXaWR0aC8yO3RoaXMubGVuc0hlaWdodEhhbGY9dGhpcy5sZW5zSGVpZ2h0LzI7dGhpcy5jdXJyZW50TGVuc1Bvc2l0aW9uWD0wO3RoaXMuY3VycmVudExlbnNQb3NpdGlvblk9MH07dGhpcy5fY2FsY3VsYXRlSW1hZ2VzU2l6ZT1mdW5jdGlvbigpe3RoaXMuaW1nU3JjPXRoaXMuX2ZpbmRPcmlnaW5hbEltZyh0aGlzLiRjb250YWluZXIpO3RoaXMuem9vbWVkSW1nU3JjPXRoaXMuJGNvbnRhaW5lci5kYXRhKCJ6b29tZWQiKTtpZih0aGlzLnpvb21lZEltZ1NyYyl7dmFyIHRoYXQ9dGhpczskKCI8aW1nIHNyYz0nIit0aGlzLmltZ1NyYysiJy8+Iikub24oJ2xvYWQnLGZ1bmN0aW9uKCl7dmFyIGltZ1dpZHRoPXRoaXMud2lkdGg7dmFyIGltZ0hlaWdodD10aGlzLmhlaWdodDt0aGF0LmNvbnRhaW50ZXJXaWR0aD10aGF0LiRjb250YWluZXIud2lkdGgoKTt0aGF0LmNvbnRhaW50ZXJIZWlnaHQ9dGhhdC4kY29udGFpbmVyLmhlaWdodCgpOyQoIjxpbWcgc3JjPSciK3RoYXQuem9vbWVkSW1nU3JjKyInLz4iKS5vbignbG9hZCcsZnVuY3Rpb24oKXtpZih0aGlzLndpZHRoPGltZ1dpZHRofHx0aGlzLmhlaWdodDxpbWdIZWlnaHQpe3RoYXQuem9vbWVkSW1nU3JjPXRoYXQuaW1nU3JjO3RoYXQuaW1nV2lkdGhSYXRpbz0xO3RoYXQuaW1nSGVpZ2h0UmF0aW89MX0KZWxzZXt0aGF0LmltZ1dpZHRoUmF0aW89dGhpcy53aWR0aC9pbWdXaWR0aDt0aGF0LmltZ0hlaWdodFJhdGlvPXRoaXMuaGVpZ2h0L2ltZ0hlaWdodH19KX0pfQplbHNle2NvbnNvbGUud2FybigiTm8gem9vbWVkIGltZyBmb3VuZCwgcGxlYXNlIHNldCBcImRhdGEtem9vbWVkXCIgZm9yIGV2ZW5ab29tIHNlbGVjdG9yIil9fTt0aGlzLl9maW5kT3JpZ2luYWxJbWc9ZnVuY3Rpb24oJGNvbnRhaW5lcil7aWYoJCgiaW1nIiwkY29udGFpbmVyKS5sZW5ndGgpe3JldHVybiAkKCJpbWc6Zmlyc3QiLCRjb250YWluZXIpLmF0dHIoInNyYyIpfQpjb25zb2xlLndhcm4oIk5vIG9yaWdpbmFsIGltZyBmb3VuZCwgcGxlYXNlIGFkZCBhbiA8aW1nPiB0YWcgaW5zaWRlIGV2ZW5ab29tIHNlbGVjdG9yIik7cmV0dXJuITF9O3RoaXMuY2FsY3VsYXRlQmFja2dyb3VuZFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIGJhY2tncm91bmRQb3NYPSgodGhpcy5jdXJyZW50TGVuc1Bvc2l0aW9uWC10aGlzLiRjb250YWluZXIub2Zmc2V0KCkubGVmdCt0aGlzLmxlbnNXaWR0aEhhbGYpKnRoaXMuaW1nV2lkdGhSYXRpbykqKC0xKSt0aGlzLmxlbnNXaWR0aEhhbGY7dmFyIGJhY2tncm91bmRQb3NZPSgodGhpcy5jdXJyZW50TGVuc1Bvc2l0aW9uWS10aGlzLiRjb250YWluZXIub2Zmc2V0KCkudG9wK3RoaXMubGVuc0hlaWdodEhhbGYpKnRoaXMuaW1nSGVpZ2h0UmF0aW8pKigtMSkrdGhpcy5sZW5zSGVpZ2h0SGFsZjt0aGlzLiRsZW5zLmNzcygiYmFja2dyb3VuZC1wb3NpdGlvbiIsYmFja2dyb3VuZFBvc1grInB4ICIrYmFja2dyb3VuZFBvc1krInB4Iil9O3RoaXMuX2luaXQob3B0aW9ucyl9CkV2ZW5ab29tLnByb3RvdHlwZS5zaG93TGVucz1mdW5jdGlvbigpe3RoaXMuJGxlbnMucmVtb3ZlQ2xhc3MoImhpZGRlbiIpfTtFdmVuWm9vbS5wcm90b3R5cGUuaGlkZUxlbnM9ZnVuY3Rpb24oKXt0aGlzLiRsZW5zLmFkZENsYXNzKCJoaWRkZW4iKX07RXZlblpvb20ucHJvdG90eXBlLmNoZWNrSW1hZ2VDaGFuZ2VkPWZ1bmN0aW9uKCRjb250YWluZXIpe3ZhciBuZXdJbWdTcmM9dGhpcy5fZmluZE9yaWdpbmFsSW1nKCRjb250YWluZXIpO2lmKG5ld0ltZ1NyYyE9dGhpcy5pbWdTcmMpe2lmKG5ld0ltZ1NyYyE9ITEpe3RoaXMucmVpbml0aWFsaXplKCRjb250YWluZXIpfQplbHNle3RoaXMuaGlkZUxlbnMoKX19fTtFdmVuWm9vbS5wcm90b3R5cGUucmVpbml0aWFsaXplPWZ1bmN0aW9uKCRjb250YWluZXIpe3RoaXMuJGNvbnRhaW5lcj0kY29udGFpbmVyO3RoaXMuY29udGFpbnRlcldpZHRoPXRoaXMuJGNvbnRhaW5lci53aWR0aCgpO3RoaXMuY29udGFpbnRlckhlaWdodD10aGlzLiRjb250YWluZXIuaGVpZ2h0KCk7dGhpcy5fY2FsY3VsYXRlSW1hZ2VzU2l6ZSgpO3RoaXMuJGxlbnMuY3NzKCJiYWNrZ3JvdW5kLWltYWdlIiwidXJsKCciK3RoaXMuem9vbWVkSW1nU3JjKyInKSIpfTtFdmVuWm9vbS5wcm90b3R5cGUubW92ZUxlbnM9ZnVuY3Rpb24obmV3UG9zWCxuZXdQb3NZKXt2YXIgbGVuc1Bvc1g9bmV3UG9zWC10aGlzLmxlbnNXaWR0aEhhbGY7dmFyIGxlbnNQb3NZPW5ld1Bvc1ktdGhpcy5sZW5zSGVpZ2h0SGFsZjt2YXIgbWluTGVuc1Bvc1g9dGhpcy4kY29udGFpbmVyLm9mZnNldCgpLmxlZnQtdGhpcy5sZW5zV2lkdGhIYWxmO3ZhciBtaW5MZW5zUG9zWT10aGlzLiRjb250YWluZXIub2Zmc2V0KCkudG9wLXRoaXMubGVuc0hlaWdodEhhbGY7dmFyIG1heExlbnNQb3NYPW1pbkxlbnNQb3NYK3RoaXMuY29udGFpbnRlcldpZHRoO3ZhciBtYXhMZW5zUG9zWT1taW5MZW5zUG9zWSt0aGlzLmNvbnRhaW50ZXJIZWlnaHQ7dmFyIGhpZGVMZW5zPSExO2lmKGxlbnNQb3NYPD1taW5MZW5zUG9zWCl7aWYobWluTGVuc1Bvc1gtbGVuc1Bvc1g+PXRoaXMuc2V0dGluZ3MubGVuc1Bpbm5pbmdEaXN0YW5jZSl7aGlkZUxlbnM9ITB9CmxlbnNQb3NYPW1pbkxlbnNQb3NYfWVsc2UgaWYobGVuc1Bvc1g+PW1heExlbnNQb3NYKXtpZihsZW5zUG9zWC1tYXhMZW5zUG9zWD49dGhpcy5zZXR0aW5ncy5sZW5zUGlubmluZ0Rpc3RhbmNlKXtoaWRlTGVucz0hMH0KbGVuc1Bvc1g9bWF4TGVuc1Bvc1h9CmlmKGxlbnNQb3NZPD1taW5MZW5zUG9zWSl7aWYobWluTGVuc1Bvc1ktbGVuc1Bvc1k+PXRoaXMuc2V0dGluZ3MubGVuc1Bpbm5pbmdEaXN0YW5jZSl7aGlkZUxlbnM9ITB9CmxlbnNQb3NZPW1pbkxlbnNQb3NZfWVsc2UgaWYobGVuc1Bvc1k+PW1heExlbnNQb3NZKXtpZihsZW5zUG9zWS1tYXhMZW5zUG9zWT49dGhpcy5zZXR0aW5ncy5sZW5zUGlubmluZ0Rpc3RhbmNlKXtoaWRlTGVucz0hMH0KbGVuc1Bvc1k9bWF4TGVuc1Bvc1l9CmlmKCFoaWRlTGVucyl7dGhpcy5zaG93TGVucygpfQplbHNle3RoaXMuaGlkZUxlbnMoKX0KdGhpcy4kbGVucy5vZmZzZXQoe2xlZnQ6bGVuc1Bvc1gsdG9wOmxlbnNQb3NZfSk7dGhpcy5jdXJyZW50TGVuc1Bvc2l0aW9uWD1sZW5zUG9zWDt0aGlzLmN1cnJlbnRMZW5zUG9zaXRpb25ZPWxlbnNQb3NZO3RoaXMuY2FsY3VsYXRlQmFja2dyb3VuZFBvc2l0aW9uKCl9fShqUXVlcnkpKTt2YXIgYWRkclR5cGVzX21hcD1uZXcgQXJyYXkoKTthZGRyVHlwZXNfbWFwLmI9J2JpbGxpbmcnO2FkZHJUeXBlc19tYXAucz0nc2hpcHBpbmcnO3ZhciBhZGRyPW5ldyBPYmplY3QoKTthZGRyLnN0YXRlPScnO2FkZHIuY291bnR5PScnO2FkZHIuY2l0eT0nJzthZGRyLmNvdW50cnk9Jyc7dmFyIGNob3NlQWRkcj0wOyQod2luZG93KS5vbignbG9hZCcsZnVuY3Rpb24oKXskKCIjYWNjb3VudF9kaWFsb2ciKS5kaWFsb2coe2F1dG9PcGVuOiExLHJlc2l6YWJsZTohMCxkcmFnZ2FibGU6ITAsbW9kYWw6ITAsd2lkdGg6MzIwLGhlaWdodDoyMDAsY2xvc2U6ZnVuY3Rpb24oKXskKHRoaXMpLmh0bWwoJycpfX0pfSk7ZnVuY3Rpb24gY2xlYXJfZmllbGRTZXQoKXskKCIuYWRkcmVzcy1maWVsZCwgLmFjY291bnQtZmllbGQiKS52YWwoJycpfQpmdW5jdGlvbiBjbGVhcl9hVHlwZV9maWVsZFNldChhdCl7JCgiIyIrYWRkclR5cGVzX21hcFthdF0rIl9hZGRyZXNzX2Jsb2NrIC5hZGRyZXNzLWZpZWxkLCAjIithZGRyVHlwZXNfbWFwW2F0XSsiX2FkZHJlc3NfYmxvY2sgLmFjY291bnQtZmllbGQiKS52YWwoJycpfQpmdW5jdGlvbiB0b2dnbGVfcmVxKGZsZCl7dmFyIGNmPWFkZHIuY291bnRyeTt2YXIgY3dsPWNvdW50cmllc193aXRoX3N0YXRlczt2YXIgZmxkSXNSZXE9c3RhdGVfZmxkSXNSZXE7aWYoZmxkLmlkPT0nY291bnR5Jyl7ZmxkSXNSZXE9Y291bnR5X2ZsZElzUmVxO2N3bD1jb3VudHJpZXNfd2l0aF9jb3VudGllc30KaWYoZmxkSXNSZXE9PSJ0cnVlIiYmY3dsLmluZGV4T2YoY2YpPi0xKXskKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygnaW52YWxpZCBhbGVydCcpOyQoIiNmbGRTZXRfIitmbGQuaWQrIiBsYWJlbC5hY2N0LWxibCBpLnJlcXVpcmVkLWluZGljYXRvciIpLnNob3coKTskKCIjZmxkU2V0XyIrZmxkLmlkKyIgOmlucHV0LCAjZmxkU2V0XyIrZmxkLmlkKyIgc2VsZWN0IikuYWRkQ2xhc3MoInJlcS1mbGQiKS5hdHRyKCJhcmlhLXJlcXVpcmVkIiwhMCk7aWYoZmxkLmlkPT0ic3RhdGUiKXt0b2dnbGVfb3RoZXJTdGF0ZSgnJyk7JCgiI3N0YXRlX290aGVyIikuYXR0cigicGxhY2Vob2xkZXIiLHBsYWNlaG9sZGVyX3N0YXRlT3RoZXIpOyQoIiNzdGF0ZV9vdGhlcl9mbGQiKS5jc3MoIm1hcmdpbi10b3AiLCI0cHgiKTskKCIjc3RhdGUiKS5zaG93KCl9fWVsc2V7JCgiI2ZsZFNldF8iK2ZsZC5pZCkucmVtb3ZlQ2xhc3MoJ2ludmFsaWQgYWxlcnQnKTskKCIjZmxkU2V0XyIrZmxkLmlkKyIgbGFiZWwuYWNjdC1sYmwgaS5yZXF1aXJlZC1pbmRpY2F0b3IiKS5oaWRlKCk7JCgiI2ZsZFNldF8iK2ZsZC5pZCsiIDppbnB1dCwgI2ZsZFNldF8iK2ZsZC5pZCsiIHNlbGVjdCIpLnJlbW92ZUNsYXNzKCJyZXEtZmxkIikuYXR0cigiYXJpYS1yZXF1aXJlZCIsITEpO2lmKGZsZC5pZD09InN0YXRlIil7aWYoY3dsLmluZGV4T2YoY2YpPDApe3RvZ2dsZV9vdGhlclN0YXRlKCdvdGhlcicpOyQoIiNzdGF0ZSIpLmhpZGUoKTskKCIjc3RhdGVfb3RoZXIiKS5hdHRyKCJwbGFjZWhvbGRlciIsJycpOyQoIiNzdGF0ZV9vdGhlcl9mbGQiKS5jc3MoIm1hcmdpbi10b3AiLCIwIil9ZWxzZXt0b2dnbGVfb3RoZXJTdGF0ZSgnJyk7JCgiI3N0YXRlX290aGVyIikuYXR0cigicGxhY2Vob2xkZXIiLHBsYWNlaG9sZGVyX3N0YXRlT3RoZXIpOyQoIiNzdGF0ZV9vdGhlcl9mbGQiKS5jc3MoIm1hcmdpbi10b3AiLCI0cHgiKTskKCIjc3RhdGUiKS5zaG93KCl9fX19CnZhciBvcmlnQ291bnRyeT0nJzt2YXIgb3JpZ1N0YXRlPScnO2Z1bmN0aW9uIHNlbGVjdENvdW50cnkoY09iail7dmFyIHNmTmFtZT1jT2JqLmlkO3ZhciBzT2JqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0ZScpO2FkZHIuY291bnRyeT1jT2JqLnZhbHVlO2FkZHIuc3RhdGU9c09iai52YWx1ZTt2YXIgb1N0YXRlPSQoIiNzdGF0ZV9vdGhlciIpLnZhbCgpO2lmKG9TdGF0ZSE9InVuZGVmaW5lZCIpe2FkZHIuc3RhdGVfb3RoZXI9b1N0YXRlfQokLnBvc3QoYWNjb3VudF9hamF4X2ZpbGUse3NlbEdldDoiZ2V0U3RhdGUiLGZBY3Rpb246Zm9ybUFjdGlvbixzZWxDb3VudHJ5OmFkZHIuY291bnRyeSxzZWxTdGF0ZTphZGRyLnN0YXRlLG90aGVyU3RhdGU6YWRkci5zdGF0ZV9vdGhlcixmbGROYW1lOnNmTmFtZSxyZXFGaWxlOnJlcXVlc3RpbmdGaWxlfSxmdW5jdGlvbihkYXRhKXt2YWxpZGF0ZV9mbGRWYWwoY09iaik7JChzT2JqKS5odG1sKGRhdGEuZmllbGQpO3ZhciBzVmFsPXNPYmoudmFsdWU7dmFyIHNNaW5MZW49JChzT2JqKS5hdHRyKCdkYXRhLW1pbi1sZW5ndGgnKTt2YXIgc29WYWw9JCgiI3N0YXRlX290aGVyIikudmFsKCk7YWRkci5zdGF0ZT1zVmFsO2lmKHNWYWwhPW51bGwmJnNWYWwubGVuZ3RoPjAmJnNWYWwhPSdvdGhlcicpe2lmKG9yaWdTdGF0ZS5sZW5ndGg8MSl7b3JpZ1N0YXRlPXNWYWx9CnNlbGVjdFN0YXRlKCl9CnZhciBmbGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRlJyk7aWYoZmxkIT1udWxsJiZmbGQhPSJ1bmRlZmluZWQiJiZmbGQudmFsdWUhPSJ1bmRlZmluZWQiKXt0b2dnbGVfcmVxKGZsZCl9CnZhciBzUmVxPSQoIiNzdGF0ZSwgI3N0YXRlX290aGVyIikuaGFzQ2xhc3MoJ3JlcS1mbGQnKTtpZihzUmVxPT0hMSl7JCgiI2ZsZFNldF9zdGF0ZSIpLnJlbW92ZUNsYXNzKCJ2YWxpZCBpbnZhbGlkIGFsZXJ0Iil9ZWxzZXtpZigob3JpZ0NvdW50cnk9PWFkZHIuY291bnRyeSYmb3JpZ1N0YXRlIT1hZGRyLnN0YXRlKXx8b3JpZ0NvdW50cnkhPWFkZHIuY291bnRyeXx8YWRkci5zdGF0ZS5sZW5ndGg8MSl7aWYob3JpZ0NvdW50cnk9PWFkZHIuY291bnRyeSl7JChzT2JqKS52YWwob3JpZ1N0YXRlKTthZGRyLnN0YXRlPW9yaWdTdGF0ZX0KaWYoYWRkci5zdGF0ZS5sZW5ndGg+PXNNaW5MZW4pe2lmKG9yaWdDb3VudHJ5IT1hZGRyLmNvdW50cnkpe3ZhbGlkYXRlX2ZsZFZhbChzT2JqKX1lbHNleyQoIiNmbGRTZXRfc3RhdGUiKS5yZW1vdmVDbGFzcygiYWxlcnQgaW52YWxpZCIpLmFkZENsYXNzKCJ2YWxpZCIpfX1lbHNleyQoIiNmbGRTZXRfc3RhdGUiKS5yZW1vdmVDbGFzcygidmFsaWQgaW52YWxpZCIpLmFkZENsYXNzKCJhbGVydCIpfX19CmNoa19vazJzdWJtaXQoKTtmbGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvdW50eScpO2lmKGZsZCE9bnVsbCYmZmxkIT0idW5kZWZpbmVkIiYmZmxkLnZhbHVlIT0idW5kZWZpbmVkIil7dG9nZ2xlX3JlcShmbGQpfX0sImpzb24iKX0KZnVuY3Rpb24gdG9nZ2xlX290aGVyU3RhdGUoc3Mpe2lmKHNzIT0nb3RoZXInKXskKCIjc3RhdGVfb3RoZXIiKS5hdHRyKCduYW1lJywnc3RhdGVfb3RoZXInKS52YWwoJycpOyQoIiNzdGF0ZV9vdGhlcl9mbGQiKS5oaWRlKCk7JCgiI3N0YXRlIikuYXR0cignbmFtZScsJ3N0YXRlJyk7JCgiI3N0YXRlIikucHJvcCgnZGlzYWJsZWQnLCExKTskKCIjZmxkU2V0X3N0YXRlIikuc2hvdygpfWVsc2V7JCgiI3N0YXRlIikuYXR0cignbmFtZScsJ3N0YXRlX290aGVyJyk7JCgiI3N0YXRlX290aGVyX2ZsZCIpLnNob3coKTskKCIjc3RhdGVfb3RoZXIiKS5hdHRyKCduYW1lJywnc3RhdGUnKTskKCIjc3RhdGUiKS5wcm9wKCdkaXNhYmxlZCcsITApOyQoIiNmbGRTZXRfc3RhdGUiKS5oaWRlKCl9fQpmdW5jdGlvbiBzZWxlY3RTdGF0ZSgpe2FkZHIuc3RhdGU9JCgiI3N0YXRlIikudmFsKCk7dmFyIG9TdGF0ZT0kKCIjc3RhdGVfb3RoZXIiKS52YWwoKTtpZihvU3RhdGUhPSJ1bmRlZmluZWQiKXthZGRyLnN0YXRlX290aGVyPW9TdGF0ZX0KdG9nZ2xlX290aGVyU3RhdGUoYWRkci5zdGF0ZSl9CmZ1bmN0aW9uIHRvZ2dsZVBhc3N3b3Jkcygpe2lmKCQoIiNjcmVhdGVfYWNjb3VudCIpLmxlbmd0aD4wKXt2YXIgY2hrZD0kKCIjY3JlYXRlX2FjY291bnQiKS5wcm9wKCdjaGVja2VkJyk7Y3JlYXRlQWNjb3VudD0oY2hrZCE9MSYmZ3Vlc3RfYWxsb3dlZD09J3RydWUnPzA6MSk7aWYoY3JlYXRlQWNjb3VudD09MSl7JCgiI3Bhc3N3b3Jkc19ib3gsICNuZXdzbGV0dGVyX3NpZ251cF9zZXR0aW5nIikuc2hvdygpOyQoIiNhY2NvdW50X3N1Ym1pdDEgLnN1Ym1pdC1idXR0b24tbGFiZWwiKS5odG1sKGNyZWF0ZUFjY291bnRfYnV0dG9uVGV4dCk7JCgiI2FjY291bnRfc3VibWl0MSBzcGFuLmZhIikucmVtb3ZlQ2xhc3MoImZhLXVzZXItc2VjcmV0IikuYWRkQ2xhc3MoImZhLXVzZXItcGx1cyIpOyQoIi5wYXNzd29yZC1mbGQiKS52YWwoJycpOyQoIi5wYXNzd29yZC1mbGQiKS5wcm9wKCdkaXNhYmxlZCcsITEpOyQoIiNndWVzdF9hY2NvdW50IikudmFsKCcwJyl9ZWxzZXskKCIjcGFzc3dvcmRzX2JveCwgI25ld3NsZXR0ZXJfc2lnbnVwX3NldHRpbmciKS5oaWRlKCk7JCgiI2FjY291bnRfc3VibWl0MSAuc3VibWl0LWJ1dHRvbi1sYWJlbCIpLmh0bWwoY3JlYXRlR3Vlc3RfYnV0dG9uVGV4dCk7JCgiI2FjY291bnRfc3VibWl0MSBzcGFuLmZhIikucmVtb3ZlQ2xhc3MoImZhLXVzZXItcGx1cyIpLmFkZENsYXNzKCJmYS11c2VyLXNlY3JldCIpOyQoIi5wYXNzd29yZC1mbGQiKS52YWwoJycpOyQoIi5wYXNzd29yZC1mbGQiKS5wcm9wKCdkaXNhYmxlZCcsITApOyQoIiNndWVzdF9hY2NvdW50IikudmFsKCcxJyl9fX0KZnVuY3Rpb24gdG9nZ2xlX3NBZGRyX2VuYWJsZWQoYXQsY2Epe2lmKGF0PT0ncycpe2lmKGNhPT1hZGRySWRzLmIpeyQoIiNhZGRyZXNzX2VkaXRfZm9ybSA6aW5wdXQiKS5wcm9wKHtyZWFkb25seTohMCxkaXNhYmxlZDohMH0pO3JldHVybiExfWVsc2V7JCgiI2FkZHJlc3NfZWRpdF9mb3JtIDppbnB1dCIpLnByb3Aoe3JlYWRvbmx5OiExLGRpc2FibGVkOiExfSl9fQpyZXR1cm4hMH0KdmFyIGNob3NlQWRkcj0wO2Z1bmN0aW9uIHNob3dBZGRyRWRpdG9yKGF0LGNhKXthVHlwZT1hdDtjaG9zZUFkZHI9Y2E7Y2xvc2VFZGl0b3JzKCk7dmFyIGJhc2VBZGRyT2JqPSIjIithZGRyVHlwZXNfbWFwW2F0XSsiX2FkZHJlc3NfYmxvY2siOyQoYmFzZUFkZHJPYmorIiAuZWRpdC1idXR0b25zIikuaGlkZSgpOyQucG9zdChhY2NvdW50X2FqYXhfZmlsZSx7c2VsR2V0OiJhZGRyRWRpdEZybSIsYWRkcmVzc19pZDpjYSxhVHlwZTphdCxyZXFGaWxlOnJlcXVlc3RpbmdGaWxlfSxmdW5jdGlvbihkYXRhKXskKGJhc2VBZGRyT2JqKyIgLmFjdGlvbi1ibG9jayIpLmh0bWwoZGF0YS5hRnJtKTtvcmlnQ291bnRyeT0kKCIjY291bnRyeSIpLnZhbCgpO3ZhciBzQWRkck9uPXRvZ2dsZV9zQWRkcl9lbmFibGVkKGF0LGNhKTtpZihzQWRkck9uPT0hMCl7aW5pdF92YWxpZGF0aW9uKCl9fSwianNvbiIpfQpmdW5jdGlvbiBjbG9zZUVkaXRvcnMoKXskKCIuYWN0aW9uLWJsb2NrIikuaHRtbCgnJyk7JCgiLmVkaXQtYnV0dG9ucyIpLnNob3coKTtvcmlnQ291bnRyeT0nJztvcmlnU3RhdGU9Jyd9CmZ1bmN0aW9uIGxvYWRBZGRyZXNzKGF0LGFpZCl7YVR5cGU9YXQ7Y2hvc2VBZGRyPSQoIi5hZGRyZXNzLWNob29zZXJzOmNoZWNrZWQiKS52YWwoKTt2YXIgYmFzZUFkZHJPYmo9IiMiK2FkZHJUeXBlc19tYXBbYXRdKyJfYWRkcmVzc19ibG9jayI7JC5wb3N0KGFjY291bnRfYWpheF9maWxlLHtzZWxHZXQ6ImFkZHJFZGl0RnJtIixhVHlwZTphdCxhZGRyZXNzX2lkOmNob3NlQWRkcixyZXFGaWxlOnJlcXVlc3RpbmdGaWxlfSxmdW5jdGlvbihkYXRhKXskKGJhc2VBZGRyT2JqKyIgLmFjdGlvbi1ibG9jayIpLmh0bWwoZGF0YS5hRnJtKTt2YXIgc0FkZHJPbj10b2dnbGVfc0FkZHJfZW5hYmxlZChhdCxjaG9zZUFkZHIpO2lmKHNBZGRyT249PSEwKXtpbml0X3ZhbGlkYXRpb24oKX0KaWYoY2hvc2VBZGRyPT0wKXskKGJhc2VBZGRyT2JqKyIgLmFjdGlvbi1ibG9jayA6dGV4dCIpLnZhbCgnJyk7JCgiI2FjdGlvbiIpLnZhbCgnaW5zZXJ0Jyk7JCgiI2FkZHJlc3NfaWQiKS52YWwoJycpfWVsc2V7JCgiI2FjdGlvbiIpLnZhbCgndXBkYXRlJyk7JCgiI2FkZHJlc3NfaWQiKS52YWwoY2hvc2VBZGRyKTtpZihzQWRkck9uPT0hMCl7dmFsaWRhdGVGb3JtKCl9fQpjaGtfb2syc3VibWl0KCl9LCJqc29uIil9CmZ1bmN0aW9uIHNlbGVjdEFkZHJlc3MoYXQpe2Nob3NlQWRkcj0kKCIuYWRkcmVzcy1jaG9vc2VyczpjaGVja2VkIikudmFsKCk7dmFyIGJhc2VBZGRyT2JqPSIjIithZGRyVHlwZXNfbWFwW2F0XSsiX2FkZHJlc3NfYmxvY2siO2FkZHJJZHNbYXRdPWNob3NlQWRkcjskLnBvc3QoYWNjb3VudF9hamF4X2ZpbGUse3NlbEdldDoiYWRkclZpZXciLGFUeXBlOmF0LGFkZHJlc3NfaWQ6Y2hvc2VBZGRyLHJlcUZpbGU6cmVxdWVzdGluZ0ZpbGV9LGZ1bmN0aW9uKGRhdGEpeyQoIiNlZGl0X2FkZHJlc3NfaWQiKS52YWwoY2hvc2VBZGRyKTskKGJhc2VBZGRyT2JqKyIgLmFjdGlvbi1ibG9jayIpLmh0bWwoJycpOyQoYmFzZUFkZHJPYmorIiAudmlldy1ibG9jayIpLmh0bWwoZGF0YS5sYWJlbCk7JChiYXNlQWRkck9iaisiIC5lZGl0LWJ1dHRvbnMgYS5idG4iKS5hdHRyKCdvbmNsaWNrJywic2hvd0FkZHJFZGl0b3IoJyIrYXQrIicsICciK2Nob3NlQWRkcisiJykiKTskKGJhc2VBZGRyT2JqKyIgLmVkaXQtYnV0dG9ucyIpLnNob3coKTskKCIjIithZGRyVHlwZXNfbWFwW2F0XSsiX2FkZHJlc3NfaWQiKS52YWwoY2hvc2VBZGRyKX0sImpzb24iKTtvcmlnQ291bnRyeT0nJztvcmlnU3RhdGU9Jyd9CmZ1bmN0aW9uIHByb2Nlc3NBZGRyZXNzKGZybSxhdCl7Y2hvc2VBZGRyPSQoIi5hZGRyZXNzLWNob29zZXJzOmNoZWNrZWQiKS52YWwoKTt2YXIgYmFzZUFkZHJPYmo9IiMiK2FkZHJUeXBlc19tYXBbYXRdKyJfYWRkcmVzc19ibG9jayI7dmFyIGF0T3RoZXI9KGF0PT0ncyc/J2InOidzJyk7JC5wb3N0KGFjY291bnRfYWpheF9maWxlLHtzZWxHZXQ6ImFkZHJQcm9jIixhVHlwZTphdCxhZGRyZXNzX2lkOmNob3NlQWRkcixyZXFGaWxlOnJlcXVlc3RpbmdGaWxlLGZEYXRhOiQoIiMiK2ZybSkuc2VyaWFsaXplKCl9LGZ1bmN0aW9uKGRhdGEpe2lmKGRhdGEuYVJlcz09J2Vycm9yJyl7JChiYXNlQWRkck9iaisiIC5hY3Rpb24tYmxvY2siKS5odG1sKGRhdGEuYUZybSk7aW5pdF92YWxpZGF0aW9uKCk7dmFsaWRhdGVGb3JtKCl9ZWxzZXthZGRySWRzW2F0XT1kYXRhLmFJRDtjaG9zZUFkZHI9ZGF0YS5hSUQ7aWYoZGF0YS5hVmlldy5sZW5ndGg+MCl7JChiYXNlQWRkck9iaisiIC52aWV3LWJsb2NrIikuaHRtbChkYXRhLmFWaWV3KTtpZihhZGRySWRzW2F0XT09YWRkcklkc1thdE90aGVyXSl7JCgiIyIrYWRkclR5cGVzX21hcFthdE90aGVyXSsiX2FkZHJlc3NfYmxvY2siKyIgLnZpZXctYmxvY2siKS5odG1sKGRhdGEuYVZpZXcpfX0KJChiYXNlQWRkck9iaisiIC5hY3Rpb24tYmxvY2siKS5odG1sKCcnKTskKGJhc2VBZGRyT2JqKyIgLmVkaXQtYnV0dG9ucyBhLmJ0biIpLmF0dHIoJ29uY2xpY2snLCJzaG93QWRkckVkaXRvcignIithdCsiJywgJyIrY2hvc2VBZGRyKyInKSIpOyQoYmFzZUFkZHJPYmorIiAuZWRpdC1idXR0b25zIikuc2hvdygpOyQoIiMiK2FkZHJUeXBlc19tYXBbYXRdKyJfYWRkcmVzc19pZCIpLnZhbChjaG9zZUFkZHIpfX0sImpzb24iKS5mYWlsKGZ1bmN0aW9uKHhocix0ZXh0U3RhdHVzLGVycm9yKXtjb25zb2xlLmxvZyh4aHIuc3RhdHVzVGV4dCk7Y29uc29sZS5sb2codGV4dFN0YXR1cyl9KTtvcmlnQ291bnRyeT0nJztvcmlnU3RhdGU9Jyc7cmV0dXJuITF9CmZ1bmN0aW9uIGRyYXdfdmFsaWRhdGVFcnJvck1zZyhtc2cpe3JldHVybic8ZGl2IGlkPSJ2YWxpZGF0ZV9lcnJvcl9tc2ciPicrbXNnKyI8L2Rpdj4ifQpmdW5jdGlvbiBjYXB0Y2hhVmFsaWRhdGVkKHJlcyl7Y2FwdGNoYVZhbGlkPSEwO2Noa19vazJzdWJtaXQoKX0KZnVuY3Rpb24gY2FwdGNoYUV4cGlyZWQocmVzKXtjYXB0Y2hhVmFsaWQ9ITE7Y2hrX29rMnN1Ym1pdCgpfQpmdW5jdGlvbiB2YWxpZGF0ZUVtYWlsKGZsZCl7dmFyIGVtYWlsUGF0dGVybj0vXihbYS16MC05XSkoKFstYS16MC05Ll9dKSooW2EtejAtOV0pKSpcQChbYS16MC05XSkoKFthLXowLTktXSkqKFthLXowLTldKSkrKFwuKFthLXowLTldKShbLWEtejAtOV8tXSk/KFthLXowLTldKSspKyQvaTt2YXIgbWluTGVuPSQoZmxkKS5hdHRyKCdkYXRhLW1pbi1sZW5ndGgnKTt2TXNnPScnO2lmKGZsZC52YWx1ZS5sZW5ndGg+bWluTGVuJiZmbGQudmFsdWUubWF0Y2goZW1haWxQYXR0ZXJuKSE9bnVsbCl7JC5wb3N0KGFjY291bnRfYWpheF9maWxlLHthY3Rpb246J2Noa19lbWFpbF9leGlzdHMnLGNoa19lbWFpbDpmbGQudmFsdWV9LGZ1bmN0aW9uKGRhdGEpe2lmKGRhdGEucmVzdWx0IT0nb2snKXskKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygndmFsaWQnKS5hZGRDbGFzcygnaW52YWxpZCcpOyQoIiNhY2NvdW50X2RpYWxvZyIpLmh0bWwoZHJhd192YWxpZGF0ZUVycm9yTXNnKGRhdGEubXNnKSkuZGlhbG9nKCJvcGVuIil9ZWxzZXskKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygnaW52YWxpZCcpLmFkZENsYXNzKCd2YWxpZCcpfX0sImpzb24iKX1lbHNle3ZhciB2TXNnPWVycm9yTXNnX2ludmFsaWRfZW1haWw7aWYoZmxkLnZhbHVlLmxlbmd0aDxtaW5MZW4pe3ZNc2c9Ik11c3QgQmUgIittaW5MZW4rIiBvciBNb3JlIENoYXJhY3RlcnMifQokKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygndmFsaWQnKS5hZGRDbGFzcygnaW52YWxpZCcpOyQoIiNhY2NvdW50X2RpYWxvZyIpLmh0bWwoZHJhd192YWxpZGF0ZUVycm9yTXNnKHZNc2cpKS5kaWFsb2coIm9wZW4iKX19CmZ1bmN0aW9uIHZhbGlkYXRlX2ZsZFZhbChmbGQpe3ZhciBmUmVxPSQoZmxkKS5oYXNDbGFzcygncmVxLWZsZCcpO3ZhciBtaW5MZW49JChmbGQpLmF0dHIoJ2RhdGEtbWluLWxlbmd0aCcpO3ZhciB2TXNnPScnO2lmKGZSZXE9PSEwKXtpZihmbGQuaWQ9PSdwYXNzd29yZF9jb25maXJtJyl7dmFyIHBhc3N3ZD0kKCIjcGFzc3dvcmQiKS52YWwoKTtpZihmbGQudmFsdWUhPXBhc3N3ZCl7JCgiI2ZsZFNldF8iK2ZsZC5pZCkucmVtb3ZlQ2xhc3MoJ3ZhbGlkJykuYWRkQ2xhc3MoJ2ludmFsaWQnKTskKCIjYWNjb3VudF9kaWFsb2ciKS5odG1sKGRyYXdfdmFsaWRhdGVFcnJvck1zZyhlcnJvck1zZ19wYXNzd29yZF9taXNtYXRjaCkpLmRpYWxvZygib3BlbiIpfWVsc2V7JCgiI2ZsZFNldF8iK2ZsZC5pZCkucmVtb3ZlQ2xhc3MoJ2ludmFsaWQnKS5hZGRDbGFzcygndmFsaWQnKX19ZWxzZSBpZihmbGQuaWQ9PSdlbWFpbF9hZGRyZXNzJyl7dmFsaWRhdGVFbWFpbChmbGQpfWVsc2UgaWYoZmxkLmlkPT0nc3RhdGUnfHxmbGQuaWQ9PSdzdGF0ZV9vdGhlcicpe2lmKGZsZC5pZD09J3N0YXRlJyl7aWYoZmxkLnZhbHVlPT0nb3RoZXInKXt2YXIgX290aGVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGF0ZV9vdGhlciIpO2lmKF9vdGhlci52YWx1ZS5sZW5ndGg8bWluTGVuKXskKCIjZmxkU2V0X3N0YXRlIikucmVtb3ZlQ2xhc3MoJ3ZhbGlkIGFsZXJ0JykuYWRkQ2xhc3MoJ2FsZXJ0Jyl9ZWxzZXskKCIjZmxkU2V0X3N0YXRlIikucmVtb3ZlQ2xhc3MoJ2ludmFsaWQgYWxlcnQnKS5hZGRDbGFzcygndmFsaWQnKX19ZWxzZXtpZihmbGQudmFsdWUubGVuZ3RoPG1pbkxlbil7JCgiI2ZsZFNldF9zdGF0ZSIpLnJlbW92ZUNsYXNzKCd2YWxpZCBhbGVydCcpLmFkZENsYXNzKCdpbnZhbGlkJyk7dk1zZz0iU3RhdGUgSXMgUmVxdWlyZWQifWVsc2V7JCgiI2ZsZFNldF9zdGF0ZSIpLnJlbW92ZUNsYXNzKCdpbnZhbGlkIGFsZXJ0JykuYWRkQ2xhc3MoJ3ZhbGlkJyl9fX1lbHNle2lmKGZsZC52YWx1ZS5sZW5ndGg8bWluTGVuKXskKCIjZmxkU2V0X3N0YXRlIikucmVtb3ZlQ2xhc3MoJ3ZhbGlkIGFsZXJ0JykuYWRkQ2xhc3MoJ2ludmFsaWQnKTt2TXNnPSJNdXN0IEJlICIrbWluTGVuKyIgb3IgTW9yZSBDaGFyYWN0ZXJzIn1lbHNleyQoIiNmbGRTZXRfc3RhdGUiKS5yZW1vdmVDbGFzcygnaW52YWxpZCBhbGVydCcpLmFkZENsYXNzKCd2YWxpZCcpfX0KaWYodk1zZy5sZW5ndGg+MCl7JCgiI2FjY291bnRfZGlhbG9nIikuaHRtbChkcmF3X3ZhbGlkYXRlRXJyb3JNc2codk1zZykpLmRpYWxvZygib3BlbiIpfX1lbHNle2lmKGZsZC52YWx1ZS5sZW5ndGg8bWluTGVuKXskKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygndmFsaWQgYWxlcnQnKS5hZGRDbGFzcygnaW52YWxpZCcpO3ZNc2c9Ik11c3QgQmUgIittaW5MZW4rIiBvciBNb3JlIENoYXJhY3RlcnMiO2lmKGZsZC5pZD09J2NvdW50cnknKXt2TXNnPSJDb3VudHJ5IElzIFJlcXVpcmVkIn0KJCgiI2FjY291bnRfZGlhbG9nIikuaHRtbChkcmF3X3ZhbGlkYXRlRXJyb3JNc2codk1zZykpLmRpYWxvZygib3BlbiIpfWVsc2V7JCgiI2ZsZFNldF8iK2ZsZC5pZCkucmVtb3ZlQ2xhc3MoJ2ludmFsaWQgYWxlcnQnKS5hZGRDbGFzcygndmFsaWQnKX19fX0KZnVuY3Rpb24gY2hrX29rMnN1Ym1pdCgpe3ZhciBvMnM9InRydWUiO3ZhciBmVmFsaWQ9ITE7dmFyIGZJbnZhbGlkPSExO3ZhciBmbGQ9Jyc7dmFyIGZSZXE9ITE7dmFyIGZEaXNhYmxlZD0hMTskKCIuYWRkcmVzcy1maWVsZC1zZXQsIC5hY2NvdW50LWZpZWxkLXNldCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgY3VyRmxkPSQoIiMiK3RoaXMuaWQrIiA6aW5wdXQiKTtmRGlzYWJsZWQ9JChjdXJGbGQpLnByb3AoJ2Rpc2FibGVkJyk7ZlJlcT0kKGN1ckZsZCkuaGFzQ2xhc3MoJ3JlcS1mbGQnKTtmVmFsaWQ9JCh0aGlzKS5oYXNDbGFzcygndmFsaWQnKTtmSW52YWxpZD0kKHRoaXMpLmhhc0NsYXNzKCdpbnZhbGlkIGFsZXJ0Jyk7aWYoZkRpc2FibGVkPT0hMSYmKGZJbnZhbGlkPT0hMHx8KGZSZXE9PSEwJiZmVmFsaWQ9PSExKSkpe28ycz0iZmFsc2UifX0pO2lmKGNhcHRjaGFWYWxpZCE9ITApe28ycz0iZmFsc2UifQppZihvMnM9PSJmYWxzZSIpe31lbHNleyQoIi5zdWJtaXQtYnV0dG9ucyIpLnNob3coKX0KcmV0dXJuIG8yc30KZnVuY3Rpb24gdmFsaWRhdGVGb3JtKCl7JCgiLmFkZHJlc3MtZmllbGQtc2V0IDppbnB1dCwgLmFjY291bnQtZmllbGQtc2V0IDppbnB1dCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZktleT10aGlzLmlkLnJlcGxhY2UoJ2ZsZFNldF8nLCcnKTt2YXIgZk9iaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChmS2V5KTt2YWxpZGF0ZV9mbGRWYWwoZk9iail9KTtyZXR1cm4gY2hrX29rMnN1Ym1pdCgpfQpmdW5jdGlvbiBpbml0X3ZhbGlkYXRpb24oKXtpZigkKCcjY291bnRyeV9pZCcpLmxlbmd0aD4wKXskKCIuYWRkcmVzcy1maWVsZC1zZXQgOmlucHV0LCAuYWNjb3VudC1maWVsZC1zZXQgOmlucHV0Iikub24oImJsdXIgY2hhbmdlIixmdW5jdGlvbigpe3ZhciBmS2V5PXRoaXMuaWQucmVwbGFjZSgnZmxkU2V0XycsJycpO3ZhciBmT2JqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZLZXkpO3ZhbGlkYXRlX2ZsZFZhbChmT2JqKTtjaGtfb2syc3VibWl0KCl9KTthZGRyLmNvdW50cnk9JCgiI2NvdW50cnlfaWQiKS52YWwoKTtzZWxlY3RDb3VudHJ5KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb3VudHJ5X2lkJykpfX07aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBqUXVlcnkpdGhyb3cgbmV3IEVycm9yKCJCb290c3RyYXAncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGpRdWVyeSIpOytmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dC5mbi5qcXVlcnkuc3BsaXQoIiAiKVswXS5zcGxpdCgiLiIpO2lmKGVbMF08MiYmZVsxXTw5fHwxPT1lWzBdJiY5PT1lWzFdJiZlWzJdPDF8fGVbMF0+Myl0aHJvdyBuZXcgRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5IHZlcnNpb24gMS45LjEgb3IgaGlnaGVyLCBidXQgbG93ZXIgdGhhbiB2ZXJzaW9uIDQiKX0oalF1ZXJ5KSwrZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGUoZSxvKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49dCh0aGlzKSxzPW4uZGF0YSgiYnMubW9kYWwiKSxyPXQuZXh0ZW5kKHt9LGkuREVGQVVMVFMsbi5kYXRhKCksIm9iamVjdCI9PXR5cGVvZiBlJiZlKTtzfHxuLmRhdGEoImJzLm1vZGFsIixzPW5ldyBpKHRoaXMscikpLCJzdHJpbmciPT10eXBlb2YgZT9zW2VdKG8pOnIuc2hvdyYmcy5zaG93KG8pfSl9dmFyIGk9ZnVuY3Rpb24oZSxpKXt0aGlzLm9wdGlvbnM9aSx0aGlzLiRib2R5PXQoZG9jdW1lbnQuYm9keSksdGhpcy4kZWxlbWVudD10KGUpLHRoaXMuJGRpYWxvZz10aGlzLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1kaWFsb2ciKSx0aGlzLiRiYWNrZHJvcD1udWxsLHRoaXMuaXNTaG93bj1udWxsLHRoaXMub3JpZ2luYWxCb2R5UGFkPW51bGwsdGhpcy5zY3JvbGxiYXJXaWR0aD0wLHRoaXMuaWdub3JlQmFja2Ryb3BDbGljaz0hMSx0aGlzLmZpeGVkQ29udGVudD0iLm5hdmJhci1maXhlZC10b3AsIC5uYXZiYXItZml4ZWQtYm90dG9tIix0aGlzLm9wdGlvbnMucmVtb3RlJiZ0aGlzLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1jb250ZW50IikubG9hZCh0aGlzLm9wdGlvbnMucmVtb3RlLHQucHJveHkoZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50LnRyaWdnZXIoImxvYWRlZC5icy5tb2RhbCIpfSx0aGlzKSl9O2kuVkVSU0lPTj0iMy40LjEiLGkuVFJBTlNJVElPTl9EVVJBVElPTj0zMDAsaS5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxpLkRFRkFVTFRTPXtiYWNrZHJvcDohMCxrZXlib2FyZDohMCxzaG93OiEwfSxpLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNTaG93bj90aGlzLmhpZGUoKTp0aGlzLnNob3codCl9LGkucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oZSl7dmFyIG89dGhpcyxuPXQuRXZlbnQoInNob3cuYnMubW9kYWwiLHtyZWxhdGVkVGFyZ2V0OmV9KTt0aGlzLiRlbGVtZW50LnRyaWdnZXIobiksdGhpcy5pc1Nob3dufHxuLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwodGhpcy5pc1Nob3duPSEwLHRoaXMuY2hlY2tTY3JvbGxiYXIoKSx0aGlzLnNldFNjcm9sbGJhcigpLHRoaXMuJGJvZHkuYWRkQ2xhc3MoIm1vZGFsLW9wZW4iKSx0aGlzLmVzY2FwZSgpLHRoaXMucmVzaXplKCksdGhpcy4kZWxlbWVudC5vbigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIsJ1tkYXRhLWRpc21pc3M9Im1vZGFsIl0nLHQucHJveHkodGhpcy5oaWRlLHRoaXMpKSx0aGlzLiRkaWFsb2cub24oIm1vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsIixmdW5jdGlvbigpe28uJGVsZW1lbnQub25lKCJtb3VzZXVwLmRpc21pc3MuYnMubW9kYWwiLGZ1bmN0aW9uKGUpe3QoZS50YXJnZXQpLmlzKG8uJGVsZW1lbnQpJiYoby5pZ25vcmVCYWNrZHJvcENsaWNrPSEwKX0pfSksdGhpcy5iYWNrZHJvcChmdW5jdGlvbigpe3ZhciBuPXQuc3VwcG9ydC50cmFuc2l0aW9uJiZvLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIik7by4kZWxlbWVudC5wYXJlbnQoKS5sZW5ndGh8fG8uJGVsZW1lbnQuYXBwZW5kVG8oby4kYm9keSksby4kZWxlbWVudC5zaG93KCkuc2Nyb2xsVG9wKDApLG8uYWRqdXN0RGlhbG9nKCksbiYmby4kZWxlbWVudFswXS5vZmZzZXRXaWR0aCxvLiRlbGVtZW50LmFkZENsYXNzKCJpbiIpLG8uZW5mb3JjZUZvY3VzKCk7dmFyIHM9dC5FdmVudCgic2hvd24uYnMubW9kYWwiLHtyZWxhdGVkVGFyZ2V0OmV9KTtuP28uJGRpYWxvZy5vbmUoImJzVHJhbnNpdGlvbkVuZCIsZnVuY3Rpb24oKXtvLiRlbGVtZW50LnRyaWdnZXIoImZvY3VzIikudHJpZ2dlcihzKX0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGkuVFJBTlNJVElPTl9EVVJBVElPTik6by4kZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIpLnRyaWdnZXIocyl9KSl9LGkucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oZSl7ZSYmZS5wcmV2ZW50RGVmYXVsdCgpLGU9dC5FdmVudCgiaGlkZS5icy5tb2RhbCIpLHRoaXMuJGVsZW1lbnQudHJpZ2dlcihlKSx0aGlzLmlzU2hvd24mJiFlLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYodGhpcy5pc1Nob3duPSExLHRoaXMuZXNjYXBlKCksdGhpcy5yZXNpemUoKSx0KGRvY3VtZW50KS5vZmYoImZvY3VzaW4uYnMubW9kYWwiKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJpbiIpLm9mZigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIpLm9mZigibW91c2V1cC5kaXNtaXNzLmJzLm1vZGFsIiksdGhpcy4kZGlhbG9nLm9mZigibW91c2Vkb3duLmRpc21pc3MuYnMubW9kYWwiKSx0LnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kZWxlbWVudC5oYXNDbGFzcygiZmFkZSIpP3RoaXMuJGVsZW1lbnQub25lKCJic1RyYW5zaXRpb25FbmQiLHQucHJveHkodGhpcy5oaWRlTW9kYWwsdGhpcykpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGkuVFJBTlNJVElPTl9EVVJBVElPTik6dGhpcy5oaWRlTW9kYWwoKSl9LGkucHJvdG90eXBlLmVuZm9yY2VGb2N1cz1mdW5jdGlvbigpe3QoZG9jdW1lbnQpLm9mZigiZm9jdXNpbi5icy5tb2RhbCIpLm9uKCJmb2N1c2luLmJzLm1vZGFsIix0LnByb3h5KGZ1bmN0aW9uKHQpe2RvY3VtZW50PT09dC50YXJnZXR8fHRoaXMuJGVsZW1lbnRbMF09PT10LnRhcmdldHx8dGhpcy4kZWxlbWVudC5oYXModC50YXJnZXQpLmxlbmd0aHx8dGhpcy4kZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIpfSx0aGlzKSl9LGkucHJvdG90eXBlLmVzY2FwZT1mdW5jdGlvbigpe3RoaXMuaXNTaG93biYmdGhpcy5vcHRpb25zLmtleWJvYXJkP3RoaXMuJGVsZW1lbnQub24oImtleWRvd24uZGlzbWlzcy5icy5tb2RhbCIsdC5wcm94eShmdW5jdGlvbih0KXsyNz09dC53aGljaCYmdGhpcy5oaWRlKCl9LHRoaXMpKTp0aGlzLmlzU2hvd258fHRoaXMuJGVsZW1lbnQub2ZmKCJrZXlkb3duLmRpc21pc3MuYnMubW9kYWwiKX0saS5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKCl7dGhpcy5pc1Nob3duP3Qod2luZG93KS5vbigicmVzaXplLmJzLm1vZGFsIix0LnByb3h5KHRoaXMuaGFuZGxlVXBkYXRlLHRoaXMpKTp0KHdpbmRvdykub2ZmKCJyZXNpemUuYnMubW9kYWwiKX0saS5wcm90b3R5cGUuaGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLiRlbGVtZW50LmhpZGUoKSx0aGlzLmJhY2tkcm9wKGZ1bmN0aW9uKCl7dC4kYm9keS5yZW1vdmVDbGFzcygibW9kYWwtb3BlbiIpLHQucmVzZXRBZGp1c3RtZW50cygpLHQucmVzZXRTY3JvbGxiYXIoKSx0LiRlbGVtZW50LnRyaWdnZXIoImhpZGRlbi5icy5tb2RhbCIpfSl9LGkucHJvdG90eXBlLnJlbW92ZUJhY2tkcm9wPWZ1bmN0aW9uKCl7dGhpcy4kYmFja2Ryb3AmJnRoaXMuJGJhY2tkcm9wLnJlbW92ZSgpLHRoaXMuJGJhY2tkcm9wPW51bGx9LGkucHJvdG90eXBlLmJhY2tkcm9wPWZ1bmN0aW9uKGUpe3ZhciBvPXRoaXMsbj10aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIik/ImZhZGUiOiIiO2lmKHRoaXMuaXNTaG93biYmdGhpcy5vcHRpb25zLmJhY2tkcm9wKXt2YXIgcz10LnN1cHBvcnQudHJhbnNpdGlvbiYmbjtpZih0aGlzLiRiYWNrZHJvcD10KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5hZGRDbGFzcygibW9kYWwtYmFja2Ryb3AgIituKS5hcHBlbmRUbyh0aGlzLiRib2R5KSx0aGlzLiRlbGVtZW50Lm9uKCJjbGljay5kaXNtaXNzLmJzLm1vZGFsIix0LnByb3h5KGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2s/dm9pZCh0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2s9ITEpOnZvaWQodC50YXJnZXQ9PT10LmN1cnJlbnRUYXJnZXQmJigic3RhdGljIj09dGhpcy5vcHRpb25zLmJhY2tkcm9wP3RoaXMuJGVsZW1lbnRbMF0uZm9jdXMoKTp0aGlzLmhpZGUoKSkpfSx0aGlzKSkscyYmdGhpcy4kYmFja2Ryb3BbMF0ub2Zmc2V0V2lkdGgsdGhpcy4kYmFja2Ryb3AuYWRkQ2xhc3MoImluIiksIWUpcmV0dXJuO3M/dGhpcy4kYmFja2Ryb3Aub25lKCJic1RyYW5zaXRpb25FbmQiLGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGkuQkFDS0RST1BfVFJBTlNJVElPTl9EVVJBVElPTik6ZSgpfWVsc2UgaWYoIXRoaXMuaXNTaG93biYmdGhpcy4kYmFja2Ryb3Ape3RoaXMuJGJhY2tkcm9wLnJlbW92ZUNsYXNzKCJpbiIpO3ZhciByPWZ1bmN0aW9uKCl7by5yZW1vdmVCYWNrZHJvcCgpLGUmJmUoKX07dC5zdXBwb3J0LnRyYW5zaXRpb24mJnRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImZhZGUiKT90aGlzLiRiYWNrZHJvcC5vbmUoImJzVHJhbnNpdGlvbkVuZCIscikuZW11bGF0ZVRyYW5zaXRpb25FbmQoaS5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OKTpyKCl9ZWxzZSBlJiZlKCl9LGkucHJvdG90eXBlLmhhbmRsZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuYWRqdXN0RGlhbG9nKCl9LGkucHJvdG90eXBlLmFkanVzdERpYWxvZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuJGVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0PmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7dGhpcy4kZWxlbWVudC5jc3Moe3BhZGRpbmdMZWZ0OiF0aGlzLmJvZHlJc092ZXJmbG93aW5nJiZ0P3RoaXMuc2Nyb2xsYmFyV2lkdGg6IiIscGFkZGluZ1JpZ2h0OnRoaXMuYm9keUlzT3ZlcmZsb3dpbmcmJiF0P3RoaXMuc2Nyb2xsYmFyV2lkdGg6IiJ9KX0saS5wcm90b3R5cGUucmVzZXRBZGp1c3RtZW50cz1mdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQuY3NzKHtwYWRkaW5nTGVmdDoiIixwYWRkaW5nUmlnaHQ6IiJ9KX0saS5wcm90b3R5cGUuY2hlY2tTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgdD13aW5kb3cuaW5uZXJXaWR0aDtpZighdCl7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3Q9ZS5yaWdodC1NYXRoLmFicyhlLmxlZnQpfXRoaXMuYm9keUlzT3ZlcmZsb3dpbmc9ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDx0LHRoaXMuc2Nyb2xsYmFyV2lkdGg9dGhpcy5tZWFzdXJlU2Nyb2xsYmFyKCl9LGkucHJvdG90eXBlLnNldFNjcm9sbGJhcj1mdW5jdGlvbigpe3ZhciBlPXBhcnNlSW50KHRoaXMuJGJvZHkuY3NzKCJwYWRkaW5nLXJpZ2h0Iil8fDAsMTApO3RoaXMub3JpZ2luYWxCb2R5UGFkPWRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0fHwiIjt2YXIgaT10aGlzLnNjcm9sbGJhcldpZHRoO3RoaXMuYm9keUlzT3ZlcmZsb3dpbmcmJih0aGlzLiRib2R5LmNzcygicGFkZGluZy1yaWdodCIsZStpKSx0KHRoaXMuZml4ZWRDb250ZW50KS5lYWNoKGZ1bmN0aW9uKGUsbyl7dmFyIG49by5zdHlsZS5wYWRkaW5nUmlnaHQscz10KG8pLmNzcygicGFkZGluZy1yaWdodCIpO3QobykuZGF0YSgicGFkZGluZy1yaWdodCIsbikuY3NzKCJwYWRkaW5nLXJpZ2h0IixwYXJzZUZsb2F0KHMpK2krInB4Iil9KSl9LGkucHJvdG90eXBlLnJlc2V0U2Nyb2xsYmFyPWZ1bmN0aW9uKCl7dGhpcy4kYm9keS5jc3MoInBhZGRpbmctcmlnaHQiLHRoaXMub3JpZ2luYWxCb2R5UGFkKSx0KHRoaXMuZml4ZWRDb250ZW50KS5lYWNoKGZ1bmN0aW9uKGUsaSl7dmFyIG89dChpKS5kYXRhKCJwYWRkaW5nLXJpZ2h0Iik7dChpKS5yZW1vdmVEYXRhKCJwYWRkaW5nLXJpZ2h0IiksaS5zdHlsZS5wYWRkaW5nUmlnaHQ9bz9vOiIifSl9LGkucHJvdG90eXBlLm1lYXN1cmVTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT0ibW9kYWwtc2Nyb2xsYmFyLW1lYXN1cmUiLHRoaXMuJGJvZHkuYXBwZW5kKHQpO3ZhciBlPXQub2Zmc2V0V2lkdGgtdC5jbGllbnRXaWR0aDtyZXR1cm4gdGhpcy4kYm9keVswXS5yZW1vdmVDaGlsZCh0KSxlfTt2YXIgbz10LmZuLm1vZGFsO3QuZm4ubW9kYWw9ZSx0LmZuLm1vZGFsLkNvbnN0cnVjdG9yPWksdC5mbi5tb2RhbC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHQuZm4ubW9kYWw9byx0aGlzfSx0KGRvY3VtZW50KS5vbigiY2xpY2suYnMubW9kYWwuZGF0YS1hcGkiLCdbZGF0YS10b2dnbGU9Im1vZGFsIl0nLGZ1bmN0aW9uKGkpe3ZhciBvPXQodGhpcyksbj1vLmF0dHIoImhyZWYiKSxzPW8uYXR0cigiZGF0YS10YXJnZXQiKXx8biYmbi5yZXBsYWNlKC8uKig/PSNbXlxzXSskKS8sIiIpLHI9dChkb2N1bWVudCkuZmluZChzKSxhPXIuZGF0YSgiYnMubW9kYWwiKT8idG9nZ2xlIjp0LmV4dGVuZCh7cmVtb3RlOiEvIy8udGVzdChuKSYmbn0sci5kYXRhKCksby5kYXRhKCkpO28uaXMoImEiKSYmaS5wcmV2ZW50RGVmYXVsdCgpLHIub25lKCJzaG93LmJzLm1vZGFsIixmdW5jdGlvbih0KXt0LmlzRGVmYXVsdFByZXZlbnRlZCgpfHxyLm9uZSgiaGlkZGVuLmJzLm1vZGFsIixmdW5jdGlvbigpe28uaXMoIjp2aXNpYmxlIikmJm8udHJpZ2dlcigiZm9jdXMiKX0pfSksZS5jYWxsKHIsYSx0aGlzKX0pfShqUXVlcnkpLCtmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLGkpe3ZhciBvPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigtMSE9PXQuaW5BcnJheShvLGkpKXJldHVybi0xIT09dC5pbkFycmF5KG8scyk/Qm9vbGVhbihlLm5vZGVWYWx1ZS5tYXRjaChsKXx8ZS5ub2RlVmFsdWUubWF0Y2goaCkpOiEwO2Zvcih2YXIgbj10KGkpLmZpbHRlcihmdW5jdGlvbih0LGUpe3JldHVybiBlIGluc3RhbmNlb2YgUmVnRXhwfSkscj0wLGE9bi5sZW5ndGg7YT5yO3IrKylpZihvLm1hdGNoKG5bcl0pKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGkoaSxvLG4pe2lmKDA9PT1pLmxlbmd0aClyZXR1cm4gaTtpZihuJiYiZnVuY3Rpb24iPT10eXBlb2YgbilyZXR1cm4gbihpKTtpZighZG9jdW1lbnQuaW1wbGVtZW50YXRpb258fCFkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQpcmV0dXJuIGk7dmFyIHM9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJzYW5pdGl6YXRpb24iKTtzLmJvZHkuaW5uZXJIVE1MPWk7Zm9yKHZhciByPXQubWFwKG8sZnVuY3Rpb24odCxlKXtyZXR1cm4gZX0pLGE9dChzLmJvZHkpLmZpbmQoIioiKSxsPTAsaD1hLmxlbmd0aDtoPmw7bCsrKXt2YXIgcD1hW2xdLGQ9cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKC0xIT09dC5pbkFycmF5KGQscikpZm9yKHZhciBjPXQubWFwKHAuYXR0cmlidXRlcyxmdW5jdGlvbih0KXtyZXR1cm4gdH0pLGY9W10uY29uY2F0KG9bIioiXXx8W10sb1tkXXx8W10pLHU9MCxtPWMubGVuZ3RoO20+dTt1KyspZShjW3VdLGYpfHxwLnJlbW92ZUF0dHJpYnV0ZShjW3VdLm5vZGVOYW1lKTtlbHNlIHAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwKX1yZXR1cm4gcy5ib2R5LmlubmVySFRNTH1mdW5jdGlvbiBvKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT10KHRoaXMpLG89aS5kYXRhKCJicy50b29sdGlwIiksbj0ib2JqZWN0Ij09dHlwZW9mIGUmJmU7IW8mJi9kZXN0cm95fGhpZGUvLnRlc3QoZSl8fChvfHxpLmRhdGEoImJzLnRvb2x0aXAiLG89bmV3IHAodGhpcyxuKSksInN0cmluZyI9PXR5cGVvZiBlJiZvW2VdKCkpfSl9dmFyIG49WyJzYW5pdGl6ZSIsIndoaXRlTGlzdCIsInNhbml0aXplRm4iXSxzPVsiYmFja2dyb3VuZCIsImNpdGUiLCJocmVmIiwiaXRlbXR5cGUiLCJsb25nZGVzYyIsInBvc3RlciIsInNyYyIsInhsaW5rOmhyZWYiXSxyPS9eYXJpYS1bXHctXSokL2ksYT17IioiOlsiY2xhc3MiLCJkaXIiLCJpZCIsImxhbmciLCJyb2xlIixyXSxhOlsidGFyZ2V0IiwiaHJlZiIsInRpdGxlIiwicmVsIl0sYXJlYTpbXSxiOltdLGJyOltdLGNvbDpbXSxjb2RlOltdLGRpdjpbXSxlbTpbXSxocjpbXSxoMTpbXSxoMjpbXSxoMzpbXSxoNDpbXSxoNTpbXSxoNjpbXSxpOltdLGltZzpbInNyYyIsImFsdCIsInRpdGxlIiwid2lkdGgiLCJoZWlnaHQiXSxsaTpbXSxvbDpbXSxwOltdLHByZTpbXSxzOltdLHNtYWxsOltdLHNwYW46W10sc3ViOltdLHN1cDpbXSxzdHJvbmc6W10sdTpbXSx1bDpbXX0sbD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwfHRlbHxmaWxlKTp8W14mOi8/I10qKD86Wy8/I118JCkpL2dpLGg9L15kYXRhOig/OmltYWdlXC8oPzpibXB8Z2lmfGpwZWd8anBnfHBuZ3x0aWZmfHdlYnApfHZpZGVvXC8oPzptcGVnfG1wNHxvZ2d8d2VibSl8YXVkaW9cLyg/Om1wM3xvZ2F8b2dnfG9wdXMpKTtiYXNlNjQsW2EtejAtOSsvXSs9KiQvaSxwPWZ1bmN0aW9uKHQsZSl7dGhpcy50eXBlPW51bGwsdGhpcy5vcHRpb25zPW51bGwsdGhpcy5lbmFibGVkPW51bGwsdGhpcy50aW1lb3V0PW51bGwsdGhpcy5ob3ZlclN0YXRlPW51bGwsdGhpcy4kZWxlbWVudD1udWxsLHRoaXMuaW5TdGF0ZT1udWxsLHRoaXMuaW5pdCgidG9vbHRpcCIsdCxlKX07cC5WRVJTSU9OPSIzLjQuMSIscC5UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxwLkRFRkFVTFRTPXthbmltYXRpb246ITAscGxhY2VtZW50OiJ0b3AiLHNlbGVjdG9yOiExLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJ0b29sdGlwIiByb2xlPSJ0b29sdGlwIj48ZGl2IGNsYXNzPSJ0b29sdGlwLWFycm93Ij48L2Rpdj48ZGl2IGNsYXNzPSJ0b29sdGlwLWlubmVyIj48L2Rpdj48L2Rpdj4nLHRyaWdnZXI6ImhvdmVyIGZvY3VzIix0aXRsZToiIixkZWxheTowLGh0bWw6ITEsY29udGFpbmVyOiExLHZpZXdwb3J0OntzZWxlY3RvcjoiYm9keSIscGFkZGluZzowfSxzYW5pdGl6ZTohMCxzYW5pdGl6ZUZuOm51bGwsd2hpdGVMaXN0OmF9LHAucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oZSxpLG8pe2lmKHRoaXMuZW5hYmxlZD0hMCx0aGlzLnR5cGU9ZSx0aGlzLiRlbGVtZW50PXQoaSksdGhpcy5vcHRpb25zPXRoaXMuZ2V0T3B0aW9ucyhvKSx0aGlzLiR2aWV3cG9ydD10aGlzLm9wdGlvbnMudmlld3BvcnQmJnQoZG9jdW1lbnQpLmZpbmQodC5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy52aWV3cG9ydCk/dGhpcy5vcHRpb25zLnZpZXdwb3J0LmNhbGwodGhpcyx0aGlzLiRlbGVtZW50KTp0aGlzLm9wdGlvbnMudmlld3BvcnQuc2VsZWN0b3J8fHRoaXMub3B0aW9ucy52aWV3cG9ydCksdGhpcy5pblN0YXRlPXtjbGljazohMSxob3ZlcjohMSxmb2N1czohMX0sdGhpcy4kZWxlbWVudFswXWluc3RhbmNlb2YgZG9jdW1lbnQuY29uc3RydWN0b3ImJiF0aGlzLm9wdGlvbnMuc2VsZWN0b3IpdGhyb3cgbmV3IEVycm9yKCJgc2VsZWN0b3JgIG9wdGlvbiBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIGluaXRpYWxpemluZyAiK3RoaXMudHlwZSsiIG9uIHRoZSB3aW5kb3cuZG9jdW1lbnQgb2JqZWN0ISIpO2Zvcih2YXIgbj10aGlzLm9wdGlvbnMudHJpZ2dlci5zcGxpdCgiICIpLHM9bi5sZW5ndGg7cy0tOyl7dmFyIHI9bltzXTtpZigiY2xpY2siPT1yKXRoaXMuJGVsZW1lbnQub24oImNsaWNrLiIrdGhpcy50eXBlLHRoaXMub3B0aW9ucy5zZWxlY3Rvcix0LnByb3h5KHRoaXMudG9nZ2xlLHRoaXMpKTtlbHNlIGlmKCJtYW51YWwiIT1yKXt2YXIgYT0iaG92ZXIiPT1yPyJtb3VzZWVudGVyIjoiZm9jdXNpbiIsbD0iaG92ZXIiPT1yPyJtb3VzZWxlYXZlIjoiZm9jdXNvdXQiO3RoaXMuJGVsZW1lbnQub24oYSsiLiIrdGhpcy50eXBlLHRoaXMub3B0aW9ucy5zZWxlY3Rvcix0LnByb3h5KHRoaXMuZW50ZXIsdGhpcykpLHRoaXMuJGVsZW1lbnQub24obCsiLiIrdGhpcy50eXBlLHRoaXMub3B0aW9ucy5zZWxlY3Rvcix0LnByb3h5KHRoaXMubGVhdmUsdGhpcykpfX10aGlzLm9wdGlvbnMuc2VsZWN0b3I/dGhpcy5fb3B0aW9ucz10LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMse3RyaWdnZXI6Im1hbnVhbCIsc2VsZWN0b3I6IiJ9KTp0aGlzLmZpeFRpdGxlKCl9LHAucHJvdG90eXBlLmdldERlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHAuREVGQVVMVFN9LHAucHJvdG90eXBlLmdldE9wdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIG89dGhpcy4kZWxlbWVudC5kYXRhKCk7Zm9yKHZhciBzIGluIG8pby5oYXNPd25Qcm9wZXJ0eShzKSYmLTEhPT10LmluQXJyYXkocyxuKSYmZGVsZXRlIG9bc107cmV0dXJuIGU9dC5leHRlbmQoe30sdGhpcy5nZXREZWZhdWx0cygpLG8sZSksZS5kZWxheSYmIm51bWJlciI9PXR5cGVvZiBlLmRlbGF5JiYoZS5kZWxheT17c2hvdzplLmRlbGF5LGhpZGU6ZS5kZWxheX0pLGUuc2FuaXRpemUmJihlLnRlbXBsYXRlPWkoZS50ZW1wbGF0ZSxlLndoaXRlTGlzdCxlLnNhbml0aXplRm4pKSxlfSxwLnByb3RvdHlwZS5nZXREZWxlZ2F0ZU9wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgZT17fSxpPXRoaXMuZ2V0RGVmYXVsdHMoKTtyZXR1cm4gdGhpcy5fb3B0aW9ucyYmdC5lYWNoKHRoaXMuX29wdGlvbnMsZnVuY3Rpb24odCxvKXtpW3RdIT1vJiYoZVt0XT1vKX0pLGV9LHAucHJvdG90eXBlLmVudGVyPWZ1bmN0aW9uKGUpe3ZhciBpPWUgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2U6dChlLmN1cnJlbnRUYXJnZXQpLmRhdGEoImJzLiIrdGhpcy50eXBlKTtyZXR1cm4gaXx8KGk9bmV3IHRoaXMuY29uc3RydWN0b3IoZS5jdXJyZW50VGFyZ2V0LHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpLHQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSxpKSksZSBpbnN0YW5jZW9mIHQuRXZlbnQmJihpLmluU3RhdGVbImZvY3VzaW4iPT1lLnR5cGU/ImZvY3VzIjoiaG92ZXIiXT0hMCksaS50aXAoKS5oYXNDbGFzcygiaW4iKXx8ImluIj09aS5ob3ZlclN0YXRlP3ZvaWQoaS5ob3ZlclN0YXRlPSJpbiIpOihjbGVhclRpbWVvdXQoaS50aW1lb3V0KSxpLmhvdmVyU3RhdGU9ImluIixpLm9wdGlvbnMuZGVsYXkmJmkub3B0aW9ucy5kZWxheS5zaG93P3ZvaWQoaS50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXsiaW4iPT1pLmhvdmVyU3RhdGUmJmkuc2hvdygpfSxpLm9wdGlvbnMuZGVsYXkuc2hvdykpOmkuc2hvdygpKX0scC5wcm90b3R5cGUuaXNJblN0YXRlVHJ1ZT1mdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLmluU3RhdGUpaWYodGhpcy5pblN0YXRlW3RdKXJldHVybiEwO3JldHVybiExfSxwLnByb3RvdHlwZS5sZWF2ZT1mdW5jdGlvbihlKXt2YXIgaT1lIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9lOnQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSk7cmV0dXJuIGl8fChpPW5ldyB0aGlzLmNvbnN0cnVjdG9yKGUuY3VycmVudFRhcmdldCx0aGlzLmdldERlbGVnYXRlT3B0aW9ucygpKSx0KGUuY3VycmVudFRhcmdldCkuZGF0YSgiYnMuIit0aGlzLnR5cGUsaSkpLGUgaW5zdGFuY2VvZiB0LkV2ZW50JiYoaS5pblN0YXRlWyJmb2N1c291dCI9PWUudHlwZT8iZm9jdXMiOiJob3ZlciJdPSExKSxpLmlzSW5TdGF0ZVRydWUoKT92b2lkIDA6KGNsZWFyVGltZW91dChpLnRpbWVvdXQpLGkuaG92ZXJTdGF0ZT0ib3V0IixpLm9wdGlvbnMuZGVsYXkmJmkub3B0aW9ucy5kZWxheS5oaWRlP3ZvaWQoaS50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXsib3V0Ij09aS5ob3ZlclN0YXRlJiZpLmhpZGUoKX0saS5vcHRpb25zLmRlbGF5LmhpZGUpKTppLmhpZGUoKSl9LHAucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt2YXIgZT10LkV2ZW50KCJzaG93LmJzLiIrdGhpcy50eXBlKTtpZih0aGlzLmhhc0NvbnRlbnQoKSYmdGhpcy5lbmFibGVkKXt0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSk7dmFyIGk9dC5jb250YWlucyh0aGlzLiRlbGVtZW50WzBdLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHRoaXMuJGVsZW1lbnRbMF0pO2lmKGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fCFpKXJldHVybjt2YXIgbz10aGlzLG49dGhpcy50aXAoKSxzPXRoaXMuZ2V0VUlEKHRoaXMudHlwZSk7dGhpcy5zZXRDb250ZW50KCksbi5hdHRyKCJpZCIscyksdGhpcy4kZWxlbWVudC5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5IixzKSx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uJiZuLmFkZENsYXNzKCJmYWRlIik7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMub3B0aW9ucy5wbGFjZW1lbnQ/dGhpcy5vcHRpb25zLnBsYWNlbWVudC5jYWxsKHRoaXMsblswXSx0aGlzLiRlbGVtZW50WzBdKTp0aGlzLm9wdGlvbnMucGxhY2VtZW50LGE9L1xzP2F1dG8/XHM/L2ksbD1hLnRlc3Qocik7bCYmKHI9ci5yZXBsYWNlKGEsIiIpfHwidG9wIiksbi5kZXRhY2goKS5jc3Moe3RvcDowLGxlZnQ6MCxkaXNwbGF5OiJibG9jayJ9KS5hZGRDbGFzcyhyKS5kYXRhKCJicy4iK3RoaXMudHlwZSx0aGlzKSx0aGlzLm9wdGlvbnMuY29udGFpbmVyP24uYXBwZW5kVG8odChkb2N1bWVudCkuZmluZCh0aGlzLm9wdGlvbnMuY29udGFpbmVyKSk6bi5pbnNlcnRBZnRlcih0aGlzLiRlbGVtZW50KSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoImluc2VydGVkLmJzLiIrdGhpcy50eXBlKTt2YXIgaD10aGlzLmdldFBvc2l0aW9uKCksZD1uWzBdLm9mZnNldFdpZHRoLGM9blswXS5vZmZzZXRIZWlnaHQ7aWYobCl7dmFyIGY9cix1PXRoaXMuZ2V0UG9zaXRpb24odGhpcy4kdmlld3BvcnQpO3I9ImJvdHRvbSI9PXImJmguYm90dG9tK2M+dS5ib3R0b20/InRvcCI6InRvcCI9PXImJmgudG9wLWM8dS50b3A/ImJvdHRvbSI6InJpZ2h0Ij09ciYmaC5yaWdodCtkPnUud2lkdGg/ImxlZnQiOiJsZWZ0Ij09ciYmaC5sZWZ0LWQ8dS5sZWZ0PyJyaWdodCI6cixuLnJlbW92ZUNsYXNzKGYpLmFkZENsYXNzKHIpfXZhciBtPXRoaXMuZ2V0Q2FsY3VsYXRlZE9mZnNldChyLGgsZCxjKTt0aGlzLmFwcGx5UGxhY2VtZW50KG0scik7dmFyIGc9ZnVuY3Rpb24oKXt2YXIgdD1vLmhvdmVyU3RhdGU7by4kZWxlbWVudC50cmlnZ2VyKCJzaG93bi5icy4iK28udHlwZSksby5ob3ZlclN0YXRlPW51bGwsIm91dCI9PXQmJm8ubGVhdmUobyl9O3Quc3VwcG9ydC50cmFuc2l0aW9uJiZ0aGlzLiR0aXAuaGFzQ2xhc3MoImZhZGUiKT9uLm9uZSgiYnNUcmFuc2l0aW9uRW5kIixnKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChwLlRSQU5TSVRJT05fRFVSQVRJT04pOmcoKX19LHAucHJvdG90eXBlLmFwcGx5UGxhY2VtZW50PWZ1bmN0aW9uKGUsaSl7dmFyIG89dGhpcy50aXAoKSxuPW9bMF0ub2Zmc2V0V2lkdGgscz1vWzBdLm9mZnNldEhlaWdodCxyPXBhcnNlSW50KG8uY3NzKCJtYXJnaW4tdG9wIiksMTApLGE9cGFyc2VJbnQoby5jc3MoIm1hcmdpbi1sZWZ0IiksMTApO2lzTmFOKHIpJiYocj0wKSxpc05hTihhKSYmKGE9MCksZS50b3ArPXIsZS5sZWZ0Kz1hLHQub2Zmc2V0LnNldE9mZnNldChvWzBdLHQuZXh0ZW5kKHt1c2luZzpmdW5jdGlvbih0KXtvLmNzcyh7dG9wOk1hdGgucm91bmQodC50b3ApLGxlZnQ6TWF0aC5yb3VuZCh0LmxlZnQpfSl9fSxlKSwwKSxvLmFkZENsYXNzKCJpbiIpO3ZhciBsPW9bMF0ub2Zmc2V0V2lkdGgsaD1vWzBdLm9mZnNldEhlaWdodDsidG9wIj09aSYmaCE9cyYmKGUudG9wPWUudG9wK3MtaCk7dmFyIHA9dGhpcy5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGEoaSxlLGwsaCk7cC5sZWZ0P2UubGVmdCs9cC5sZWZ0OmUudG9wKz1wLnRvcDt2YXIgZD0vdG9wfGJvdHRvbS8udGVzdChpKSxjPWQ/MipwLmxlZnQtbitsOjIqcC50b3AtcytoLGY9ZD8ib2Zmc2V0V2lkdGgiOiJvZmZzZXRIZWlnaHQiO28ub2Zmc2V0KGUpLHRoaXMucmVwbGFjZUFycm93KGMsb1swXVtmXSxkKX0scC5wcm90b3R5cGUucmVwbGFjZUFycm93PWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmFycm93KCkuY3NzKGk/ImxlZnQiOiJ0b3AiLDUwKigxLXQvZSkrIiUiKS5jc3MoaT8idG9wIjoibGVmdCIsIiIpfSxwLnByb3RvdHlwZS5zZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50aXAoKSxlPXRoaXMuZ2V0VGl0bGUoKTt0aGlzLm9wdGlvbnMuaHRtbD8odGhpcy5vcHRpb25zLnNhbml0aXplJiYoZT1pKGUsdGhpcy5vcHRpb25zLndoaXRlTGlzdCx0aGlzLm9wdGlvbnMuc2FuaXRpemVGbikpLHQuZmluZCgiLnRvb2x0aXAtaW5uZXIiKS5odG1sKGUpKTp0LmZpbmQoIi50b29sdGlwLWlubmVyIikudGV4dChlKSx0LnJlbW92ZUNsYXNzKCJmYWRlIGluIHRvcCBib3R0b20gbGVmdCByaWdodCIpfSxwLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGkoKXsiaW4iIT1vLmhvdmVyU3RhdGUmJm4uZGV0YWNoKCksby4kZWxlbWVudCYmby4kZWxlbWVudC5yZW1vdmVBdHRyKCJhcmlhLWRlc2NyaWJlZGJ5IikudHJpZ2dlcigiaGlkZGVuLmJzLiIrby50eXBlKSxlJiZlKCl9dmFyIG89dGhpcyxuPXQodGhpcy4kdGlwKSxzPXQuRXZlbnQoImhpZGUuYnMuIit0aGlzLnR5cGUpO3JldHVybiB0aGlzLiRlbGVtZW50LnRyaWdnZXIocykscy5pc0RlZmF1bHRQcmV2ZW50ZWQoKT92b2lkIDA6KG4ucmVtb3ZlQ2xhc3MoImluIiksdC5zdXBwb3J0LnRyYW5zaXRpb24mJm4uaGFzQ2xhc3MoImZhZGUiKT9uLm9uZSgiYnNUcmFuc2l0aW9uRW5kIixpKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChwLlRSQU5TSVRJT05fRFVSQVRJT04pOmkoKSx0aGlzLmhvdmVyU3RhdGU9bnVsbCx0aGlzKX0scC5wcm90b3R5cGUuZml4VGl0bGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLiRlbGVtZW50Oyh0LmF0dHIoInRpdGxlIil8fCJzdHJpbmciIT10eXBlb2YgdC5hdHRyKCJkYXRhLW9yaWdpbmFsLXRpdGxlIikpJiZ0LmF0dHIoImRhdGEtb3JpZ2luYWwtdGl0bGUiLHQuYXR0cigidGl0bGUiKXx8IiIpLmF0dHIoInRpdGxlIiwiIil9LHAucHJvdG90eXBlLmhhc0NvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUaXRsZSgpfSxwLnByb3RvdHlwZS5nZXRQb3NpdGlvbj1mdW5jdGlvbihlKXtlPWV8fHRoaXMuJGVsZW1lbnQ7dmFyIGk9ZVswXSxvPSJCT0RZIj09aS50YWdOYW1lLG49aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtudWxsPT1uLndpZHRoJiYobj10LmV4dGVuZCh7fSxuLHt3aWR0aDpuLnJpZ2h0LW4ubGVmdCxoZWlnaHQ6bi5ib3R0b20tbi50b3B9KSk7dmFyIHM9d2luZG93LlNWR0VsZW1lbnQmJmkgaW5zdGFuY2VvZiB3aW5kb3cuU1ZHRWxlbWVudCxyPW8/e3RvcDowLGxlZnQ6MH06cz9udWxsOmUub2Zmc2V0KCksYT17c2Nyb2xsOm8/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A6ZS5zY3JvbGxUb3AoKX0sbD1vP3t3aWR0aDp0KHdpbmRvdykud2lkdGgoKSxoZWlnaHQ6dCh3aW5kb3cpLmhlaWdodCgpfTpudWxsO3JldHVybiB0LmV4dGVuZCh7fSxuLGEsbCxyKX0scC5wcm90b3R5cGUuZ2V0Q2FsY3VsYXRlZE9mZnNldD1mdW5jdGlvbih0LGUsaSxvKXtyZXR1cm4iYm90dG9tIj09dD97dG9wOmUudG9wK2UuaGVpZ2h0LGxlZnQ6ZS5sZWZ0K2Uud2lkdGgvMi1pLzJ9OiJ0b3AiPT10P3t0b3A6ZS50b3AtbyxsZWZ0OmUubGVmdCtlLndpZHRoLzItaS8yfToibGVmdCI9PXQ/e3RvcDplLnRvcCtlLmhlaWdodC8yLW8vMixsZWZ0OmUubGVmdC1pfTp7dG9wOmUudG9wK2UuaGVpZ2h0LzItby8yLGxlZnQ6ZS5sZWZ0K2Uud2lkdGh9fSxwLnByb3RvdHlwZS5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGE9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49e3RvcDowLGxlZnQ6MH07aWYoIXRoaXMuJHZpZXdwb3J0KXJldHVybiBuO3ZhciBzPXRoaXMub3B0aW9ucy52aWV3cG9ydCYmdGhpcy5vcHRpb25zLnZpZXdwb3J0LnBhZGRpbmd8fDAscj10aGlzLmdldFBvc2l0aW9uKHRoaXMuJHZpZXdwb3J0KTtpZigvcmlnaHR8bGVmdC8udGVzdCh0KSl7dmFyIGE9ZS50b3Atcy1yLnNjcm9sbCxsPWUudG9wK3Mtci5zY3JvbGwrbzthPHIudG9wP24udG9wPXIudG9wLWE6bD5yLnRvcCtyLmhlaWdodCYmKG4udG9wPXIudG9wK3IuaGVpZ2h0LWwpfWVsc2V7dmFyIGg9ZS5sZWZ0LXMscD1lLmxlZnQrcytpO2g8ci5sZWZ0P24ubGVmdD1yLmxlZnQtaDpwPnIucmlnaHQmJihuLmxlZnQ9ci5sZWZ0K3Iud2lkdGgtcCl9cmV0dXJuIG59LHAucHJvdG90eXBlLmdldFRpdGxlPWZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLiRlbGVtZW50LGk9dGhpcy5vcHRpb25zO3JldHVybiB0PWUuYXR0cigiZGF0YS1vcmlnaW5hbC10aXRsZSIpfHwoImZ1bmN0aW9uIj09dHlwZW9mIGkudGl0bGU/aS50aXRsZS5jYWxsKGVbMF0pOmkudGl0bGUpfSxwLnByb3RvdHlwZS5nZXRVSUQ9ZnVuY3Rpb24odCl7ZG8gdCs9fn4oMWU2Kk1hdGgucmFuZG9tKCkpO3doaWxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQpKTtyZXR1cm4gdH0scC5wcm90b3R5cGUudGlwPWZ1bmN0aW9uKCl7aWYoIXRoaXMuJHRpcCYmKHRoaXMuJHRpcD10KHRoaXMub3B0aW9ucy50ZW1wbGF0ZSksMSE9dGhpcy4kdGlwLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKHRoaXMudHlwZSsiIGB0ZW1wbGF0ZWAgb3B0aW9uIG11c3QgY29uc2lzdCBvZiBleGFjdGx5IDEgdG9wLWxldmVsIGVsZW1lbnQhIik7cmV0dXJuIHRoaXMuJHRpcH0scC5wcm90b3R5cGUuYXJyb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYXJyb3c9dGhpcy4kYXJyb3d8fHRoaXMudGlwKCkuZmluZCgiLnRvb2x0aXAtYXJyb3ciKX0scC5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSEwfSxwLnByb3RvdHlwZS5kaXNhYmxlPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSExfSxwLnByb3RvdHlwZS50b2dnbGVFbmFibGVkPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSF0aGlzLmVuYWJsZWR9LHAucHJvdG90eXBlLnRvZ2dsZT1mdW5jdGlvbihlKXt2YXIgaT10aGlzO2UmJihpPXQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSksaXx8KGk9bmV3IHRoaXMuY29uc3RydWN0b3IoZS5jdXJyZW50VGFyZ2V0LHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpLHQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSxpKSkpLGU/KGkuaW5TdGF0ZS5jbGljaz0haS5pblN0YXRlLmNsaWNrLGkuaXNJblN0YXRlVHJ1ZSgpP2kuZW50ZXIoaSk6aS5sZWF2ZShpKSk6aS50aXAoKS5oYXNDbGFzcygiaW4iKT9pLmxlYXZlKGkpOmkuZW50ZXIoaSl9LHAucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2NsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpLHRoaXMuaGlkZShmdW5jdGlvbigpe3QuJGVsZW1lbnQub2ZmKCIuIit0LnR5cGUpLnJlbW92ZURhdGEoImJzLiIrdC50eXBlKSx0LiR0aXAmJnQuJHRpcC5kZXRhY2goKSx0LiR0aXA9bnVsbCx0LiRhcnJvdz1udWxsLHQuJHZpZXdwb3J0PW51bGwsdC4kZWxlbWVudD1udWxsfSl9LHAucHJvdG90eXBlLnNhbml0aXplSHRtbD1mdW5jdGlvbih0KXtyZXR1cm4gaSh0LHRoaXMub3B0aW9ucy53aGl0ZUxpc3QsdGhpcy5vcHRpb25zLnNhbml0aXplRm4pfTt2YXIgZD10LmZuLnRvb2x0aXA7dC5mbi50b29sdGlwPW8sdC5mbi50b29sdGlwLkNvbnN0cnVjdG9yPXAsdC5mbi50b29sdGlwLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdC5mbi50b29sdGlwPWQsdGhpc319KGpRdWVyeSksK2Z1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbz10KHRoaXMpLG49by5kYXRhKCJicy5wb3BvdmVyIikscz0ib2JqZWN0Ij09dHlwZW9mIGUmJmU7IW4mJi9kZXN0cm95fGhpZGUvLnRlc3QoZSl8fChufHxvLmRhdGEoImJzLnBvcG92ZXIiLG49bmV3IGkodGhpcyxzKSksInN0cmluZyI9PXR5cGVvZiBlJiZuW2VdKCkpfSl9dmFyIGk9ZnVuY3Rpb24odCxlKXt0aGlzLmluaXQoInBvcG92ZXIiLHQsZSl9O2lmKCF0LmZuLnRvb2x0aXApdGhyb3cgbmV3IEVycm9yKCJQb3BvdmVyIHJlcXVpcmVzIHRvb2x0aXAuanMiKTtpLlZFUlNJT049IjMuNC4xIixpLkRFRkFVTFRTPXQuZXh0ZW5kKHt9LHQuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvci5ERUZBVUxUUyx7cGxhY2VtZW50OiJyaWdodCIsdHJpZ2dlcjoiY2xpY2siLGNvbnRlbnQ6IiIsdGVtcGxhdGU6JzxkaXYgY2xhc3M9InBvcG92ZXIiIHJvbGU9InRvb2x0aXAiPjxkaXYgY2xhc3M9ImFycm93Ij48L2Rpdj48aDMgY2xhc3M9InBvcG92ZXItdGl0bGUiPjwvaDM+PGRpdiBjbGFzcz0icG9wb3Zlci1jb250ZW50Ij48L2Rpdj48L2Rpdj4nfSksaS5wcm90b3R5cGU9dC5leHRlbmQoe30sdC5mbi50b29sdGlwLkNvbnN0cnVjdG9yLnByb3RvdHlwZSksaS5wcm90b3R5cGUuY29uc3RydWN0b3I9aSxpLnByb3RvdHlwZS5nZXREZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBpLkRFRkFVTFRTfSxpLnByb3RvdHlwZS5zZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50aXAoKSxlPXRoaXMuZ2V0VGl0bGUoKSxpPXRoaXMuZ2V0Q29udGVudCgpO2lmKHRoaXMub3B0aW9ucy5odG1sKXt2YXIgbz10eXBlb2YgaTt0aGlzLm9wdGlvbnMuc2FuaXRpemUmJihlPXRoaXMuc2FuaXRpemVIdG1sKGUpLCJzdHJpbmciPT09byYmKGk9dGhpcy5zYW5pdGl6ZUh0bWwoaSkpKSx0LmZpbmQoIi5wb3BvdmVyLXRpdGxlIikuaHRtbChlKSx0LmZpbmQoIi5wb3BvdmVyLWNvbnRlbnQiKS5jaGlsZHJlbigpLmRldGFjaCgpLmVuZCgpWyJzdHJpbmciPT09bz8iaHRtbCI6ImFwcGVuZCJdKGkpfWVsc2UgdC5maW5kKCIucG9wb3Zlci10aXRsZSIpLnRleHQoZSksdC5maW5kKCIucG9wb3Zlci1jb250ZW50IikuY2hpbGRyZW4oKS5kZXRhY2goKS5lbmQoKS50ZXh0KGkpO3QucmVtb3ZlQ2xhc3MoImZhZGUgdG9wIGJvdHRvbSBsZWZ0IHJpZ2h0IGluIiksdC5maW5kKCIucG9wb3Zlci10aXRsZSIpLmh0bWwoKXx8dC5maW5kKCIucG9wb3Zlci10aXRsZSIpLmhpZGUoKX0saS5wcm90b3R5cGUuaGFzQ29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpdGxlKCl8fHRoaXMuZ2V0Q29udGVudCgpfSxpLnByb3RvdHlwZS5nZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy4kZWxlbWVudCxlPXRoaXMub3B0aW9ucztyZXR1cm4gdC5hdHRyKCJkYXRhLWNvbnRlbnQiKXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnRlbnQ/ZS5jb250ZW50LmNhbGwodFswXSk6ZS5jb250ZW50KX0saS5wcm90b3R5cGUuYXJyb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYXJyb3c9dGhpcy4kYXJyb3d8fHRoaXMudGlwKCkuZmluZCgiLmFycm93Iil9O3ZhciBvPXQuZm4ucG9wb3Zlcjt0LmZuLnBvcG92ZXI9ZSx0LmZuLnBvcG92ZXIuQ29uc3RydWN0b3I9aSx0LmZuLnBvcG92ZXIubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiB0LmZuLnBvcG92ZXI9byx0aGlzfX0oalF1ZXJ5KTsoZnVuY3Rpb24oJCl7JCh3aW5kb3cpLm9uKCJsb2FkIixmdW5jdGlvbigpeyQoZG9jdW1lbnQpLnNjcm9sbHppcEluaXQoKTskKGRvY3VtZW50KS5yb2xsZXJJbml0KCl9KTskKHdpbmRvdykub24oImxvYWQgc2Nyb2xsIHJlc2l6ZSIsZnVuY3Rpb24oKXskKCcubnVtc2Nyb2xsZXInKS5zY3JvbGx6aXAoe3Nob3dGdW5jdGlvbjpmdW5jdGlvbigpe251bWJlclJvbGxlcigkKHRoaXMpLmF0dHIoJ2RhdGEtc2xubycpKX0sd2hvbGVWaXNpYmxlOiExLH0pfSk7JC5mbi5zY3JvbGx6aXBJbml0PWZ1bmN0aW9uKCl7JCgnYm9keScpLnByZXBlbmQoIjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmZpeGVkO3RvcDowcHg7bGVmdDowcHg7d2lkdGg6MDtoZWlnaHQ6MDsnIGlkPSdzY3JvbGx6aXBQb2ludCc+PC9kaXY+Iil9OyQuZm4ucm9sbGVySW5pdD1mdW5jdGlvbigpe3ZhciBpPTA7JCgnLm51bXNjcm9sbGVyJykuZWFjaChmdW5jdGlvbigpe2krKzskKHRoaXMpLmF0dHIoJ2RhdGEtc2xubycsaSk7JCh0aGlzKS5hZGRDbGFzcygicm9sbGVyLXRpdGxlLW51bWJlci0iK2kpfSl9OyQuZm4uc2Nyb2xsemlwPWZ1bmN0aW9uKG9wdGlvbnMpe3ZhciBzZXR0aW5ncz0kLmV4dGVuZCh7c2hvd0Z1bmN0aW9uOm51bGwsaGlkZUZ1bmN0aW9uOm51bGwsc2hvd1NoaWZ0OjAsd2hvbGVWaXNpYmxlOiExLGhpZGVTaGlmdDowLH0sb3B0aW9ucyk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpLG9iail7JCh0aGlzKS5hZGRDbGFzcygnc2Nyb2xsemlwJyk7aWYoJC5pc0Z1bmN0aW9uKHNldHRpbmdzLnNob3dGdW5jdGlvbikpe2lmKCEkKHRoaXMpLmhhc0NsYXNzKCdpc1Nob3duJykmJigkKHdpbmRvdykub3V0ZXJIZWlnaHQoKSskKCcjc2Nyb2xsemlwUG9pbnQnKS5vZmZzZXQoKS50b3Atc2V0dGluZ3Muc2hvd1NoaWZ0KT4oJCh0aGlzKS5vZmZzZXQoKS50b3ArKChzZXR0aW5ncy53aG9sZVZpc2libGUpPyQodGhpcykub3V0ZXJIZWlnaHQoKTowKSkmJigkKCcjc2Nyb2xsemlwUG9pbnQnKS5vZmZzZXQoKS50b3ArKChzZXR0aW5ncy53aG9sZVZpc2libGUpPyQodGhpcykub3V0ZXJIZWlnaHQoKTowKSk8KCQodGhpcykub3V0ZXJIZWlnaHQoKSskKHRoaXMpLm9mZnNldCgpLnRvcC1zZXR0aW5ncy5zaG93U2hpZnQpKXskKHRoaXMpLmFkZENsYXNzKCdpc1Nob3duJyk7c2V0dGluZ3Muc2hvd0Z1bmN0aW9uLmNhbGwodGhpcyl9fQppZigkLmlzRnVuY3Rpb24oc2V0dGluZ3MuaGlkZUZ1bmN0aW9uKSl7aWYoJCh0aGlzKS5oYXNDbGFzcygnaXNTaG93bicpJiYoKCQod2luZG93KS5vdXRlckhlaWdodCgpKyQoJyNzY3JvbGx6aXBQb2ludCcpLm9mZnNldCgpLnRvcC1zZXR0aW5ncy5oaWRlU2hpZnQpPCgkKHRoaXMpLm9mZnNldCgpLnRvcCsoKHNldHRpbmdzLndob2xlVmlzaWJsZSk/JCh0aGlzKS5vdXRlckhlaWdodCgpOjApKXx8KCQoJyNzY3JvbGx6aXBQb2ludCcpLm9mZnNldCgpLnRvcCsoKHNldHRpbmdzLndob2xlVmlzaWJsZSk/JCh0aGlzKS5vdXRlckhlaWdodCgpOjApKT4oJCh0aGlzKS5vdXRlckhlaWdodCgpKyQodGhpcykub2Zmc2V0KCkudG9wLXNldHRpbmdzLmhpZGVTaGlmdCkpKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdpc1Nob3duJyk7c2V0dGluZ3MuaGlkZUZ1bmN0aW9uLmNhbGwodGhpcyl9fQpyZXR1cm4gdGhpc30pfTtmdW5jdGlvbiBudW1iZXJSb2xsZXIoc2xubyl7dmFyIG1pbj0kKCcucm9sbGVyLXRpdGxlLW51bWJlci0nK3Nsbm8pLmF0dHIoJ2RhdGEtbWluJyk7dmFyIG1heD0kKCcucm9sbGVyLXRpdGxlLW51bWJlci0nK3Nsbm8pLmF0dHIoJ2RhdGEtbWF4Jyk7dmFyIHRpbWVkaWZmPSQoJy5yb2xsZXItdGl0bGUtbnVtYmVyLScrc2xubykuYXR0cignZGF0YS1kZWxheScpO3ZhciBpbmNyZW1lbnQ9JCgnLnJvbGxlci10aXRsZS1udW1iZXItJytzbG5vKS5hdHRyKCdkYXRhLWluY3JlbWVudCcpO3ZhciBudW1kaWZmPW1heC1taW47dmFyIHRpbWVvdXQ9KHRpbWVkaWZmKjEwMDApL251bWRpZmY7bnVtYmVyUm9sbChzbG5vLG1pbixtYXgsaW5jcmVtZW50LHRpbWVvdXQpfQpmdW5jdGlvbiBudW1iZXJSb2xsKHNsbm8sbWluLG1heCxpbmNyZW1lbnQsdGltZW91dCl7aWYobWluPD1tYXgpeyQoJy5yb2xsZXItdGl0bGUtbnVtYmVyLScrc2xubykuaHRtbChtaW4pO21pbj1wYXJzZUludChtaW4pK3BhcnNlSW50KGluY3JlbWVudCk7c2V0VGltZW91dChmdW5jdGlvbigpe251bWJlclJvbGwoZXZhbChzbG5vKSxldmFsKG1pbiksZXZhbChtYXgpLGV2YWwoaW5jcmVtZW50KSxldmFsKHRpbWVvdXQpKX0sdGltZW91dCl9ZWxzZXskKCcucm9sbGVyLXRpdGxlLW51bWJlci0nK3Nsbm8pLmh0bWwobWF4KX19fSkoalF1ZXJ5KTshZnVuY3Rpb24oYSxiLGMsZCl7ZnVuY3Rpb24gZShiLGMpe3RoaXMuc2V0dGluZ3M9bnVsbCx0aGlzLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyxjKSx0aGlzLiRlbGVtZW50PWEoYiksdGhpcy5faGFuZGxlcnM9e30sdGhpcy5fcGx1Z2lucz17fSx0aGlzLl9zdXByZXNzPXt9LHRoaXMuX2N1cnJlbnQ9bnVsbCx0aGlzLl9zcGVlZD1udWxsLHRoaXMuX2Nvb3JkaW5hdGVzPVtdLHRoaXMuX2JyZWFrcG9pbnQ9bnVsbCx0aGlzLl93aWR0aD1udWxsLHRoaXMuX2l0ZW1zPVtdLHRoaXMuX2Nsb25lcz1bXSx0aGlzLl9tZXJnZXJzPVtdLHRoaXMuX3dpZHRocz1bXSx0aGlzLl9pbnZhbGlkYXRlZD17fSx0aGlzLl9waXBlPVtdLHRoaXMuX2RyYWc9e3RpbWU6bnVsbCx0YXJnZXQ6bnVsbCxwb2ludGVyOm51bGwsc3RhZ2U6e3N0YXJ0Om51bGwsY3VycmVudDpudWxsfSxkaXJlY3Rpb246bnVsbH0sdGhpcy5fc3RhdGVzPXtjdXJyZW50Ont9LHRhZ3M6e2luaXRpYWxpemluZzpbImJ1c3kiXSxhbmltYXRpbmc6WyJidXN5Il0sZHJhZ2dpbmc6WyJpbnRlcmFjdGluZyJdfX0sYS5lYWNoKFsib25SZXNpemUiLCJvblRocm90dGxlZFJlc2l6ZSJdLGEucHJveHkoZnVuY3Rpb24oYixjKXt0aGlzLl9oYW5kbGVyc1tjXT1hLnByb3h5KHRoaXNbY10sdGhpcyl9LHRoaXMpKSxhLmVhY2goZS5QbHVnaW5zLGEucHJveHkoZnVuY3Rpb24oYSxiKXt0aGlzLl9wbHVnaW5zW2EuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkrYS5zbGljZSgxKV09bmV3IGIodGhpcyl9LHRoaXMpKSxhLmVhY2goZS5Xb3JrZXJzLGEucHJveHkoZnVuY3Rpb24oYixjKXt0aGlzLl9waXBlLnB1c2goe2ZpbHRlcjpjLmZpbHRlcixydW46YS5wcm94eShjLnJ1bix0aGlzKX0pfSx0aGlzKSksdGhpcy5zZXR1cCgpLHRoaXMuaW5pdGlhbGl6ZSgpfWUuRGVmYXVsdHM9e2l0ZW1zOjMsbG9vcDohMSxjZW50ZXI6ITEscmV3aW5kOiExLGNoZWNrVmlzaWJpbGl0eTohMCxtb3VzZURyYWc6ITAsdG91Y2hEcmFnOiEwLHB1bGxEcmFnOiEwLGZyZWVEcmFnOiExLG1hcmdpbjowLHN0YWdlUGFkZGluZzowLG1lcmdlOiExLG1lcmdlRml0OiEwLGF1dG9XaWR0aDohMSxzdGFydFBvc2l0aW9uOjAscnRsOiExLHNtYXJ0U3BlZWQ6MjUwLGZsdWlkU3BlZWQ6ITEsZHJhZ0VuZFNwZWVkOiExLHJlc3BvbnNpdmU6e30scmVzcG9uc2l2ZVJlZnJlc2hSYXRlOjIwMCxyZXNwb25zaXZlQmFzZUVsZW1lbnQ6YixmYWxsYmFja0Vhc2luZzoic3dpbmciLHNsaWRlVHJhbnNpdGlvbjoiIixpbmZvOiExLG5lc3RlZEl0ZW1TZWxlY3RvcjohMSxpdGVtRWxlbWVudDoiZGl2IixzdGFnZUVsZW1lbnQ6ImRpdiIscmVmcmVzaENsYXNzOiJvd2wtcmVmcmVzaCIsbG9hZGVkQ2xhc3M6Im93bC1sb2FkZWQiLGxvYWRpbmdDbGFzczoib3dsLWxvYWRpbmciLHJ0bENsYXNzOiJvd2wtcnRsIixyZXNwb25zaXZlQ2xhc3M6Im93bC1yZXNwb25zaXZlIixkcmFnQ2xhc3M6Im93bC1kcmFnIixpdGVtQ2xhc3M6Im93bC1pdGVtIixzdGFnZUNsYXNzOiJvd2wtc3RhZ2UiLHN0YWdlT3V0ZXJDbGFzczoib3dsLXN0YWdlLW91dGVyIixncmFiQ2xhc3M6Im93bC1ncmFiIn0sZS5XaWR0aD17RGVmYXVsdDoiZGVmYXVsdCIsSW5uZXI6ImlubmVyIixPdXRlcjoib3V0ZXIifSxlLlR5cGU9e0V2ZW50OiJldmVudCIsU3RhdGU6InN0YXRlIn0sZS5QbHVnaW5zPXt9LGUuV29ya2Vycz1be2ZpbHRlcjpbIndpZHRoIiwic2V0dGluZ3MiXSxydW46ZnVuY3Rpb24oKXt0aGlzLl93aWR0aD10aGlzLiRlbGVtZW50LndpZHRoKCl9fSx7ZmlsdGVyOlsid2lkdGgiLCJpdGVtcyIsInNldHRpbmdzIl0scnVuOmZ1bmN0aW9uKGEpe2EuY3VycmVudD10aGlzLl9pdGVtcyYmdGhpcy5faXRlbXNbdGhpcy5yZWxhdGl2ZSh0aGlzLl9jdXJyZW50KV19fSx7ZmlsdGVyOlsiaXRlbXMiLCJzZXR0aW5ncyJdLHJ1bjpmdW5jdGlvbigpe3RoaXMuJHN0YWdlLmNoaWxkcmVuKCIuY2xvbmVkIikucmVtb3ZlKCl9fSx7ZmlsdGVyOlsid2lkdGgiLCJpdGVtcyIsInNldHRpbmdzIl0scnVuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc2V0dGluZ3MubWFyZ2lufHwiIixjPSF0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCxkPXRoaXMuc2V0dGluZ3MucnRsLGU9e3dpZHRoOiJhdXRvIiwibWFyZ2luLWxlZnQiOmQ/YjoiIiwibWFyZ2luLXJpZ2h0IjpkPyIiOmJ9OyFjJiZ0aGlzLiRzdGFnZS5jaGlsZHJlbigpLmNzcyhlKSxhLmNzcz1lfX0se2ZpbHRlcjpbIndpZHRoIiwiaXRlbXMiLCJzZXR0aW5ncyJdLHJ1bjpmdW5jdGlvbihhKXt2YXIgYj0odGhpcy53aWR0aCgpL3RoaXMuc2V0dGluZ3MuaXRlbXMpLnRvRml4ZWQoMyktdGhpcy5zZXR0aW5ncy5tYXJnaW4sYz1udWxsLGQ9dGhpcy5faXRlbXMubGVuZ3RoLGU9IXRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoLGY9W107Zm9yKGEuaXRlbXM9e21lcmdlOiExLHdpZHRoOmJ9O2QtLTspYz10aGlzLl9tZXJnZXJzW2RdLGM9dGhpcy5zZXR0aW5ncy5tZXJnZUZpdCYmTWF0aC5taW4oYyx0aGlzLnNldHRpbmdzLml0ZW1zKXx8YyxhLml0ZW1zLm1lcmdlPWM+MXx8YS5pdGVtcy5tZXJnZSxmW2RdPWU/YipjOnRoaXMuX2l0ZW1zW2RdLndpZHRoKCk7dGhpcy5fd2lkdGhzPWZ9fSx7ZmlsdGVyOlsiaXRlbXMiLCJzZXR0aW5ncyJdLHJ1bjpmdW5jdGlvbigpe3ZhciBiPVtdLGM9dGhpcy5faXRlbXMsZD10aGlzLnNldHRpbmdzLGU9TWF0aC5tYXgoMipkLml0ZW1zLDQpLGY9MipNYXRoLmNlaWwoYy5sZW5ndGgvMiksZz1kLmxvb3AmJmMubGVuZ3RoP2QucmV3aW5kP2U6TWF0aC5tYXgoZSxmKTowLGg9IiIsaT0iIjtmb3IoZy89MjtnPjA7KWIucHVzaCh0aGlzLm5vcm1hbGl6ZShiLmxlbmd0aC8yLCEwKSksaCs9Y1tiW2IubGVuZ3RoLTFdXVswXS5vdXRlckhUTUwsYi5wdXNoKHRoaXMubm9ybWFsaXplKGMubGVuZ3RoLTEtKGIubGVuZ3RoLTEpLzIsITApKSxpPWNbYltiLmxlbmd0aC0xXV1bMF0ub3V0ZXJIVE1MK2ksZy09MTt0aGlzLl9jbG9uZXM9YixhKGgpLmFkZENsYXNzKCJjbG9uZWQiKS5hcHBlbmRUbyh0aGlzLiRzdGFnZSksYShpKS5hZGRDbGFzcygiY2xvbmVkIikucHJlcGVuZFRvKHRoaXMuJHN0YWdlKX19LHtmaWx0ZXI6WyJ3aWR0aCIsIml0ZW1zIiwic2V0dGluZ3MiXSxydW46ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5zZXR0aW5ncy5ydGw/MTotMSxiPXRoaXMuX2Nsb25lcy5sZW5ndGgrdGhpcy5faXRlbXMubGVuZ3RoLGM9LTEsZD0wLGU9MCxmPVtdOysrYzxiOylkPWZbYy0xXXx8MCxlPXRoaXMuX3dpZHRoc1t0aGlzLnJlbGF0aXZlKGMpXSt0aGlzLnNldHRpbmdzLm1hcmdpbixmLnB1c2goZCtlKmEpO3RoaXMuX2Nvb3JkaW5hdGVzPWZ9fSx7ZmlsdGVyOlsid2lkdGgiLCJpdGVtcyIsInNldHRpbmdzIl0scnVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZXR0aW5ncy5zdGFnZVBhZGRpbmcsYj10aGlzLl9jb29yZGluYXRlcyxjPXt3aWR0aDpNYXRoLmNlaWwoTWF0aC5hYnMoYltiLmxlbmd0aC0xXSkpKzIqYSwicGFkZGluZy1sZWZ0IjphfHwiIiwicGFkZGluZy1yaWdodCI6YXx8IiJ9O3RoaXMuJHN0YWdlLmNzcyhjKX19LHtmaWx0ZXI6WyJ3aWR0aCIsIml0ZW1zIiwic2V0dGluZ3MiXSxydW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoLGM9IXRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoLGQ9dGhpcy4kc3RhZ2UuY2hpbGRyZW4oKTtpZihjJiZhLml0ZW1zLm1lcmdlKWZvcig7Yi0tOylhLmNzcy53aWR0aD10aGlzLl93aWR0aHNbdGhpcy5yZWxhdGl2ZShiKV0sZC5lcShiKS5jc3MoYS5jc3MpO2Vsc2UgYyYmKGEuY3NzLndpZHRoPWEuaXRlbXMud2lkdGgsZC5jc3MoYS5jc3MpKX19LHtmaWx0ZXI6WyJpdGVtcyJdLHJ1bjpmdW5jdGlvbigpe3RoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDwxJiZ0aGlzLiRzdGFnZS5yZW1vdmVBdHRyKCJzdHlsZSIpfX0se2ZpbHRlcjpbIndpZHRoIiwiaXRlbXMiLCJzZXR0aW5ncyJdLHJ1bjpmdW5jdGlvbihhKXthLmN1cnJlbnQ9YS5jdXJyZW50P3RoaXMuJHN0YWdlLmNoaWxkcmVuKCkuaW5kZXgoYS5jdXJyZW50KTowLGEuY3VycmVudD1NYXRoLm1heCh0aGlzLm1pbmltdW0oKSxNYXRoLm1pbih0aGlzLm1heGltdW0oKSxhLmN1cnJlbnQpKSx0aGlzLnJlc2V0KGEuY3VycmVudCl9fSx7ZmlsdGVyOlsicG9zaXRpb24iXSxydW46ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGUodGhpcy5jb29yZGluYXRlcyh0aGlzLl9jdXJyZW50KSl9fSx7ZmlsdGVyOlsid2lkdGgiLCJwb3NpdGlvbiIsIml0ZW1zIiwic2V0dGluZ3MiXSxydW46ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlPXRoaXMuc2V0dGluZ3MucnRsPzE6LTEsZj0yKnRoaXMuc2V0dGluZ3Muc3RhZ2VQYWRkaW5nLGc9dGhpcy5jb29yZGluYXRlcyh0aGlzLmN1cnJlbnQoKSkrZixoPWcrdGhpcy53aWR0aCgpKmUsaT1bXTtmb3IoYz0wLGQ9dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoO2M8ZDtjKyspYT10aGlzLl9jb29yZGluYXRlc1tjLTFdfHwwLGI9TWF0aC5hYnModGhpcy5fY29vcmRpbmF0ZXNbY10pK2YqZSwodGhpcy5vcChhLCI8PSIsZykmJnRoaXMub3AoYSwiPiIsaCl8fHRoaXMub3AoYiwiPCIsZykmJnRoaXMub3AoYiwiPiIsaCkpJiZpLnB1c2goYyk7dGhpcy4kc3RhZ2UuY2hpbGRyZW4oIi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIiksdGhpcy4kc3RhZ2UuY2hpbGRyZW4oIjplcSgiK2kuam9pbigiKSwgOmVxKCIpKyIpIikuYWRkQ2xhc3MoImFjdGl2ZSIpLHRoaXMuJHN0YWdlLmNoaWxkcmVuKCIuY2VudGVyIikucmVtb3ZlQ2xhc3MoImNlbnRlciIpLHRoaXMuc2V0dGluZ3MuY2VudGVyJiZ0aGlzLiRzdGFnZS5jaGlsZHJlbigpLmVxKHRoaXMuY3VycmVudCgpKS5hZGRDbGFzcygiY2VudGVyIil9fV0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZVN0YWdlPWZ1bmN0aW9uKCl7dGhpcy4kc3RhZ2U9dGhpcy4kZWxlbWVudC5maW5kKCIuIit0aGlzLnNldHRpbmdzLnN0YWdlQ2xhc3MpLHRoaXMuJHN0YWdlLmxlbmd0aHx8KHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmxvYWRpbmdDbGFzcyksdGhpcy4kc3RhZ2U9YSgiPCIrdGhpcy5zZXR0aW5ncy5zdGFnZUVsZW1lbnQrIj4iLHtjbGFzczp0aGlzLnNldHRpbmdzLnN0YWdlQ2xhc3N9KS53cmFwKGEoIjxkaXYvPiIse2NsYXNzOnRoaXMuc2V0dGluZ3Muc3RhZ2VPdXRlckNsYXNzfSkpLHRoaXMuJGVsZW1lbnQuYXBwZW5kKHRoaXMuJHN0YWdlLnBhcmVudCgpKSl9LGUucHJvdG90eXBlLmluaXRpYWxpemVJdGVtcz1mdW5jdGlvbigpe3ZhciBiPXRoaXMuJGVsZW1lbnQuZmluZCgiLm93bC1pdGVtIik7aWYoYi5sZW5ndGgpcmV0dXJuIHRoaXMuX2l0ZW1zPWIuZ2V0KCkubWFwKGZ1bmN0aW9uKGIpe3JldHVybiBhKGIpfSksdGhpcy5fbWVyZ2Vycz10aGlzLl9pdGVtcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gMX0pLHZvaWQgdGhpcy5yZWZyZXNoKCk7dGhpcy5yZXBsYWNlKHRoaXMuJGVsZW1lbnQuY2hpbGRyZW4oKS5ub3QodGhpcy4kc3RhZ2UucGFyZW50KCkpKSx0aGlzLmlzVmlzaWJsZSgpP3RoaXMucmVmcmVzaCgpOnRoaXMuaW52YWxpZGF0ZSgid2lkdGgiKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3MpLmFkZENsYXNzKHRoaXMub3B0aW9ucy5sb2FkZWRDbGFzcyl9LGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtpZih0aGlzLmVudGVyKCJpbml0aWFsaXppbmciKSx0aGlzLnRyaWdnZXIoImluaXRpYWxpemUiKSx0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKHRoaXMuc2V0dGluZ3MucnRsQ2xhc3MsdGhpcy5zZXR0aW5ncy5ydGwpLHRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoJiYhdGhpcy5pcygicHJlLWxvYWRpbmciKSl7dmFyIGEsYixjO2E9dGhpcy4kZWxlbWVudC5maW5kKCJpbWciKSxiPXRoaXMuc2V0dGluZ3MubmVzdGVkSXRlbVNlbGVjdG9yPyIuIit0aGlzLnNldHRpbmdzLm5lc3RlZEl0ZW1TZWxlY3RvcjpkLGM9dGhpcy4kZWxlbWVudC5jaGlsZHJlbihiKS53aWR0aCgpLGEubGVuZ3RoJiZjPD0wJiZ0aGlzLnByZWxvYWRBdXRvV2lkdGhJbWFnZXMoYSl9dGhpcy5pbml0aWFsaXplU3RhZ2UoKSx0aGlzLmluaXRpYWxpemVJdGVtcygpLHRoaXMucmVnaXN0ZXJFdmVudEhhbmRsZXJzKCksdGhpcy5sZWF2ZSgiaW5pdGlhbGl6aW5nIiksdGhpcy50cmlnZ2VyKCJpbml0aWFsaXplZCIpfSxlLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5zZXR0aW5ncy5jaGVja1Zpc2liaWxpdHl8fHRoaXMuJGVsZW1lbnQuaXMoIjp2aXNpYmxlIil9LGUucHJvdG90eXBlLnNldHVwPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWV3cG9ydCgpLGM9dGhpcy5vcHRpb25zLnJlc3BvbnNpdmUsZD0tMSxlPW51bGw7Yz8oYS5lYWNoKGMsZnVuY3Rpb24oYSl7YTw9YiYmYT5kJiYoZD1OdW1iZXIoYSkpfSksZT1hLmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMsY1tkXSksImZ1bmN0aW9uIj09dHlwZW9mIGUuc3RhZ2VQYWRkaW5nJiYoZS5zdGFnZVBhZGRpbmc9ZS5zdGFnZVBhZGRpbmcoKSksZGVsZXRlIGUucmVzcG9uc2l2ZSxlLnJlc3BvbnNpdmVDbGFzcyYmdGhpcy4kZWxlbWVudC5hdHRyKCJjbGFzcyIsdGhpcy4kZWxlbWVudC5hdHRyKCJjbGFzcyIpLnJlcGxhY2UobmV3IFJlZ0V4cCgiKCIrdGhpcy5vcHRpb25zLnJlc3BvbnNpdmVDbGFzcysiLSlcXFMrXFxzIiwiZyIpLCIkMSIrZCkpKTplPWEuZXh0ZW5kKHt9LHRoaXMub3B0aW9ucyksdGhpcy50cmlnZ2VyKCJjaGFuZ2UiLHtwcm9wZXJ0eTp7bmFtZToic2V0dGluZ3MiLHZhbHVlOmV9fSksdGhpcy5fYnJlYWtwb2ludD1kLHRoaXMuc2V0dGluZ3M9ZSx0aGlzLmludmFsaWRhdGUoInNldHRpbmdzIiksdGhpcy50cmlnZ2VyKCJjaGFuZ2VkIix7cHJvcGVydHk6e25hbWU6InNldHRpbmdzIix2YWx1ZTp0aGlzLnNldHRpbmdzfX0pfSxlLnByb3RvdHlwZS5vcHRpb25zTG9naWM9ZnVuY3Rpb24oKXt0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCYmKHRoaXMuc2V0dGluZ3Muc3RhZ2VQYWRkaW5nPSExLHRoaXMuc2V0dGluZ3MubWVyZ2U9ITEpfSxlLnByb3RvdHlwZS5wcmVwYXJlPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMudHJpZ2dlcigicHJlcGFyZSIse2NvbnRlbnQ6Yn0pO3JldHVybiBjLmRhdGF8fChjLmRhdGE9YSgiPCIrdGhpcy5zZXR0aW5ncy5pdGVtRWxlbWVudCsiLz4iKS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaXRlbUNsYXNzKS5hcHBlbmQoYikpLHRoaXMudHJpZ2dlcigicHJlcGFyZWQiLHtjb250ZW50OmMuZGF0YX0pLGMuZGF0YX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTAsYz10aGlzLl9waXBlLmxlbmd0aCxkPWEucHJveHkoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXNbYV19LHRoaXMuX2ludmFsaWRhdGVkKSxlPXt9O2I8YzspKHRoaXMuX2ludmFsaWRhdGVkLmFsbHx8YS5ncmVwKHRoaXMuX3BpcGVbYl0uZmlsdGVyLGQpLmxlbmd0aD4wKSYmdGhpcy5fcGlwZVtiXS5ydW4oZSksYisrO3RoaXMuX2ludmFsaWRhdGVkPXt9LCF0aGlzLmlzKCJ2YWxpZCIpJiZ0aGlzLmVudGVyKCJ2YWxpZCIpfSxlLnByb3RvdHlwZS53aWR0aD1mdW5jdGlvbihhKXtzd2l0Y2goYT1hfHxlLldpZHRoLkRlZmF1bHQpe2Nhc2UgZS5XaWR0aC5Jbm5lcjpjYXNlIGUuV2lkdGguT3V0ZXI6cmV0dXJuIHRoaXMuX3dpZHRoO2RlZmF1bHQ6cmV0dXJuIHRoaXMuX3dpZHRoLTIqdGhpcy5zZXR0aW5ncy5zdGFnZVBhZGRpbmcrdGhpcy5zZXR0aW5ncy5tYXJnaW59fSxlLnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7dGhpcy5lbnRlcigicmVmcmVzaGluZyIpLHRoaXMudHJpZ2dlcigicmVmcmVzaCIpLHRoaXMuc2V0dXAoKSx0aGlzLm9wdGlvbnNMb2dpYygpLHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLnJlZnJlc2hDbGFzcyksdGhpcy51cGRhdGUoKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5yZWZyZXNoQ2xhc3MpLHRoaXMubGVhdmUoInJlZnJlc2hpbmciKSx0aGlzLnRyaWdnZXIoInJlZnJlc2hlZCIpfSxlLnByb3RvdHlwZS5vblRocm90dGxlZFJlc2l6ZT1mdW5jdGlvbigpe2IuY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZXIpLHRoaXMucmVzaXplVGltZXI9Yi5zZXRUaW1lb3V0KHRoaXMuX2hhbmRsZXJzLm9uUmVzaXplLHRoaXMuc2V0dGluZ3MucmVzcG9uc2l2ZVJlZnJlc2hSYXRlKX0sZS5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX2l0ZW1zLmxlbmd0aCYmKHRoaXMuX3dpZHRoIT09dGhpcy4kZWxlbWVudC53aWR0aCgpJiYoISF0aGlzLmlzVmlzaWJsZSgpJiYodGhpcy5lbnRlcigicmVzaXppbmciKSx0aGlzLnRyaWdnZXIoInJlc2l6ZSIpLmlzRGVmYXVsdFByZXZlbnRlZCgpPyh0aGlzLmxlYXZlKCJyZXNpemluZyIpLCExKToodGhpcy5pbnZhbGlkYXRlKCJ3aWR0aCIpLHRoaXMucmVmcmVzaCgpLHRoaXMubGVhdmUoInJlc2l6aW5nIiksdm9pZCB0aGlzLnRyaWdnZXIoInJlc2l6ZWQiKSkpKSl9LGUucHJvdG90eXBlLnJlZ2lzdGVyRXZlbnRIYW5kbGVycz1mdW5jdGlvbigpe2Euc3VwcG9ydC50cmFuc2l0aW9uJiZ0aGlzLiRzdGFnZS5vbihhLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQrIi5vd2wuY29yZSIsYS5wcm94eSh0aGlzLm9uVHJhbnNpdGlvbkVuZCx0aGlzKSksITEhPT10aGlzLnNldHRpbmdzLnJlc3BvbnNpdmUmJnRoaXMub24oYiwicmVzaXplIix0aGlzLl9oYW5kbGVycy5vblRocm90dGxlZFJlc2l6ZSksdGhpcy5zZXR0aW5ncy5tb3VzZURyYWcmJih0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5kcmFnQ2xhc3MpLHRoaXMuJHN0YWdlLm9uKCJtb3VzZWRvd24ub3dsLmNvcmUiLGEucHJveHkodGhpcy5vbkRyYWdTdGFydCx0aGlzKSksdGhpcy4kc3RhZ2Uub24oImRyYWdzdGFydC5vd2wuY29yZSBzZWxlY3RzdGFydC5vd2wuY29yZSIsZnVuY3Rpb24oKXtyZXR1cm4hMX0pKSx0aGlzLnNldHRpbmdzLnRvdWNoRHJhZyYmKHRoaXMuJHN0YWdlLm9uKCJ0b3VjaHN0YXJ0Lm93bC5jb3JlIixhLnByb3h5KHRoaXMub25EcmFnU3RhcnQsdGhpcykpLHRoaXMuJHN0YWdlLm9uKCJ0b3VjaGNhbmNlbC5vd2wuY29yZSIsYS5wcm94eSh0aGlzLm9uRHJhZ0VuZCx0aGlzKSkpfSxlLnByb3RvdHlwZS5vbkRyYWdTdGFydD1mdW5jdGlvbihiKXt2YXIgZD1udWxsOzMhPT1iLndoaWNoJiYoYS5zdXBwb3J0LnRyYW5zZm9ybT8oZD10aGlzLiRzdGFnZS5jc3MoInRyYW5zZm9ybSIpLnJlcGxhY2UoLy4qXCh8XCl8IC9nLCIiKS5zcGxpdCgiLCIpLGQ9e3g6ZFsxNj09PWQubGVuZ3RoPzEyOjRdLHk6ZFsxNj09PWQubGVuZ3RoPzEzOjVdfSk6KGQ9dGhpcy4kc3RhZ2UucG9zaXRpb24oKSxkPXt4OnRoaXMuc2V0dGluZ3MucnRsP2QubGVmdCt0aGlzLiRzdGFnZS53aWR0aCgpLXRoaXMud2lkdGgoKSt0aGlzLnNldHRpbmdzLm1hcmdpbjpkLmxlZnQseTpkLnRvcH0pLHRoaXMuaXMoImFuaW1hdGluZyIpJiYoYS5zdXBwb3J0LnRyYW5zZm9ybT90aGlzLmFuaW1hdGUoZC54KTp0aGlzLiRzdGFnZS5zdG9wKCksdGhpcy5pbnZhbGlkYXRlKCJwb3NpdGlvbiIpKSx0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKHRoaXMub3B0aW9ucy5ncmFiQ2xhc3MsIm1vdXNlZG93biI9PT1iLnR5cGUpLHRoaXMuc3BlZWQoMCksdGhpcy5fZHJhZy50aW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuX2RyYWcudGFyZ2V0PWEoYi50YXJnZXQpLHRoaXMuX2RyYWcuc3RhZ2Uuc3RhcnQ9ZCx0aGlzLl9kcmFnLnN0YWdlLmN1cnJlbnQ9ZCx0aGlzLl9kcmFnLnBvaW50ZXI9dGhpcy5wb2ludGVyKGIpLGEoYykub24oIm1vdXNldXAub3dsLmNvcmUgdG91Y2hlbmQub3dsLmNvcmUiLGEucHJveHkodGhpcy5vbkRyYWdFbmQsdGhpcykpLGEoYykub25lKCJtb3VzZW1vdmUub3dsLmNvcmUgdG91Y2htb3ZlLm93bC5jb3JlIixhLnByb3h5KGZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuZGlmZmVyZW5jZSh0aGlzLl9kcmFnLnBvaW50ZXIsdGhpcy5wb2ludGVyKGIpKTthKGMpLm9uKCJtb3VzZW1vdmUub3dsLmNvcmUgdG91Y2htb3ZlLm93bC5jb3JlIixhLnByb3h5KHRoaXMub25EcmFnTW92ZSx0aGlzKSksTWF0aC5hYnMoZC54KTxNYXRoLmFicyhkLnkpJiZ0aGlzLmlzKCJ2YWxpZCIpfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuZW50ZXIoImRyYWdnaW5nIiksdGhpcy50cmlnZ2VyKCJkcmFnIikpfSx0aGlzKSkpfSxlLnByb3RvdHlwZS5vbkRyYWdNb3ZlPWZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGQ9bnVsbCxlPXRoaXMuZGlmZmVyZW5jZSh0aGlzLl9kcmFnLnBvaW50ZXIsdGhpcy5wb2ludGVyKGEpKSxmPXRoaXMuZGlmZmVyZW5jZSh0aGlzLl9kcmFnLnN0YWdlLnN0YXJ0LGUpO3RoaXMuaXMoImRyYWdnaW5nIikmJihhLnByZXZlbnREZWZhdWx0KCksdGhpcy5zZXR0aW5ncy5sb29wPyhiPXRoaXMuY29vcmRpbmF0ZXModGhpcy5taW5pbXVtKCkpLGM9dGhpcy5jb29yZGluYXRlcyh0aGlzLm1heGltdW0oKSsxKS1iLGYueD0oKGYueC1iKSVjK2MpJWMrYik6KGI9dGhpcy5zZXR0aW5ncy5ydGw/dGhpcy5jb29yZGluYXRlcyh0aGlzLm1heGltdW0oKSk6dGhpcy5jb29yZGluYXRlcyh0aGlzLm1pbmltdW0oKSksYz10aGlzLnNldHRpbmdzLnJ0bD90aGlzLmNvb3JkaW5hdGVzKHRoaXMubWluaW11bSgpKTp0aGlzLmNvb3JkaW5hdGVzKHRoaXMubWF4aW11bSgpKSxkPXRoaXMuc2V0dGluZ3MucHVsbERyYWc/LTEqZS54LzU6MCxmLng9TWF0aC5tYXgoTWF0aC5taW4oZi54LGIrZCksYytkKSksdGhpcy5fZHJhZy5zdGFnZS5jdXJyZW50PWYsdGhpcy5hbmltYXRlKGYueCkpfSxlLnByb3RvdHlwZS5vbkRyYWdFbmQ9ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5kaWZmZXJlbmNlKHRoaXMuX2RyYWcucG9pbnRlcix0aGlzLnBvaW50ZXIoYikpLGU9dGhpcy5fZHJhZy5zdGFnZS5jdXJyZW50LGY9ZC54PjBedGhpcy5zZXR0aW5ncy5ydGw/ImxlZnQiOiJyaWdodCI7YShjKS5vZmYoIi5vd2wuY29yZSIpLHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmdyYWJDbGFzcyksKDAhPT1kLngmJnRoaXMuaXMoImRyYWdnaW5nIil8fCF0aGlzLmlzKCJ2YWxpZCIpKSYmKHRoaXMuc3BlZWQodGhpcy5zZXR0aW5ncy5kcmFnRW5kU3BlZWR8fHRoaXMuc2V0dGluZ3Muc21hcnRTcGVlZCksdGhpcy5jdXJyZW50KHRoaXMuY2xvc2VzdChlLngsMCE9PWQueD9mOnRoaXMuX2RyYWcuZGlyZWN0aW9uKSksdGhpcy5pbnZhbGlkYXRlKCJwb3NpdGlvbiIpLHRoaXMudXBkYXRlKCksdGhpcy5fZHJhZy5kaXJlY3Rpb249ZiwoTWF0aC5hYnMoZC54KT4zfHwobmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9kcmFnLnRpbWU+MzAwKSYmdGhpcy5fZHJhZy50YXJnZXQub25lKCJjbGljay5vd2wuY29yZSIsZnVuY3Rpb24oKXtyZXR1cm4hMX0pKSx0aGlzLmlzKCJkcmFnZ2luZyIpJiYodGhpcy5sZWF2ZSgiZHJhZ2dpbmciKSx0aGlzLnRyaWdnZXIoImRyYWdnZWQiKSl9LGUucHJvdG90eXBlLmNsb3Nlc3Q9ZnVuY3Rpb24oYixjKXt2YXIgZT0tMSxmPTMwLGc9dGhpcy53aWR0aCgpLGg9dGhpcy5jb29yZGluYXRlcygpO3JldHVybiB0aGlzLnNldHRpbmdzLmZyZWVEcmFnfHxhLmVhY2goaCxhLnByb3h5KGZ1bmN0aW9uKGEsaSl7cmV0dXJuImxlZnQiPT09YyYmYj5pLWYmJmI8aStmP2U9YToicmlnaHQiPT09YyYmYj5pLWctZiYmYjxpLWcrZj9lPWErMTp0aGlzLm9wKGIsIjwiLGkpJiZ0aGlzLm9wKGIsIj4iLGhbYSsxXSE9PWQ/aFthKzFdOmktZykmJihlPSJsZWZ0Ij09PWM/YSsxOmEpLC0xPT09ZX0sdGhpcykpLHRoaXMuc2V0dGluZ3MubG9vcHx8KHRoaXMub3AoYiwiPiIsaFt0aGlzLm1pbmltdW0oKV0pP2U9Yj10aGlzLm1pbmltdW0oKTp0aGlzLm9wKGIsIjwiLGhbdGhpcy5tYXhpbXVtKCldKSYmKGU9Yj10aGlzLm1heGltdW0oKSkpLGV9LGUucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5zcGVlZCgpPjA7dGhpcy5pcygiYW5pbWF0aW5nIikmJnRoaXMub25UcmFuc2l0aW9uRW5kKCksYyYmKHRoaXMuZW50ZXIoImFuaW1hdGluZyIpLHRoaXMudHJpZ2dlcigidHJhbnNsYXRlIikpLGEuc3VwcG9ydC50cmFuc2Zvcm0zZCYmYS5zdXBwb3J0LnRyYW5zaXRpb24/dGhpcy4kc3RhZ2UuY3NzKHt0cmFuc2Zvcm06InRyYW5zbGF0ZTNkKCIrYisicHgsMHB4LDBweCkiLHRyYW5zaXRpb246dGhpcy5zcGVlZCgpLzFlMysicyIrKHRoaXMuc2V0dGluZ3Muc2xpZGVUcmFuc2l0aW9uPyIgIit0aGlzLnNldHRpbmdzLnNsaWRlVHJhbnNpdGlvbjoiIil9KTpjP3RoaXMuJHN0YWdlLmFuaW1hdGUoe2xlZnQ6YisicHgifSx0aGlzLnNwZWVkKCksdGhpcy5zZXR0aW5ncy5mYWxsYmFja0Vhc2luZyxhLnByb3h5KHRoaXMub25UcmFuc2l0aW9uRW5kLHRoaXMpKTp0aGlzLiRzdGFnZS5jc3Moe2xlZnQ6YisicHgifSl9LGUucHJvdG90eXBlLmlzPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zdGF0ZXMuY3VycmVudFthXSYmdGhpcy5fc3RhdGVzLmN1cnJlbnRbYV0+MH0sZS5wcm90b3R5cGUuY3VycmVudD1mdW5jdGlvbihhKXtpZihhPT09ZClyZXR1cm4gdGhpcy5fY3VycmVudDtpZigwPT09dGhpcy5faXRlbXMubGVuZ3RoKXJldHVybiBkO2lmKGE9dGhpcy5ub3JtYWxpemUoYSksdGhpcy5fY3VycmVudCE9PWEpe3ZhciBiPXRoaXMudHJpZ2dlcigiY2hhbmdlIix7cHJvcGVydHk6e25hbWU6InBvc2l0aW9uIix2YWx1ZTphfX0pO2IuZGF0YSE9PWQmJihhPXRoaXMubm9ybWFsaXplKGIuZGF0YSkpLHRoaXMuX2N1cnJlbnQ9YSx0aGlzLmludmFsaWRhdGUoInBvc2l0aW9uIiksdGhpcy50cmlnZ2VyKCJjaGFuZ2VkIix7cHJvcGVydHk6e25hbWU6InBvc2l0aW9uIix2YWx1ZTp0aGlzLl9jdXJyZW50fX0pfXJldHVybiB0aGlzLl9jdXJyZW50fSxlLnByb3RvdHlwZS5pbnZhbGlkYXRlPWZ1bmN0aW9uKGIpe3JldHVybiJzdHJpbmciPT09YS50eXBlKGIpJiYodGhpcy5faW52YWxpZGF0ZWRbYl09ITAsdGhpcy5pcygidmFsaWQiKSYmdGhpcy5sZWF2ZSgidmFsaWQiKSksYS5tYXAodGhpcy5faW52YWxpZGF0ZWQsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYn0pfSxlLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbihhKXsoYT10aGlzLm5vcm1hbGl6ZShhKSkhPT1kJiYodGhpcy5fc3BlZWQ9MCx0aGlzLl9jdXJyZW50PWEsdGhpcy5zdXBwcmVzcyhbInRyYW5zbGF0ZSIsInRyYW5zbGF0ZWQiXSksdGhpcy5hbmltYXRlKHRoaXMuY29vcmRpbmF0ZXMoYSkpLHRoaXMucmVsZWFzZShbInRyYW5zbGF0ZSIsInRyYW5zbGF0ZWQiXSkpfSxlLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9pdGVtcy5sZW5ndGgsZT1iPzA6dGhpcy5fY2xvbmVzLmxlbmd0aDtyZXR1cm4hdGhpcy5pc051bWVyaWMoYSl8fGM8MT9hPWQ6KGE8MHx8YT49YytlKSYmKGE9KChhLWUvMiklYytjKSVjK2UvMiksYX0sZS5wcm90b3R5cGUucmVsYXRpdmU9ZnVuY3Rpb24oYSl7cmV0dXJuIGEtPXRoaXMuX2Nsb25lcy5sZW5ndGgvMix0aGlzLm5vcm1hbGl6ZShhLCEwKX0sZS5wcm90b3R5cGUubWF4aW11bT1mdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzLnNldHRpbmdzLGY9dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoO2lmKGUubG9vcClmPXRoaXMuX2Nsb25lcy5sZW5ndGgvMit0aGlzLl9pdGVtcy5sZW5ndGgtMTtlbHNlIGlmKGUuYXV0b1dpZHRofHxlLm1lcmdlKXtpZihiPXRoaXMuX2l0ZW1zLmxlbmd0aClmb3IoYz10aGlzLl9pdGVtc1stLWJdLndpZHRoKCksZD10aGlzLiRlbGVtZW50LndpZHRoKCk7Yi0tJiYhKChjKz10aGlzLl9pdGVtc1tiXS53aWR0aCgpK3RoaXMuc2V0dGluZ3MubWFyZ2luKT5kKTspO2Y9YisxfWVsc2UgZj1lLmNlbnRlcj90aGlzLl9pdGVtcy5sZW5ndGgtMTp0aGlzLl9pdGVtcy5sZW5ndGgtZS5pdGVtcztyZXR1cm4gYSYmKGYtPXRoaXMuX2Nsb25lcy5sZW5ndGgvMiksTWF0aC5tYXgoZiwwKX0sZS5wcm90b3R5cGUubWluaW11bT1mdW5jdGlvbihhKXtyZXR1cm4gYT8wOnRoaXMuX2Nsb25lcy5sZW5ndGgvMn0sZS5wcm90b3R5cGUuaXRlbXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1kP3RoaXMuX2l0ZW1zLnNsaWNlKCk6KGE9dGhpcy5ub3JtYWxpemUoYSwhMCksdGhpcy5faXRlbXNbYV0pfSxlLnByb3RvdHlwZS5tZXJnZXJzPWZ1bmN0aW9uKGEpe3JldHVybiBhPT09ZD90aGlzLl9tZXJnZXJzLnNsaWNlKCk6KGE9dGhpcy5ub3JtYWxpemUoYSwhMCksdGhpcy5fbWVyZ2Vyc1thXSl9LGUucHJvdG90eXBlLmNsb25lcz1mdW5jdGlvbihiKXt2YXIgYz10aGlzLl9jbG9uZXMubGVuZ3RoLzIsZT1jK3RoaXMuX2l0ZW1zLmxlbmd0aCxmPWZ1bmN0aW9uKGEpe3JldHVybiBhJTI9PTA/ZSthLzI6Yy0oYSsxKS8yfTtyZXR1cm4gYj09PWQ/YS5tYXAodGhpcy5fY2xvbmVzLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGYoYil9KTphLm1hcCh0aGlzLl9jbG9uZXMsZnVuY3Rpb24oYSxjKXtyZXR1cm4gYT09PWI/ZihjKTpudWxsfSl9LGUucHJvdG90eXBlLnNwZWVkPWZ1bmN0aW9uKGEpe3JldHVybiBhIT09ZCYmKHRoaXMuX3NwZWVkPWEpLHRoaXMuX3NwZWVkfSxlLnByb3RvdHlwZS5jb29yZGluYXRlcz1mdW5jdGlvbihiKXt2YXIgYyxlPTEsZj1iLTE7cmV0dXJuIGI9PT1kP2EubWFwKHRoaXMuX2Nvb3JkaW5hdGVzLGEucHJveHkoZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5jb29yZGluYXRlcyhiKX0sdGhpcykpOih0aGlzLnNldHRpbmdzLmNlbnRlcj8odGhpcy5zZXR0aW5ncy5ydGwmJihlPS0xLGY9YisxKSxjPXRoaXMuX2Nvb3JkaW5hdGVzW2JdLGMrPSh0aGlzLndpZHRoKCktYysodGhpcy5fY29vcmRpbmF0ZXNbZl18fDApKS8yKmUpOmM9dGhpcy5fY29vcmRpbmF0ZXNbZl18fDAsYz1NYXRoLmNlaWwoYykpfSxlLnByb3RvdHlwZS5kdXJhdGlvbj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIDA9PT1jPzA6TWF0aC5taW4oTWF0aC5tYXgoTWF0aC5hYnMoYi1hKSwxKSw2KSpNYXRoLmFicyhjfHx0aGlzLnNldHRpbmdzLnNtYXJ0U3BlZWQpfSxlLnByb3RvdHlwZS50bz1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY3VycmVudCgpLGQ9bnVsbCxlPWEtdGhpcy5yZWxhdGl2ZShjKSxmPShlPjApLShlPDApLGc9dGhpcy5faXRlbXMubGVuZ3RoLGg9dGhpcy5taW5pbXVtKCksaT10aGlzLm1heGltdW0oKTt0aGlzLnNldHRpbmdzLmxvb3A/KCF0aGlzLnNldHRpbmdzLnJld2luZCYmTWF0aC5hYnMoZSk+Zy8yJiYoZSs9LTEqZipnKSxhPWMrZSwoZD0oKGEtaCklZytnKSVnK2gpIT09YSYmZC1lPD1pJiZkLWU+MCYmKGM9ZC1lLGE9ZCx0aGlzLnJlc2V0KGMpKSk6dGhpcy5zZXR0aW5ncy5yZXdpbmQ/KGkrPTEsYT0oYSVpK2kpJWkpOmE9TWF0aC5tYXgoaCxNYXRoLm1pbihpLGEpKSx0aGlzLnNwZWVkKHRoaXMuZHVyYXRpb24oYyxhLGIpKSx0aGlzLmN1cnJlbnQoYSksdGhpcy5pc1Zpc2libGUoKSYmdGhpcy51cGRhdGUoKX0sZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbihhKXthPWF8fCExLHRoaXMudG8odGhpcy5yZWxhdGl2ZSh0aGlzLmN1cnJlbnQoKSkrMSxhKX0sZS5wcm90b3R5cGUucHJldj1mdW5jdGlvbihhKXthPWF8fCExLHRoaXMudG8odGhpcy5yZWxhdGl2ZSh0aGlzLmN1cnJlbnQoKSktMSxhKX0sZS5wcm90b3R5cGUub25UcmFuc2l0aW9uRW5kPWZ1bmN0aW9uKGEpe2lmKGEhPT1kJiYoYS5zdG9wUHJvcGFnYXRpb24oKSwoYS50YXJnZXR8fGEuc3JjRWxlbWVudHx8YS5vcmlnaW5hbFRhcmdldCkhPT10aGlzLiRzdGFnZS5nZXQoMCkpKXJldHVybiExO3RoaXMubGVhdmUoImFuaW1hdGluZyIpLHRoaXMudHJpZ2dlcigidHJhbnNsYXRlZCIpfSxlLnByb3RvdHlwZS52aWV3cG9ydD1mdW5jdGlvbigpe3ZhciBkO3JldHVybiB0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZUJhc2VFbGVtZW50IT09Yj9kPWEodGhpcy5vcHRpb25zLnJlc3BvbnNpdmVCYXNlRWxlbWVudCkud2lkdGgoKTpiLmlubmVyV2lkdGg/ZD1iLmlubmVyV2lkdGg6Yy5kb2N1bWVudEVsZW1lbnQmJmMuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoP2Q9Yy5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6Y29uc29sZS53YXJuKCJDYW4gbm90IGRldGVjdCB2aWV3cG9ydCB3aWR0aC4iKSxkfSxlLnByb3RvdHlwZS5yZXBsYWNlPWZ1bmN0aW9uKGIpe3RoaXMuJHN0YWdlLmVtcHR5KCksdGhpcy5faXRlbXM9W10sYiYmKGI9YiBpbnN0YW5jZW9mIGpRdWVyeT9iOmEoYikpLHRoaXMuc2V0dGluZ3MubmVzdGVkSXRlbVNlbGVjdG9yJiYoYj1iLmZpbmQoIi4iK3RoaXMuc2V0dGluZ3MubmVzdGVkSXRlbVNlbGVjdG9yKSksYi5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMubm9kZVR5cGV9KS5lYWNoKGEucHJveHkoZnVuY3Rpb24oYSxiKXtiPXRoaXMucHJlcGFyZShiKSx0aGlzLiRzdGFnZS5hcHBlbmQoYiksdGhpcy5faXRlbXMucHVzaChiKSx0aGlzLl9tZXJnZXJzLnB1c2goMSpiLmZpbmQoIltkYXRhLW1lcmdlXSIpLmFkZEJhY2soIltkYXRhLW1lcmdlXSIpLmF0dHIoImRhdGEtbWVyZ2UiKXx8MSl9LHRoaXMpKSx0aGlzLnJlc2V0KHRoaXMuaXNOdW1lcmljKHRoaXMuc2V0dGluZ3Muc3RhcnRQb3NpdGlvbik/dGhpcy5zZXR0aW5ncy5zdGFydFBvc2l0aW9uOjApLHRoaXMuaW52YWxpZGF0ZSgiaXRlbXMiKX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGIsYyl7dmFyIGU9dGhpcy5yZWxhdGl2ZSh0aGlzLl9jdXJyZW50KTtjPWM9PT1kP3RoaXMuX2l0ZW1zLmxlbmd0aDp0aGlzLm5vcm1hbGl6ZShjLCEwKSxiPWIgaW5zdGFuY2VvZiBqUXVlcnk/YjphKGIpLHRoaXMudHJpZ2dlcigiYWRkIix7Y29udGVudDpiLHBvc2l0aW9uOmN9KSxiPXRoaXMucHJlcGFyZShiKSwwPT09dGhpcy5faXRlbXMubGVuZ3RofHxjPT09dGhpcy5faXRlbXMubGVuZ3RoPygwPT09dGhpcy5faXRlbXMubGVuZ3RoJiZ0aGlzLiRzdGFnZS5hcHBlbmQoYiksMCE9PXRoaXMuX2l0ZW1zLmxlbmd0aCYmdGhpcy5faXRlbXNbYy0xXS5hZnRlcihiKSx0aGlzLl9pdGVtcy5wdXNoKGIpLHRoaXMuX21lcmdlcnMucHVzaCgxKmIuZmluZCgiW2RhdGEtbWVyZ2VdIikuYWRkQmFjaygiW2RhdGEtbWVyZ2VdIikuYXR0cigiZGF0YS1tZXJnZSIpfHwxKSk6KHRoaXMuX2l0ZW1zW2NdLmJlZm9yZShiKSx0aGlzLl9pdGVtcy5zcGxpY2UoYywwLGIpLHRoaXMuX21lcmdlcnMuc3BsaWNlKGMsMCwxKmIuZmluZCgiW2RhdGEtbWVyZ2VdIikuYWRkQmFjaygiW2RhdGEtbWVyZ2VdIikuYXR0cigiZGF0YS1tZXJnZSIpfHwxKSksdGhpcy5faXRlbXNbZV0mJnRoaXMucmVzZXQodGhpcy5faXRlbXNbZV0uaW5kZXgoKSksdGhpcy5pbnZhbGlkYXRlKCJpdGVtcyIpLHRoaXMudHJpZ2dlcigiYWRkZWQiLHtjb250ZW50OmIscG9zaXRpb246Y30pfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oYSl7KGE9dGhpcy5ub3JtYWxpemUoYSwhMCkpIT09ZCYmKHRoaXMudHJpZ2dlcigicmVtb3ZlIix7Y29udGVudDp0aGlzLl9pdGVtc1thXSxwb3NpdGlvbjphfSksdGhpcy5faXRlbXNbYV0ucmVtb3ZlKCksdGhpcy5faXRlbXMuc3BsaWNlKGEsMSksdGhpcy5fbWVyZ2Vycy5zcGxpY2UoYSwxKSx0aGlzLmludmFsaWRhdGUoIml0ZW1zIiksdGhpcy50cmlnZ2VyKCJyZW1vdmVkIix7Y29udGVudDpudWxsLHBvc2l0aW9uOmF9KSl9LGUucHJvdG90eXBlLnByZWxvYWRBdXRvV2lkdGhJbWFnZXM9ZnVuY3Rpb24oYil7Yi5lYWNoKGEucHJveHkoZnVuY3Rpb24oYixjKXt0aGlzLmVudGVyKCJwcmUtbG9hZGluZyIpLGM9YShjKSxhKG5ldyBJbWFnZSkub25lKCJsb2FkIixhLnByb3h5KGZ1bmN0aW9uKGEpe2MuYXR0cigic3JjIixhLnRhcmdldC5zcmMpLGMuY3NzKCJvcGFjaXR5IiwxKSx0aGlzLmxlYXZlKCJwcmUtbG9hZGluZyIpLCF0aGlzLmlzKCJwcmUtbG9hZGluZyIpJiYhdGhpcy5pcygiaW5pdGlhbGl6aW5nIikmJnRoaXMucmVmcmVzaCgpfSx0aGlzKSkuYXR0cigic3JjIixjLmF0dHIoInNyYyIpfHxjLmF0dHIoImRhdGEtc3JjIil8fGMuYXR0cigiZGF0YS1zcmMtcmV0aW5hIikpfSx0aGlzKSl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50Lm9mZigiLm93bC5jb3JlIiksdGhpcy4kc3RhZ2Uub2ZmKCIub3dsLmNvcmUiKSxhKGMpLm9mZigiLm93bC5jb3JlIiksITEhPT10aGlzLnNldHRpbmdzLnJlc3BvbnNpdmUmJihiLmNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVyKSx0aGlzLm9mZihiLCJyZXNpemUiLHRoaXMuX2hhbmRsZXJzLm9uVGhyb3R0bGVkUmVzaXplKSk7Zm9yKHZhciBkIGluIHRoaXMuX3BsdWdpbnMpdGhpcy5fcGx1Z2luc1tkXS5kZXN0cm95KCk7dGhpcy4kc3RhZ2UuY2hpbGRyZW4oIi5jbG9uZWQiKS5yZW1vdmUoKSx0aGlzLiRzdGFnZS51bndyYXAoKSx0aGlzLiRzdGFnZS5jaGlsZHJlbigpLmNvbnRlbnRzKCkudW53cmFwKCksdGhpcy4kc3RhZ2UuY2hpbGRyZW4oKS51bndyYXAoKSx0aGlzLiRzdGFnZS5yZW1vdmUoKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5yZWZyZXNoQ2xhc3MpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3MpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sb2FkZWRDbGFzcykucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLnJ0bENsYXNzKS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuZHJhZ0NsYXNzKS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuZ3JhYkNsYXNzKS5hdHRyKCJjbGFzcyIsdGhpcy4kZWxlbWVudC5hdHRyKCJjbGFzcyIpLnJlcGxhY2UobmV3IFJlZ0V4cCh0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZUNsYXNzKyItXFxTK1xccyIsImciKSwiIikpLnJlbW92ZURhdGEoIm93bC5jYXJvdXNlbCIpfSxlLnByb3RvdHlwZS5vcD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5zZXR0aW5ncy5ydGw7c3dpdGNoKGIpe2Nhc2UiPCI6cmV0dXJuIGQ/YT5jOmE8YztjYXNlIj4iOnJldHVybiBkP2E8YzphPmM7Y2FzZSI+PSI6cmV0dXJuIGQ/YTw9YzphPj1jO2Nhc2UiPD0iOnJldHVybiBkP2E+PWM6YTw9Y319LGUucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGEsYixjLGQpe2EuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLGQpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitiLGMpfSxlLnByb3RvdHlwZS5vZmY9ZnVuY3Rpb24oYSxiLGMsZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyP2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsZCk6YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYyl9LGUucHJvdG90eXBlLnRyaWdnZXI9ZnVuY3Rpb24oYixjLGQsZixnKXt2YXIgaD17aXRlbTp7Y291bnQ6dGhpcy5faXRlbXMubGVuZ3RoLGluZGV4OnRoaXMuY3VycmVudCgpfX0saT1hLmNhbWVsQ2FzZShhLmdyZXAoWyJvbiIsYixkXSxmdW5jdGlvbihhKXtyZXR1cm4gYX0pLmpvaW4oIi0iKS50b0xvd2VyQ2FzZSgpKSxqPWEuRXZlbnQoW2IsIm93bCIsZHx8ImNhcm91c2VsIl0uam9pbigiLiIpLnRvTG93ZXJDYXNlKCksYS5leHRlbmQoe3JlbGF0ZWRUYXJnZXQ6dGhpc30saCxjKSk7cmV0dXJuIHRoaXMuX3N1cHJlc3NbYl18fChhLmVhY2godGhpcy5fcGx1Z2lucyxmdW5jdGlvbihhLGIpe2Iub25UcmlnZ2VyJiZiLm9uVHJpZ2dlcihqKX0pLHRoaXMucmVnaXN0ZXIoe3R5cGU6ZS5UeXBlLkV2ZW50LG5hbWU6Yn0pLHRoaXMuJGVsZW1lbnQudHJpZ2dlcihqKSx0aGlzLnNldHRpbmdzJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5zZXR0aW5nc1tpXSYmdGhpcy5zZXR0aW5nc1tpXS5jYWxsKHRoaXMsaikpLGp9LGUucHJvdG90eXBlLmVudGVyPWZ1bmN0aW9uKGIpe2EuZWFjaChbYl0uY29uY2F0KHRoaXMuX3N0YXRlcy50YWdzW2JdfHxbXSksYS5wcm94eShmdW5jdGlvbihhLGIpe3RoaXMuX3N0YXRlcy5jdXJyZW50W2JdPT09ZCYmKHRoaXMuX3N0YXRlcy5jdXJyZW50W2JdPTApLHRoaXMuX3N0YXRlcy5jdXJyZW50W2JdKyt9LHRoaXMpKX0sZS5wcm90b3R5cGUubGVhdmU9ZnVuY3Rpb24oYil7YS5lYWNoKFtiXS5jb25jYXQodGhpcy5fc3RhdGVzLnRhZ3NbYl18fFtdKSxhLnByb3h5KGZ1bmN0aW9uKGEsYil7dGhpcy5fc3RhdGVzLmN1cnJlbnRbYl0tLX0sdGhpcykpfSxlLnByb3RvdHlwZS5yZWdpc3Rlcj1mdW5jdGlvbihiKXtpZihiLnR5cGU9PT1lLlR5cGUuRXZlbnQpe2lmKGEuZXZlbnQuc3BlY2lhbFtiLm5hbWVdfHwoYS5ldmVudC5zcGVjaWFsW2IubmFtZV09e30pLCFhLmV2ZW50LnNwZWNpYWxbYi5uYW1lXS5vd2wpe3ZhciBjPWEuZXZlbnQuc3BlY2lhbFtiLm5hbWVdLl9kZWZhdWx0O2EuZXZlbnQuc3BlY2lhbFtiLm5hbWVdLl9kZWZhdWx0PWZ1bmN0aW9uKGEpe3JldHVybiFjfHwhYy5hcHBseXx8YS5uYW1lc3BhY2UmJi0xIT09YS5uYW1lc3BhY2UuaW5kZXhPZigib3dsIik/YS5uYW1lc3BhY2UmJmEubmFtZXNwYWNlLmluZGV4T2YoIm93bCIpPi0xOmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhLmV2ZW50LnNwZWNpYWxbYi5uYW1lXS5vd2w9ITB9fWVsc2UgYi50eXBlPT09ZS5UeXBlLlN0YXRlJiYodGhpcy5fc3RhdGVzLnRhZ3NbYi5uYW1lXT90aGlzLl9zdGF0ZXMudGFnc1tiLm5hbWVdPXRoaXMuX3N0YXRlcy50YWdzW2IubmFtZV0uY29uY2F0KGIudGFncyk6dGhpcy5fc3RhdGVzLnRhZ3NbYi5uYW1lXT1iLnRhZ3MsdGhpcy5fc3RhdGVzLnRhZ3NbYi5uYW1lXT1hLmdyZXAodGhpcy5fc3RhdGVzLnRhZ3NbYi5uYW1lXSxhLnByb3h5KGZ1bmN0aW9uKGMsZCl7cmV0dXJuIGEuaW5BcnJheShjLHRoaXMuX3N0YXRlcy50YWdzW2IubmFtZV0pPT09ZH0sdGhpcykpKX0sZS5wcm90b3R5cGUuc3VwcHJlc3M9ZnVuY3Rpb24oYil7YS5lYWNoKGIsYS5wcm94eShmdW5jdGlvbihhLGIpe3RoaXMuX3N1cHJlc3NbYl09ITB9LHRoaXMpKX0sZS5wcm90b3R5cGUucmVsZWFzZT1mdW5jdGlvbihiKXthLmVhY2goYixhLnByb3h5KGZ1bmN0aW9uKGEsYil7ZGVsZXRlIHRoaXMuX3N1cHJlc3NbYl19LHRoaXMpKX0sZS5wcm90b3R5cGUucG9pbnRlcj1mdW5jdGlvbihhKXt2YXIgYz17eDpudWxsLHk6bnVsbH07cmV0dXJuIGE9YS5vcmlnaW5hbEV2ZW50fHxhfHxiLmV2ZW50LGE9YS50b3VjaGVzJiZhLnRvdWNoZXMubGVuZ3RoP2EudG91Y2hlc1swXTphLmNoYW5nZWRUb3VjaGVzJiZhLmNoYW5nZWRUb3VjaGVzLmxlbmd0aD9hLmNoYW5nZWRUb3VjaGVzWzBdOmEsYS5wYWdlWD8oYy54PWEucGFnZVgsYy55PWEucGFnZVkpOihjLng9YS5jbGllbnRYLGMueT1hLmNsaWVudFkpLGN9LGUucHJvdG90eXBlLmlzTnVtZXJpYz1mdW5jdGlvbihhKXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdChhKSl9LGUucHJvdG90eXBlLmRpZmZlcmVuY2U9ZnVuY3Rpb24oYSxiKXtyZXR1cm57eDphLngtYi54LHk6YS55LWIueX19LGEuZm4ub3dsQ2Fyb3VzZWw9ZnVuY3Rpb24oYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hKHRoaXMpLGY9ZC5kYXRhKCJvd2wuY2Fyb3VzZWwiKTtmfHwoZj1uZXcgZSh0aGlzLCJvYmplY3QiPT10eXBlb2YgYiYmYiksZC5kYXRhKCJvd2wuY2Fyb3VzZWwiLGYpLGEuZWFjaChbIm5leHQiLCJwcmV2IiwidG8iLCJkZXN0cm95IiwicmVmcmVzaCIsInJlcGxhY2UiLCJhZGQiLCJyZW1vdmUiXSxmdW5jdGlvbihiLGMpe2YucmVnaXN0ZXIoe3R5cGU6ZS5UeXBlLkV2ZW50LG5hbWU6Y30pLGYuJGVsZW1lbnQub24oYysiLm93bC5jYXJvdXNlbC5jb3JlIixhLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZhLnJlbGF0ZWRUYXJnZXQhPT10aGlzJiYodGhpcy5zdXBwcmVzcyhbY10pLGZbY10uYXBwbHkodGhpcyxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSksdGhpcy5yZWxlYXNlKFtjXSkpfSxmKSl9KSksInN0cmluZyI9PXR5cGVvZiBiJiYiXyIhPT1iLmNoYXJBdCgwKSYmZltiXS5hcHBseShmLGMpfSl9LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3I9ZX0od2luZG93LlplcHRvfHx3aW5kb3cualF1ZXJ5LHdpbmRvdyxkb2N1bWVudCksZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYil7dGhpcy5fY29yZT1iLHRoaXMuX2ludGVydmFsPW51bGwsdGhpcy5fdmlzaWJsZT1udWxsLHRoaXMuX2hhbmRsZXJzPXsiaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9SZWZyZXNoJiZ0aGlzLndhdGNoKCl9LHRoaXMpfSx0aGlzLl9jb3JlLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyx0aGlzLl9jb3JlLm9wdGlvbnMpLHRoaXMuX2NvcmUuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpfTtlLkRlZmF1bHRzPXthdXRvUmVmcmVzaDohMCxhdXRvUmVmcmVzaEludGVydmFsOjUwMH0sZS5wcm90b3R5cGUud2F0Y2g9ZnVuY3Rpb24oKXt0aGlzLl9pbnRlcnZhbHx8KHRoaXMuX3Zpc2libGU9dGhpcy5fY29yZS5pc1Zpc2libGUoKSx0aGlzLl9pbnRlcnZhbD1iLnNldEludGVydmFsKGEucHJveHkodGhpcy5yZWZyZXNoLHRoaXMpLHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b1JlZnJlc2hJbnRlcnZhbCkpfSxlLnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7dGhpcy5fY29yZS5pc1Zpc2libGUoKSE9PXRoaXMuX3Zpc2libGUmJih0aGlzLl92aXNpYmxlPSF0aGlzLl92aXNpYmxlLHRoaXMuX2NvcmUuJGVsZW1lbnQudG9nZ2xlQ2xhc3MoIm93bC1oaWRkZW4iLCF0aGlzLl92aXNpYmxlKSx0aGlzLl92aXNpYmxlJiZ0aGlzLl9jb3JlLmludmFsaWRhdGUoIndpZHRoIikmJnRoaXMuX2NvcmUucmVmcmVzaCgpKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhLGM7Yi5jbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKTtmb3IoYSBpbiB0aGlzLl9oYW5kbGVycyl0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihhLHRoaXMuX2hhbmRsZXJzW2FdKTtmb3IoYyBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkiZnVuY3Rpb24iIT10eXBlb2YgdGhpc1tjXSYmKHRoaXNbY109bnVsbCl9LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5BdXRvUmVmcmVzaD1lfSh3aW5kb3cuWmVwdG98fHdpbmRvdy5qUXVlcnksd2luZG93LGRvY3VtZW50KSxmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mdW5jdGlvbihiKXt0aGlzLl9jb3JlPWIsdGhpcy5fbG9hZGVkPVtdLHRoaXMuX2hhbmRsZXJzPXsiaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsIGNoYW5nZS5vd2wuY2Fyb3VzZWwgcmVzaXplZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYil7aWYoYi5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuc2V0dGluZ3MmJnRoaXMuX2NvcmUuc2V0dGluZ3MubGF6eUxvYWQmJihiLnByb3BlcnR5JiYicG9zaXRpb24iPT1iLnByb3BlcnR5Lm5hbWV8fCJpbml0aWFsaXplZCI9PWIudHlwZSkpe3ZhciBjPXRoaXMuX2NvcmUuc2V0dGluZ3MsZT1jLmNlbnRlciYmTWF0aC5jZWlsKGMuaXRlbXMvMil8fGMuaXRlbXMsZj1jLmNlbnRlciYmLTEqZXx8MCxnPShiLnByb3BlcnR5JiZiLnByb3BlcnR5LnZhbHVlIT09ZD9iLnByb3BlcnR5LnZhbHVlOnRoaXMuX2NvcmUuY3VycmVudCgpKStmLGg9dGhpcy5fY29yZS5jbG9uZXMoKS5sZW5ndGgsaT1hLnByb3h5KGZ1bmN0aW9uKGEsYil7dGhpcy5sb2FkKGIpfSx0aGlzKTtmb3IoYy5sYXp5TG9hZEVhZ2VyPjAmJihlKz1jLmxhenlMb2FkRWFnZXIsYy5sb29wJiYoZy09Yy5sYXp5TG9hZEVhZ2VyLGUrKykpO2YrKzxlOyl0aGlzLmxvYWQoaC8yK3RoaXMuX2NvcmUucmVsYXRpdmUoZykpLGgmJmEuZWFjaCh0aGlzLl9jb3JlLmNsb25lcyh0aGlzLl9jb3JlLnJlbGF0aXZlKGcpKSxpKSxnKyt9fSx0aGlzKX0sdGhpcy5fY29yZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuRGVmYXVsdHMsdGhpcy5fY29yZS5vcHRpb25zKSx0aGlzLl9jb3JlLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKX07ZS5EZWZhdWx0cz17bGF6eUxvYWQ6ITEsbGF6eUxvYWRFYWdlcjowfSxlLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGMpe3ZhciBkPXRoaXMuX2NvcmUuJHN0YWdlLmNoaWxkcmVuKCkuZXEoYyksZT1kJiZkLmZpbmQoIi5vd2wtbGF6eSIpOyFlfHxhLmluQXJyYXkoZC5nZXQoMCksdGhpcy5fbG9hZGVkKT4tMXx8KGUuZWFjaChhLnByb3h5KGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hKGQpLGc9Yi5kZXZpY2VQaXhlbFJhdGlvPjEmJmYuYXR0cigiZGF0YS1zcmMtcmV0aW5hIil8fGYuYXR0cigiZGF0YS1zcmMiKXx8Zi5hdHRyKCJkYXRhLXNyY3NldCIpO3RoaXMuX2NvcmUudHJpZ2dlcigibG9hZCIse2VsZW1lbnQ6Zix1cmw6Z30sImxhenkiKSxmLmlzKCJpbWciKT9mLm9uZSgibG9hZC5vd2wubGF6eSIsYS5wcm94eShmdW5jdGlvbigpe2YuY3NzKCJvcGFjaXR5IiwxKSx0aGlzLl9jb3JlLnRyaWdnZXIoImxvYWRlZCIse2VsZW1lbnQ6Zix1cmw6Z30sImxhenkiKX0sdGhpcykpLmF0dHIoInNyYyIsZyk6Zi5pcygic291cmNlIik/Zi5vbmUoImxvYWQub3dsLmxhenkiLGEucHJveHkoZnVuY3Rpb24oKXt0aGlzLl9jb3JlLnRyaWdnZXIoImxvYWRlZCIse2VsZW1lbnQ6Zix1cmw6Z30sImxhenkiKX0sdGhpcykpLmF0dHIoInNyY3NldCIsZyk6KGU9bmV3IEltYWdlLGUub25sb2FkPWEucHJveHkoZnVuY3Rpb24oKXtmLmNzcyh7ImJhY2tncm91bmQtaW1hZ2UiOid1cmwoIicrZysnIiknLG9wYWNpdHk6IjEifSksdGhpcy5fY29yZS50cmlnZ2VyKCJsb2FkZWQiLHtlbGVtZW50OmYsdXJsOmd9LCJsYXp5Iil9LHRoaXMpLGUuc3JjPWcpfSx0aGlzKSksdGhpcy5fbG9hZGVkLnB1c2goZC5nZXQoMCkpKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhLGI7Zm9yKGEgaW4gdGhpcy5oYW5kbGVycyl0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihhLHRoaXMuaGFuZGxlcnNbYV0pO2ZvcihiIGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzW2JdJiYodGhpc1tiXT1udWxsKX0sYS5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLkxhenk9ZX0od2luZG93LlplcHRvfHx3aW5kb3cualF1ZXJ5LHdpbmRvdyxkb2N1bWVudCksZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYyl7dGhpcy5fY29yZT1jLHRoaXMuX3ByZXZpb3VzSGVpZ2h0PW51bGwsdGhpcy5faGFuZGxlcnM9eyJpbml0aWFsaXplZC5vd2wuY2Fyb3VzZWwgcmVmcmVzaGVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvSGVpZ2h0JiZ0aGlzLnVwZGF0ZSgpfSx0aGlzKSwiY2hhbmdlZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b0hlaWdodCYmInBvc2l0aW9uIj09PWEucHJvcGVydHkubmFtZSYmdGhpcy51cGRhdGUoKX0sdGhpcyksImxvYWRlZC5vd2wubGF6eSI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvSGVpZ2h0JiZhLmVsZW1lbnQuY2xvc2VzdCgiLiIrdGhpcy5fY29yZS5zZXR0aW5ncy5pdGVtQ2xhc3MpLmluZGV4KCk9PT10aGlzLl9jb3JlLmN1cnJlbnQoKSYmdGhpcy51cGRhdGUoKX0sdGhpcyl9LHRoaXMuX2NvcmUub3B0aW9ucz1hLmV4dGVuZCh7fSxlLkRlZmF1bHRzLHRoaXMuX2NvcmUub3B0aW9ucyksdGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyksdGhpcy5faW50ZXJ2YWxJZD1udWxsO3ZhciBkPXRoaXM7YShiKS5vbigibG9hZCIsZnVuY3Rpb24oKXtkLl9jb3JlLnNldHRpbmdzLmF1dG9IZWlnaHQmJmQudXBkYXRlKCl9KSxhKGIpLnJlc2l6ZShmdW5jdGlvbigpe2QuX2NvcmUuc2V0dGluZ3MuYXV0b0hlaWdodCYmKG51bGwhPWQuX2ludGVydmFsSWQmJmNsZWFyVGltZW91dChkLl9pbnRlcnZhbElkKSxkLl9pbnRlcnZhbElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtkLnVwZGF0ZSgpfSwyNTApKX0pfTtlLkRlZmF1bHRzPXthdXRvSGVpZ2h0OiExLGF1dG9IZWlnaHRDbGFzczoib3dsLWhlaWdodCJ9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBiPXRoaXMuX2NvcmUuX2N1cnJlbnQsYz1iK3RoaXMuX2NvcmUuc2V0dGluZ3MuaXRlbXMsZD10aGlzLl9jb3JlLnNldHRpbmdzLmxhenlMb2FkLGU9dGhpcy5fY29yZS4kc3RhZ2UuY2hpbGRyZW4oKS50b0FycmF5KCkuc2xpY2UoYixjKSxmPVtdLGc9MDthLmVhY2goZSxmdW5jdGlvbihiLGMpe2YucHVzaChhKGMpLmhlaWdodCgpKX0pLGc9TWF0aC5tYXguYXBwbHkobnVsbCxmKSxnPD0xJiZkJiZ0aGlzLl9wcmV2aW91c0hlaWdodCYmKGc9dGhpcy5fcHJldmlvdXNIZWlnaHQpLHRoaXMuX3ByZXZpb3VzSGVpZ2h0PWcsdGhpcy5fY29yZS4kc3RhZ2UucGFyZW50KCkuaGVpZ2h0KGcpLmFkZENsYXNzKHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b0hlaWdodENsYXNzKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhLGI7Zm9yKGEgaW4gdGhpcy5faGFuZGxlcnMpdGhpcy5fY29yZS4kZWxlbWVudC5vZmYoYSx0aGlzLl9oYW5kbGVyc1thXSk7Zm9yKGIgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXNbYl0mJih0aGlzW2JdPW51bGwpfSxhLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuQXV0b0hlaWdodD1lfSh3aW5kb3cuWmVwdG98fHdpbmRvdy5qUXVlcnksd2luZG93LGRvY3VtZW50KSxmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mdW5jdGlvbihiKXt0aGlzLl9jb3JlPWIsdGhpcy5fdmlkZW9zPXt9LHRoaXMuX3BsYXlpbmc9bnVsbCx0aGlzLl9oYW5kbGVycz17ImluaXRpYWxpemVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5fY29yZS5yZWdpc3Rlcih7dHlwZToic3RhdGUiLG5hbWU6InBsYXlpbmciLHRhZ3M6WyJpbnRlcmFjdGluZyJdfSl9LHRoaXMpLCJyZXNpemUub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLnZpZGVvJiZ0aGlzLmlzSW5GdWxsU2NyZWVuKCkmJmEucHJldmVudERlZmF1bHQoKX0sdGhpcyksInJlZnJlc2hlZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuaXMoInJlc2l6aW5nIikmJnRoaXMuX2NvcmUuJHN0YWdlLmZpbmQoIi5jbG9uZWQgLm93bC12aWRlby1mcmFtZSIpLnJlbW92ZSgpfSx0aGlzKSwiY2hhbmdlZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJiJwb3NpdGlvbiI9PT1hLnByb3BlcnR5Lm5hbWUmJnRoaXMuX3BsYXlpbmcmJnRoaXMuc3RvcCgpfSx0aGlzKSwicHJlcGFyZWQub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGIpe2lmKGIubmFtZXNwYWNlKXt2YXIgYz1hKGIuY29udGVudCkuZmluZCgiLm93bC12aWRlbyIpO2MubGVuZ3RoJiYoYy5jc3MoImRpc3BsYXkiLCJub25lIiksdGhpcy5mZXRjaChjLGEoYi5jb250ZW50KSkpfX0sdGhpcyl9LHRoaXMuX2NvcmUub3B0aW9ucz1hLmV4dGVuZCh7fSxlLkRlZmF1bHRzLHRoaXMuX2NvcmUub3B0aW9ucyksdGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyksdGhpcy5fY29yZS4kZWxlbWVudC5vbigiY2xpY2sub3dsLnZpZGVvIiwiLm93bC12aWRlby1wbGF5LWljb24iLGEucHJveHkoZnVuY3Rpb24oYSl7dGhpcy5wbGF5KGEpfSx0aGlzKSl9O2UuRGVmYXVsdHM9e3ZpZGVvOiExLHZpZGVvSGVpZ2h0OiExLHZpZGVvV2lkdGg6ITF9LGUucHJvdG90eXBlLmZldGNoPWZ1bmN0aW9uKGEsYil7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hdHRyKCJkYXRhLXZpbWVvLWlkIik/InZpbWVvIjphLmF0dHIoImRhdGEtdnphYXItaWQiKT8idnphYXIiOiJ5b3V0dWJlIn0oKSxkPWEuYXR0cigiZGF0YS12aW1lby1pZCIpfHxhLmF0dHIoImRhdGEteW91dHViZS1pZCIpfHxhLmF0dHIoImRhdGEtdnphYXItaWQiKSxlPWEuYXR0cigiZGF0YS13aWR0aCIpfHx0aGlzLl9jb3JlLnNldHRpbmdzLnZpZGVvV2lkdGgsZj1hLmF0dHIoImRhdGEtaGVpZ2h0Iil8fHRoaXMuX2NvcmUuc2V0dGluZ3MudmlkZW9IZWlnaHQsZz1hLmF0dHIoImhyZWYiKTtpZighZyl0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgdmlkZW8gVVJMLiIpO2lmKGQ9Zy5tYXRjaCgvKGh0dHA6fGh0dHBzOnwpXC9cLyhwbGF5ZXIufHd3dy58YXBwLik/KHZpbWVvXC5jb218eW91dHUoYmVcLmNvbXxcLmJlfGJlXC5nb29nbGVhcGlzXC5jb218YmVcLW5vY29va2llXC5jb20pfHZ6YWFyXC5jb20pXC8odmlkZW9cL3x2aWRlb3NcL3xlbWJlZFwvfGNoYW5uZWxzXC8uK1wvfGdyb3Vwc1wvLitcL3x3YXRjaFw/dj18dlwvKT8oW0EtWmEtejAtOS5fJS1dKikoXCZcUyspPy8pLGRbM10uaW5kZXhPZigieW91dHUiKT4tMSljPSJ5b3V0dWJlIjtlbHNlIGlmKGRbM10uaW5kZXhPZigidmltZW8iKT4tMSljPSJ2aW1lbyI7ZWxzZXtpZighKGRbM10uaW5kZXhPZigidnphYXIiKT4tMSkpdGhyb3cgbmV3IEVycm9yKCJWaWRlbyBVUkwgbm90IHN1cHBvcnRlZC4iKTtjPSJ2emFhciJ9ZD1kWzZdLHRoaXMuX3ZpZGVvc1tnXT17dHlwZTpjLGlkOmQsd2lkdGg6ZSxoZWlnaHQ6Zn0sYi5hdHRyKCJkYXRhLXZpZGVvIixnKSx0aGlzLnRodW1ibmFpbChhLHRoaXMuX3ZpZGVvc1tnXSl9LGUucHJvdG90eXBlLnRodW1ibmFpbD1mdW5jdGlvbihiLGMpe3ZhciBkLGUsZixnPWMud2lkdGgmJmMuaGVpZ2h0PyJ3aWR0aDoiK2Mud2lkdGgrInB4O2hlaWdodDoiK2MuaGVpZ2h0KyJweDsiOiIiLGg9Yi5maW5kKCJpbWciKSxpPSJzcmMiLGo9IiIsaz10aGlzLl9jb3JlLnNldHRpbmdzLGw9ZnVuY3Rpb24oYyl7ZT0nPGRpdiBjbGFzcz0ib3dsLXZpZGVvLXBsYXktaWNvbiI+PC9kaXY+JyxkPWsubGF6eUxvYWQ/YSgiPGRpdi8+Iix7Y2xhc3M6Im93bC12aWRlby10biAiK2osc3JjVHlwZTpjfSk6YSgiPGRpdi8+Iix7Y2xhc3M6Im93bC12aWRlby10biIsc3R5bGU6Im9wYWNpdHk6MTtiYWNrZ3JvdW5kLWltYWdlOnVybCgiK2MrIikifSksYi5hZnRlcihkKSxiLmFmdGVyKGUpfTtpZihiLndyYXAoYSgiPGRpdi8+Iix7Y2xhc3M6Im93bC12aWRlby13cmFwcGVyIixzdHlsZTpnfSkpLHRoaXMuX2NvcmUuc2V0dGluZ3MubGF6eUxvYWQmJihpPSJkYXRhLXNyYyIsaj0ib3dsLWxhenkiKSxoLmxlbmd0aClyZXR1cm4gbChoLmF0dHIoaSkpLGgucmVtb3ZlKCksITE7InlvdXR1YmUiPT09Yy50eXBlPyhmPSIvL2ltZy55b3V0dWJlLmNvbS92aS8iK2MuaWQrIi9ocWRlZmF1bHQuanBnIixsKGYpKToidmltZW8iPT09Yy50eXBlP2EuYWpheCh7dHlwZToiR0VUIix1cmw6Ii8vdmltZW8uY29tL2FwaS92Mi92aWRlby8iK2MuaWQrIi5qc29uIixqc29ucDoiY2FsbGJhY2siLGRhdGFUeXBlOiJqc29ucCIsc3VjY2VzczpmdW5jdGlvbihhKXtmPWFbMF0udGh1bWJuYWlsX2xhcmdlLGwoZil9fSk6InZ6YWFyIj09PWMudHlwZSYmYS5hamF4KHt0eXBlOiJHRVQiLHVybDoiLy92emFhci5jb20vYXBpL3ZpZGVvcy8iK2MuaWQrIi5qc29uIixqc29ucDoiY2FsbGJhY2siLGRhdGFUeXBlOiJqc29ucCIsc3VjY2VzczpmdW5jdGlvbihhKXtmPWEuZnJhbWVncmFiX3VybCxsKGYpfX0pfSxlLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5fY29yZS50cmlnZ2VyKCJzdG9wIixudWxsLCJ2aWRlbyIpLHRoaXMuX3BsYXlpbmcuZmluZCgiLm93bC12aWRlby1mcmFtZSIpLnJlbW92ZSgpLHRoaXMuX3BsYXlpbmcucmVtb3ZlQ2xhc3MoIm93bC12aWRlby1wbGF5aW5nIiksdGhpcy5fcGxheWluZz1udWxsLHRoaXMuX2NvcmUubGVhdmUoInBsYXlpbmciKSx0aGlzLl9jb3JlLnRyaWdnZXIoInN0b3BwZWQiLG51bGwsInZpZGVvIil9LGUucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oYil7dmFyIGMsZD1hKGIudGFyZ2V0KSxlPWQuY2xvc2VzdCgiLiIrdGhpcy5fY29yZS5zZXR0aW5ncy5pdGVtQ2xhc3MpLGY9dGhpcy5fdmlkZW9zW2UuYXR0cigiZGF0YS12aWRlbyIpXSxnPWYud2lkdGh8fCIxMDAlIixoPWYuaGVpZ2h0fHx0aGlzLl9jb3JlLiRzdGFnZS5oZWlnaHQoKTt0aGlzLl9wbGF5aW5nfHwodGhpcy5fY29yZS5lbnRlcigicGxheWluZyIpLHRoaXMuX2NvcmUudHJpZ2dlcigicGxheSIsbnVsbCwidmlkZW8iKSxlPXRoaXMuX2NvcmUuaXRlbXModGhpcy5fY29yZS5yZWxhdGl2ZShlLmluZGV4KCkpKSx0aGlzLl9jb3JlLnJlc2V0KGUuaW5kZXgoKSksYz1hKCc8aWZyYW1lIGZyYW1lYm9yZGVyPSIwIiBhbGxvd2Z1bGxzY3JlZW4gbW96YWxsb3dmdWxsc2NyZWVuIHdlYmtpdEFsbG93RnVsbFNjcmVlbiA+PC9pZnJhbWU+JyksYy5hdHRyKCJoZWlnaHQiLGgpLGMuYXR0cigid2lkdGgiLGcpLCJ5b3V0dWJlIj09PWYudHlwZT9jLmF0dHIoInNyYyIsIi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyIrZi5pZCsiP2F1dG9wbGF5PTEmcmVsPTAmdj0iK2YuaWQpOiJ2aW1lbyI9PT1mLnR5cGU/Yy5hdHRyKCJzcmMiLCIvL3BsYXllci52aW1lby5jb20vdmlkZW8vIitmLmlkKyI/YXV0b3BsYXk9MSIpOiJ2emFhciI9PT1mLnR5cGUmJmMuYXR0cigic3JjIiwiLy92aWV3LnZ6YWFyLmNvbS8iK2YuaWQrIi9wbGF5ZXI/YXV0b3BsYXk9dHJ1ZSIpLGEoYykud3JhcCgnPGRpdiBjbGFzcz0ib3dsLXZpZGVvLWZyYW1lIiAvPicpLmluc2VydEFmdGVyKGUuZmluZCgiLm93bC12aWRlbyIpKSx0aGlzLl9wbGF5aW5nPWUuYWRkQ2xhc3MoIm93bC12aWRlby1wbGF5aW5nIikpfSxlLnByb3RvdHlwZS5pc0luRnVsbFNjcmVlbj1mdW5jdGlvbigpe3ZhciBiPWMuZnVsbHNjcmVlbkVsZW1lbnR8fGMubW96RnVsbFNjcmVlbkVsZW1lbnR8fGMud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQ7cmV0dXJuIGImJmEoYikucGFyZW50KCkuaGFzQ2xhc3MoIm93bC12aWRlby1mcmFtZSIpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGEsYjt0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZigiY2xpY2sub3dsLnZpZGVvIik7Zm9yKGEgaW4gdGhpcy5faGFuZGxlcnMpdGhpcy5fY29yZS4kZWxlbWVudC5vZmYoYSx0aGlzLl9oYW5kbGVyc1thXSk7Zm9yKGIgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXNbYl0mJih0aGlzW2JdPW51bGwpfSxhLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuVmlkZW89ZX0od2luZG93LlplcHRvfHx3aW5kb3cualF1ZXJ5LHdpbmRvdyxkb2N1bWVudCksZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYil7dGhpcy5jb3JlPWIsdGhpcy5jb3JlLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyx0aGlzLmNvcmUub3B0aW9ucyksdGhpcy5zd2FwcGluZz0hMCx0aGlzLnByZXZpb3VzPWQsdGhpcy5uZXh0PWQsdGhpcy5oYW5kbGVycz17ImNoYW5nZS5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJiJwb3NpdGlvbiI9PWEucHJvcGVydHkubmFtZSYmKHRoaXMucHJldmlvdXM9dGhpcy5jb3JlLmN1cnJlbnQoKSx0aGlzLm5leHQ9YS5wcm9wZXJ0eS52YWx1ZSl9LHRoaXMpLCJkcmFnLm93bC5jYXJvdXNlbCBkcmFnZ2VkLm93bC5jYXJvdXNlbCB0cmFuc2xhdGVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmKHRoaXMuc3dhcHBpbmc9InRyYW5zbGF0ZWQiPT1hLnR5cGUpfSx0aGlzKSwidHJhbnNsYXRlLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5zd2FwcGluZyYmKHRoaXMuY29yZS5vcHRpb25zLmFuaW1hdGVPdXR8fHRoaXMuY29yZS5vcHRpb25zLmFuaW1hdGVJbikmJnRoaXMuc3dhcCgpfSx0aGlzKX0sdGhpcy5jb3JlLiRlbGVtZW50Lm9uKHRoaXMuaGFuZGxlcnMpfTtlLkRlZmF1bHRzPXthbmltYXRlT3V0OiExLGFuaW1hdGVJbjohMX0sZS5wcm90b3R5cGUuc3dhcD1mdW5jdGlvbigpe2lmKDE9PT10aGlzLmNvcmUuc2V0dGluZ3MuaXRlbXMmJmEuc3VwcG9ydC5hbmltYXRpb24mJmEuc3VwcG9ydC50cmFuc2l0aW9uKXt0aGlzLmNvcmUuc3BlZWQoMCk7dmFyIGIsYz1hLnByb3h5KHRoaXMuY2xlYXIsdGhpcyksZD10aGlzLmNvcmUuJHN0YWdlLmNoaWxkcmVuKCkuZXEodGhpcy5wcmV2aW91cyksZT10aGlzLmNvcmUuJHN0YWdlLmNoaWxkcmVuKCkuZXEodGhpcy5uZXh0KSxmPXRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlSW4sZz10aGlzLmNvcmUuc2V0dGluZ3MuYW5pbWF0ZU91dDt0aGlzLmNvcmUuY3VycmVudCgpIT09dGhpcy5wcmV2aW91cyYmKGcmJihiPXRoaXMuY29yZS5jb29yZGluYXRlcyh0aGlzLnByZXZpb3VzKS10aGlzLmNvcmUuY29vcmRpbmF0ZXModGhpcy5uZXh0KSxkLm9uZShhLnN1cHBvcnQuYW5pbWF0aW9uLmVuZCxjKS5jc3Moe2xlZnQ6YisicHgifSkuYWRkQ2xhc3MoImFuaW1hdGVkIG93bC1hbmltYXRlZC1vdXQiKS5hZGRDbGFzcyhnKSksZiYmZS5vbmUoYS5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsYykuYWRkQ2xhc3MoImFuaW1hdGVkIG93bC1hbmltYXRlZC1pbiIpLmFkZENsYXNzKGYpKX19LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKGIpe2EoYi50YXJnZXQpLmNzcyh7bGVmdDoiIn0pLnJlbW92ZUNsYXNzKCJhbmltYXRlZCBvd2wtYW5pbWF0ZWQtb3V0IG93bC1hbmltYXRlZC1pbiIpLnJlbW92ZUNsYXNzKHRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlSW4pLnJlbW92ZUNsYXNzKHRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlT3V0KSx0aGlzLmNvcmUub25UcmFuc2l0aW9uRW5kKCl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYSxiO2ZvcihhIGluIHRoaXMuaGFuZGxlcnMpdGhpcy5jb3JlLiRlbGVtZW50Lm9mZihhLHRoaXMuaGFuZGxlcnNbYV0pO2ZvcihiIGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzW2JdJiYodGhpc1tiXT1udWxsKX0sYS5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLkFuaW1hdGU9ZX0od2luZG93LlplcHRvfHx3aW5kb3cualF1ZXJ5LHdpbmRvdyxkb2N1bWVudCksZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYil7dGhpcy5fY29yZT1iLHRoaXMuX2NhbGw9bnVsbCx0aGlzLl90aW1lPTAsdGhpcy5fdGltZW91dD0wLHRoaXMuX3BhdXNlZD0hMCx0aGlzLl9oYW5kbGVycz17ImNoYW5nZWQub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiYic2V0dGluZ3MiPT09YS5wcm9wZXJ0eS5uYW1lP3RoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXk/dGhpcy5wbGF5KCk6dGhpcy5zdG9wKCk6YS5uYW1lc3BhY2UmJiJwb3NpdGlvbiI9PT1hLnByb3BlcnR5Lm5hbWUmJnRoaXMuX3BhdXNlZCYmKHRoaXMuX3RpbWU9MCl9LHRoaXMpLCJpbml0aWFsaXplZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXkmJnRoaXMucGxheSgpfSx0aGlzKSwicGxheS5vd2wuYXV0b3BsYXkiOmEucHJveHkoZnVuY3Rpb24oYSxiLGMpe2EubmFtZXNwYWNlJiZ0aGlzLnBsYXkoYixjKX0sdGhpcyksInN0b3Aub3dsLmF1dG9wbGF5IjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLnN0b3AoKX0sdGhpcyksIm1vdXNlb3Zlci5vd2wuYXV0b3BsYXkiOmEucHJveHkoZnVuY3Rpb24oKXt0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5SG92ZXJQYXVzZSYmdGhpcy5fY29yZS5pcygicm90YXRpbmciKSYmdGhpcy5wYXVzZSgpfSx0aGlzKSwibW91c2VsZWF2ZS5vd2wuYXV0b3BsYXkiOmEucHJveHkoZnVuY3Rpb24oKXt0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5SG92ZXJQYXVzZSYmdGhpcy5fY29yZS5pcygicm90YXRpbmciKSYmdGhpcy5wbGF5KCl9LHRoaXMpLCJ0b3VjaHN0YXJ0Lm93bC5jb3JlIjphLnByb3h5KGZ1bmN0aW9uKCl7dGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheUhvdmVyUGF1c2UmJnRoaXMuX2NvcmUuaXMoInJvdGF0aW5nIikmJnRoaXMucGF1c2UoKX0sdGhpcyksInRvdWNoZW5kLm93bC5jb3JlIjphLnByb3h5KGZ1bmN0aW9uKCl7dGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheUhvdmVyUGF1c2UmJnRoaXMucGxheSgpfSx0aGlzKX0sdGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyksdGhpcy5fY29yZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuRGVmYXVsdHMsdGhpcy5fY29yZS5vcHRpb25zKX07ZS5EZWZhdWx0cz17YXV0b3BsYXk6ITEsYXV0b3BsYXlUaW1lb3V0OjVlMyxhdXRvcGxheUhvdmVyUGF1c2U6ITEsYXV0b3BsYXlTcGVlZDohMX0sZS5wcm90b3R5cGUuX25leHQ9ZnVuY3Rpb24oZCl7dGhpcy5fY2FsbD1iLnNldFRpbWVvdXQoYS5wcm94eSh0aGlzLl9uZXh0LHRoaXMsZCksdGhpcy5fdGltZW91dCooTWF0aC5yb3VuZCh0aGlzLnJlYWQoKS90aGlzLl90aW1lb3V0KSsxKS10aGlzLnJlYWQoKSksdGhpcy5fY29yZS5pcygiaW50ZXJhY3RpbmciKXx8Yy5oaWRkZW58fHRoaXMuX2NvcmUubmV4dChkfHx0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5U3BlZWQpfSxlLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fdGltZX0sZS5wcm90b3R5cGUucGxheT1mdW5jdGlvbihjLGQpe3ZhciBlO3RoaXMuX2NvcmUuaXMoInJvdGF0aW5nIil8fHRoaXMuX2NvcmUuZW50ZXIoInJvdGF0aW5nIiksYz1jfHx0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5VGltZW91dCxlPU1hdGgubWluKHRoaXMuX3RpbWUlKHRoaXMuX3RpbWVvdXR8fGMpLGMpLHRoaXMuX3BhdXNlZD8odGhpcy5fdGltZT10aGlzLnJlYWQoKSx0aGlzLl9wYXVzZWQ9ITEpOmIuY2xlYXJUaW1lb3V0KHRoaXMuX2NhbGwpLHRoaXMuX3RpbWUrPXRoaXMucmVhZCgpJWMtZSx0aGlzLl90aW1lb3V0PWMsdGhpcy5fY2FsbD1iLnNldFRpbWVvdXQoYS5wcm94eSh0aGlzLl9uZXh0LHRoaXMsZCksYy1lKX0sZS5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbigpe3RoaXMuX2NvcmUuaXMoInJvdGF0aW5nIikmJih0aGlzLl90aW1lPTAsdGhpcy5fcGF1c2VkPSEwLGIuY2xlYXJUaW1lb3V0KHRoaXMuX2NhbGwpLHRoaXMuX2NvcmUubGVhdmUoInJvdGF0aW5nIikpfSxlLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuX2NvcmUuaXMoInJvdGF0aW5nIikmJiF0aGlzLl9wYXVzZWQmJih0aGlzLl90aW1lPXRoaXMucmVhZCgpLHRoaXMuX3BhdXNlZD0hMCxiLmNsZWFyVGltZW91dCh0aGlzLl9jYWxsKSl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYSxiO3RoaXMuc3RvcCgpO2ZvcihhIGluIHRoaXMuX2hhbmRsZXJzKXRoaXMuX2NvcmUuJGVsZW1lbnQub2ZmKGEsdGhpcy5faGFuZGxlcnNbYV0pO2ZvcihiIGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzW2JdJiYodGhpc1tiXT1udWxsKX0sYS5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLmF1dG9wbGF5PWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1mdW5jdGlvbihiKXt0aGlzLl9jb3JlPWIsdGhpcy5faW5pdGlhbGl6ZWQ9ITEsdGhpcy5fcGFnZXM9W10sdGhpcy5fY29udHJvbHM9e30sdGhpcy5fdGVtcGxhdGVzPVtdLHRoaXMuJGVsZW1lbnQ9dGhpcy5fY29yZS4kZWxlbWVudCx0aGlzLl9vdmVycmlkZXM9e25leHQ6dGhpcy5fY29yZS5uZXh0LHByZXY6dGhpcy5fY29yZS5wcmV2LHRvOnRoaXMuX2NvcmUudG99LHRoaXMuX2hhbmRsZXJzPXsicHJlcGFyZWQub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGIpe2IubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLmRvdHNEYXRhJiZ0aGlzLl90ZW1wbGF0ZXMucHVzaCgnPGRpdiBjbGFzcz0iJyt0aGlzLl9jb3JlLnNldHRpbmdzLmRvdENsYXNzKyciPicrYShiLmNvbnRlbnQpLmZpbmQoIltkYXRhLWRvdF0iKS5hZGRCYWNrKCJbZGF0YS1kb3RdIikuYXR0cigiZGF0YS1kb3QiKSsiPC9kaXY+Iil9LHRoaXMpLCJhZGRlZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuc2V0dGluZ3MuZG90c0RhdGEmJnRoaXMuX3RlbXBsYXRlcy5zcGxpY2UoYS5wb3NpdGlvbiwwLHRoaXMuX3RlbXBsYXRlcy5wb3AoKSl9LHRoaXMpLCJyZW1vdmUub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLmRvdHNEYXRhJiZ0aGlzLl90ZW1wbGF0ZXMuc3BsaWNlKGEucG9zaXRpb24sMSl9LHRoaXMpLCJjaGFuZ2VkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmInBvc2l0aW9uIj09YS5wcm9wZXJ0eS5uYW1lJiZ0aGlzLmRyYXcoKX0sdGhpcyksImluaXRpYWxpemVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmIXRoaXMuX2luaXRpYWxpemVkJiYodGhpcy5fY29yZS50cmlnZ2VyKCJpbml0aWFsaXplIixudWxsLCJuYXZpZ2F0aW9uIiksdGhpcy5pbml0aWFsaXplKCksdGhpcy51cGRhdGUoKSx0aGlzLmRyYXcoKSx0aGlzLl9pbml0aWFsaXplZD0hMCx0aGlzLl9jb3JlLnRyaWdnZXIoImluaXRpYWxpemVkIixudWxsLCJuYXZpZ2F0aW9uIikpfSx0aGlzKSwicmVmcmVzaGVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5faW5pdGlhbGl6ZWQmJih0aGlzLl9jb3JlLnRyaWdnZXIoInJlZnJlc2giLG51bGwsIm5hdmlnYXRpb24iKSx0aGlzLnVwZGF0ZSgpLHRoaXMuZHJhdygpLHRoaXMuX2NvcmUudHJpZ2dlcigicmVmcmVzaGVkIixudWxsLCJuYXZpZ2F0aW9uIikpfSx0aGlzKX0sdGhpcy5fY29yZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuRGVmYXVsdHMsdGhpcy5fY29yZS5vcHRpb25zKSx0aGlzLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKX07ZS5EZWZhdWx0cz17bmF2OiExLG5hdlRleHQ6Wyc8c3BhbiBhcmlhLWxhYmVsPSJQcmV2aW91cyI+JiN4MjAzOTs8L3NwYW4+JywnPHNwYW4gYXJpYS1sYWJlbD0iTmV4dCI+JiN4MjAzYTs8L3NwYW4+J10sbmF2U3BlZWQ6ITEsbmF2RWxlbWVudDonYnV0dG9uIHR5cGU9ImJ1dHRvbiIgcm9sZT0icHJlc2VudGF0aW9uIicsbmF2Q29udGFpbmVyOiExLG5hdkNvbnRhaW5lckNsYXNzOiJvd2wtbmF2IixuYXZDbGFzczpbIm93bC1wcmV2Iiwib3dsLW5leHQiXSxzbGlkZUJ5OjEsZG90Q2xhc3M6Im93bC1kb3QiLGRvdHNDbGFzczoib3dsLWRvdHMiLGRvdHM6ITAsZG90c0VhY2g6ITEsZG90c0RhdGE6ITEsZG90c1NwZWVkOiExLGRvdHNDb250YWluZXI6ITF9LGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXt2YXIgYixjPXRoaXMuX2NvcmUuc2V0dGluZ3M7dGhpcy5fY29udHJvbHMuJHJlbGF0aXZlPShjLm5hdkNvbnRhaW5lcj9hKGMubmF2Q29udGFpbmVyKTphKCI8ZGl2PiIpLmFkZENsYXNzKGMubmF2Q29udGFpbmVyQ2xhc3MpLmFwcGVuZFRvKHRoaXMuJGVsZW1lbnQpKS5hZGRDbGFzcygiZGlzYWJsZWQiKSx0aGlzLl9jb250cm9scy4kcHJldmlvdXM9YSgiPCIrYy5uYXZFbGVtZW50KyI+IikuYWRkQ2xhc3MoYy5uYXZDbGFzc1swXSkuaHRtbChjLm5hdlRleHRbMF0pLnByZXBlbmRUbyh0aGlzLl9jb250cm9scy4kcmVsYXRpdmUpLm9uKCJjbGljayIsYS5wcm94eShmdW5jdGlvbihhKXt0aGlzLnByZXYoYy5uYXZTcGVlZCl9LHRoaXMpKSx0aGlzLl9jb250cm9scy4kbmV4dD1hKCI8IitjLm5hdkVsZW1lbnQrIj4iKS5hZGRDbGFzcyhjLm5hdkNsYXNzWzFdKS5odG1sKGMubmF2VGV4dFsxXSkuYXBwZW5kVG8odGhpcy5fY29udHJvbHMuJHJlbGF0aXZlKS5vbigiY2xpY2siLGEucHJveHkoZnVuY3Rpb24oYSl7dGhpcy5uZXh0KGMubmF2U3BlZWQpfSx0aGlzKSksYy5kb3RzRGF0YXx8KHRoaXMuX3RlbXBsYXRlcz1bYSgnPGJ1dHRvbiByb2xlPSJidXR0b24iPicpLmFkZENsYXNzKGMuZG90Q2xhc3MpLmFwcGVuZChhKCI8c3Bhbj4iKSkucHJvcCgib3V0ZXJIVE1MIildKSx0aGlzLl9jb250cm9scy4kYWJzb2x1dGU9KGMuZG90c0NvbnRhaW5lcj9hKGMuZG90c0NvbnRhaW5lcik6YSgiPGRpdj4iKS5hZGRDbGFzcyhjLmRvdHNDbGFzcykuYXBwZW5kVG8odGhpcy4kZWxlbWVudCkpLmFkZENsYXNzKCJkaXNhYmxlZCIpLHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5vbigiY2xpY2siLCJidXR0b24iLGEucHJveHkoZnVuY3Rpb24oYil7dmFyIGQ9YShiLnRhcmdldCkucGFyZW50KCkuaXModGhpcy5fY29udHJvbHMuJGFic29sdXRlKT9hKGIudGFyZ2V0KS5pbmRleCgpOmEoYi50YXJnZXQpLnBhcmVudCgpLmluZGV4KCk7Yi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMudG8oZCxjLmRvdHNTcGVlZCl9LHRoaXMpKTtmb3IoYiBpbiB0aGlzLl9vdmVycmlkZXMpdGhpcy5fY29yZVtiXT1hLnByb3h5KHRoaXNbYl0sdGhpcyl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlO2U9dGhpcy5fY29yZS5zZXR0aW5ncztmb3IoYSBpbiB0aGlzLl9oYW5kbGVycyl0aGlzLiRlbGVtZW50Lm9mZihhLHRoaXMuX2hhbmRsZXJzW2FdKTtmb3IoYiBpbiB0aGlzLl9jb250cm9scykiJHJlbGF0aXZlIj09PWImJmUubmF2Q29udGFpbmVyP3RoaXMuX2NvbnRyb2xzW2JdLmh0bWwoIiIpOnRoaXMuX2NvbnRyb2xzW2JdLnJlbW92ZSgpO2ZvcihkIGluIHRoaXMub3ZlcmlkZXMpdGhpcy5fY29yZVtkXT10aGlzLl9vdmVycmlkZXNbZF07Zm9yKGMgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXNbY10mJih0aGlzW2NdPW51bGwpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZD10aGlzLl9jb3JlLmNsb25lcygpLmxlbmd0aC8yLGU9ZCt0aGlzLl9jb3JlLml0ZW1zKCkubGVuZ3RoLGY9dGhpcy5fY29yZS5tYXhpbXVtKCEwKSxnPXRoaXMuX2NvcmUuc2V0dGluZ3MsaD1nLmNlbnRlcnx8Zy5hdXRvV2lkdGh8fGcuZG90c0RhdGE/MTpnLmRvdHNFYWNofHxnLml0ZW1zO2lmKCJwYWdlIiE9PWcuc2xpZGVCeSYmKGcuc2xpZGVCeT1NYXRoLm1pbihnLnNsaWRlQnksZy5pdGVtcykpLGcuZG90c3x8InBhZ2UiPT1nLnNsaWRlQnkpZm9yKHRoaXMuX3BhZ2VzPVtdLGE9ZCxiPTAsYz0wO2E8ZTthKyspe2lmKGI+PWh8fDA9PT1iKXtpZih0aGlzLl9wYWdlcy5wdXNoKHtzdGFydDpNYXRoLm1pbihmLGEtZCksZW5kOmEtZCtoLTF9KSxNYXRoLm1pbihmLGEtZCk9PT1mKWJyZWFrO2I9MCwrK2N9Yis9dGhpcy5fY29yZS5tZXJnZXJzKHRoaXMuX2NvcmUucmVsYXRpdmUoYSkpfX0sZS5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbigpe3ZhciBiLGM9dGhpcy5fY29yZS5zZXR0aW5ncyxkPXRoaXMuX2NvcmUuaXRlbXMoKS5sZW5ndGg8PWMuaXRlbXMsZT10aGlzLl9jb3JlLnJlbGF0aXZlKHRoaXMuX2NvcmUuY3VycmVudCgpKSxmPWMubG9vcHx8Yy5yZXdpbmQ7dGhpcy5fY29udHJvbHMuJHJlbGF0aXZlLnRvZ2dsZUNsYXNzKCJkaXNhYmxlZCIsIWMubmF2fHxkKSxjLm5hdiYmKHRoaXMuX2NvbnRyb2xzLiRwcmV2aW91cy50b2dnbGVDbGFzcygiZGlzYWJsZWQiLCFmJiZlPD10aGlzLl9jb3JlLm1pbmltdW0oITApKSx0aGlzLl9jb250cm9scy4kbmV4dC50b2dnbGVDbGFzcygiZGlzYWJsZWQiLCFmJiZlPj10aGlzLl9jb3JlLm1heGltdW0oITApKSksdGhpcy5fY29udHJvbHMuJGFic29sdXRlLnRvZ2dsZUNsYXNzKCJkaXNhYmxlZCIsIWMuZG90c3x8ZCksYy5kb3RzJiYoYj10aGlzLl9wYWdlcy5sZW5ndGgtdGhpcy5fY29udHJvbHMuJGFic29sdXRlLmNoaWxkcmVuKCkubGVuZ3RoLGMuZG90c0RhdGEmJjAhPT1iP3RoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5odG1sKHRoaXMuX3RlbXBsYXRlcy5qb2luKCIiKSk6Yj4wP3RoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5hcHBlbmQobmV3IEFycmF5KGIrMSkuam9pbih0aGlzLl90ZW1wbGF0ZXNbMF0pKTpiPDAmJnRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5jaGlsZHJlbigpLnNsaWNlKGIpLnJlbW92ZSgpLHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5maW5kKCIuYWN0aXZlIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5jaGlsZHJlbigpLmVxKGEuaW5BcnJheSh0aGlzLmN1cnJlbnQoKSx0aGlzLl9wYWdlcykpLmFkZENsYXNzKCJhY3RpdmUiKSl9LGUucHJvdG90eXBlLm9uVHJpZ2dlcj1mdW5jdGlvbihiKXt2YXIgYz10aGlzLl9jb3JlLnNldHRpbmdzO2IucGFnZT17aW5kZXg6YS5pbkFycmF5KHRoaXMuY3VycmVudCgpLHRoaXMuX3BhZ2VzKSxjb3VudDp0aGlzLl9wYWdlcy5sZW5ndGgsc2l6ZTpjJiYoYy5jZW50ZXJ8fGMuYXV0b1dpZHRofHxjLmRvdHNEYXRhPzE6Yy5kb3RzRWFjaHx8Yy5pdGVtcyl9fSxlLnByb3RvdHlwZS5jdXJyZW50PWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fY29yZS5yZWxhdGl2ZSh0aGlzLl9jb3JlLmN1cnJlbnQoKSk7cmV0dXJuIGEuZ3JlcCh0aGlzLl9wYWdlcyxhLnByb3h5KGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuc3RhcnQ8PWImJmEuZW5kPj1ifSx0aGlzKSkucG9wKCl9LGUucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKGIpe3ZhciBjLGQsZT10aGlzLl9jb3JlLnNldHRpbmdzO3JldHVybiJwYWdlIj09ZS5zbGlkZUJ5PyhjPWEuaW5BcnJheSh0aGlzLmN1cnJlbnQoKSx0aGlzLl9wYWdlcyksZD10aGlzLl9wYWdlcy5sZW5ndGgsYj8rK2M6LS1jLGM9dGhpcy5fcGFnZXNbKGMlZCtkKSVkXS5zdGFydCk6KGM9dGhpcy5fY29yZS5yZWxhdGl2ZSh0aGlzLl9jb3JlLmN1cnJlbnQoKSksZD10aGlzLl9jb3JlLml0ZW1zKCkubGVuZ3RoLGI/Yys9ZS5zbGlkZUJ5OmMtPWUuc2xpZGVCeSksY30sZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbihiKXthLnByb3h5KHRoaXMuX292ZXJyaWRlcy50byx0aGlzLl9jb3JlKSh0aGlzLmdldFBvc2l0aW9uKCEwKSxiKX0sZS5wcm90b3R5cGUucHJldj1mdW5jdGlvbihiKXthLnByb3h5KHRoaXMuX292ZXJyaWRlcy50byx0aGlzLl9jb3JlKSh0aGlzLmdldFBvc2l0aW9uKCExKSxiKX0sZS5wcm90b3R5cGUudG89ZnVuY3Rpb24oYixjLGQpe3ZhciBlOyFkJiZ0aGlzLl9wYWdlcy5sZW5ndGg/KGU9dGhpcy5fcGFnZXMubGVuZ3RoLGEucHJveHkodGhpcy5fb3ZlcnJpZGVzLnRvLHRoaXMuX2NvcmUpKHRoaXMuX3BhZ2VzWyhiJWUrZSklZV0uc3RhcnQsYykpOmEucHJveHkodGhpcy5fb3ZlcnJpZGVzLnRvLHRoaXMuX2NvcmUpKGIsYyl9LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5OYXZpZ2F0aW9uPWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1mdW5jdGlvbihjKXt0aGlzLl9jb3JlPWMsdGhpcy5faGFzaGVzPXt9LHRoaXMuJGVsZW1lbnQ9dGhpcy5fY29yZS4kZWxlbWVudCx0aGlzLl9oYW5kbGVycz17ImluaXRpYWxpemVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihjKXtjLm5hbWVzcGFjZSYmIlVSTEhhc2giPT09dGhpcy5fY29yZS5zZXR0aW5ncy5zdGFydFBvc2l0aW9uJiZhKGIpLnRyaWdnZXIoImhhc2hjaGFuZ2Uub3dsLm5hdmlnYXRpb24iKX0sdGhpcyksInByZXBhcmVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihiKXtpZihiLm5hbWVzcGFjZSl7dmFyIGM9YShiLmNvbnRlbnQpLmZpbmQoIltkYXRhLWhhc2hdIikuYWRkQmFjaygiW2RhdGEtaGFzaF0iKS5hdHRyKCJkYXRhLWhhc2giKTtpZighYylyZXR1cm47dGhpcy5faGFzaGVzW2NdPWIuY29udGVudH19LHRoaXMpLCJjaGFuZ2VkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihjKXtpZihjLm5hbWVzcGFjZSYmInBvc2l0aW9uIj09PWMucHJvcGVydHkubmFtZSl7dmFyIGQ9dGhpcy5fY29yZS5pdGVtcyh0aGlzLl9jb3JlLnJlbGF0aXZlKHRoaXMuX2NvcmUuY3VycmVudCgpKSksZT1hLm1hcCh0aGlzLl9oYXNoZXMsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWQ/YjpudWxsfSkuam9pbigpO2lmKCFlfHxiLmxvY2F0aW9uLmhhc2guc2xpY2UoMSk9PT1lKXJldHVybjtiLmxvY2F0aW9uLmhhc2g9ZX19LHRoaXMpfSx0aGlzLl9jb3JlLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyx0aGlzLl9jb3JlLm9wdGlvbnMpLHRoaXMuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpLGEoYikub24oImhhc2hjaGFuZ2Uub3dsLm5hdmlnYXRpb24iLGEucHJveHkoZnVuY3Rpb24oYSl7dmFyIGM9Yi5sb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSxlPXRoaXMuX2NvcmUuJHN0YWdlLmNoaWxkcmVuKCksZj10aGlzLl9oYXNoZXNbY10mJmUuaW5kZXgodGhpcy5faGFzaGVzW2NdKTtmIT09ZCYmZiE9PXRoaXMuX2NvcmUuY3VycmVudCgpJiZ0aGlzLl9jb3JlLnRvKHRoaXMuX2NvcmUucmVsYXRpdmUoZiksITEsITApfSx0aGlzKSl9O2UuRGVmYXVsdHM9e1VSTGhhc2hMaXN0ZW5lcjohMX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBjLGQ7YShiKS5vZmYoImhhc2hjaGFuZ2Uub3dsLm5hdmlnYXRpb24iKTtmb3IoYyBpbiB0aGlzLl9oYW5kbGVycyl0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihjLHRoaXMuX2hhbmRsZXJzW2NdKTtmb3IoZCBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkiZnVuY3Rpb24iIT10eXBlb2YgdGhpc1tkXSYmKHRoaXNbZF09bnVsbCl9LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5IYXNoPWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGUoYixjKXt2YXIgZT0hMSxmPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKTtyZXR1cm4gYS5lYWNoKChiKyIgIitoLmpvaW4oZisiICIpK2YpLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtpZihnW2JdIT09ZClyZXR1cm4gZT0hY3x8YiwhMX0pLGV9ZnVuY3Rpb24gZihhKXtyZXR1cm4gZShhLCEwKX12YXIgZz1hKCI8c3VwcG9ydD4iKS5nZXQoMCkuc3R5bGUsaD0iV2Via2l0IE1veiBPIG1zIi5zcGxpdCgiICIpLGk9e3RyYW5zaXRpb246e2VuZDp7V2Via2l0VHJhbnNpdGlvbjoid2Via2l0VHJhbnNpdGlvbkVuZCIsTW96VHJhbnNpdGlvbjoidHJhbnNpdGlvbmVuZCIsT1RyYW5zaXRpb246Im9UcmFuc2l0aW9uRW5kIix0cmFuc2l0aW9uOiJ0cmFuc2l0aW9uZW5kIn19LGFuaW1hdGlvbjp7ZW5kOntXZWJraXRBbmltYXRpb246IndlYmtpdEFuaW1hdGlvbkVuZCIsTW96QW5pbWF0aW9uOiJhbmltYXRpb25lbmQiLE9BbmltYXRpb246Im9BbmltYXRpb25FbmQiLGFuaW1hdGlvbjoiYW5pbWF0aW9uZW5kIn19fSxqPXtjc3N0cmFuc2Zvcm1zOmZ1bmN0aW9uKCl7cmV0dXJuISFlKCJ0cmFuc2Zvcm0iKX0sY3NzdHJhbnNmb3JtczNkOmZ1bmN0aW9uKCl7cmV0dXJuISFlKCJwZXJzcGVjdGl2ZSIpfSxjc3N0cmFuc2l0aW9uczpmdW5jdGlvbigpe3JldHVybiEhZSgidHJhbnNpdGlvbiIpfSxjc3NhbmltYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuISFlKCJhbmltYXRpb24iKX19O2ouY3NzdHJhbnNpdGlvbnMoKSYmKGEuc3VwcG9ydC50cmFuc2l0aW9uPW5ldyBTdHJpbmcoZigidHJhbnNpdGlvbiIpKSxhLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQ9aS50cmFuc2l0aW9uLmVuZFthLnN1cHBvcnQudHJhbnNpdGlvbl0pLGouY3NzYW5pbWF0aW9ucygpJiYoYS5zdXBwb3J0LmFuaW1hdGlvbj1uZXcgU3RyaW5nKGYoImFuaW1hdGlvbiIpKSxhLnN1cHBvcnQuYW5pbWF0aW9uLmVuZD1pLmFuaW1hdGlvbi5lbmRbYS5zdXBwb3J0LmFuaW1hdGlvbl0pLGouY3NzdHJhbnNmb3JtcygpJiYoYS5zdXBwb3J0LnRyYW5zZm9ybT1uZXcgU3RyaW5nKGYoInRyYW5zZm9ybSIpKSxhLnN1cHBvcnQudHJhbnNmb3JtM2Q9ai5jc3N0cmFuc2Zvcm1zM2QoKSl9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpO3ZhciB3aW5kb3dXaWR0aD13aW5kb3cuaW5uZXJXaWR0aDt2YXIgYmxvZ1Bvc3RNZXRhQXRCb3R0b209ITE7JChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXtwbGFjZUJsb2dQb3N0TWV0YSgpOyQod2luZG93KS5vbigncmVzaXplJyxmdW5jdGlvbigpe3dpbmRvd1dpZHRoPXdpbmRvdy5pbm5lcldpZHRoO3BsYWNlQmxvZ1Bvc3RNZXRhKCl9KX0pO2Z1bmN0aW9uIHBsYWNlQmxvZ1Bvc3RNZXRhKCl7dmFyIGJsb2dNZXRhQm94PSQoJyNibG9nLXBvc3QtbWV0YScpO2lmKGJsb2dNZXRhQm94Lmxlbmd0aD4wKXtpZih3aW5kb3dXaWR0aDw5OTIpe2lmKGJsb2dQb3N0TWV0YUF0Qm90dG9tPT09ITEpeyQoJyNibG9nLXBvc3QtbWV0YS1jb250YWluZXItbW9iaWxlJykuYXBwZW5kKGJsb2dNZXRhQm94KTtibG9nUG9zdE1ldGFBdEJvdHRvbT0hMH19ZWxzZXtpZihibG9nUG9zdE1ldGFBdEJvdHRvbT09PSEwKXskKCcjYmxvZy1wb3N0LW1ldGEtY29udGFpbmVyJykuYXBwZW5kKGJsb2dNZXRhQm94KTtibG9nUG9zdE1ldGFBdEJvdHRvbT0hMX19fX07JChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXt2YXIgcmVmYnk9JCgnaW5wdXRbbmFtZT1yZWZieV0nKTtpZihyZWZieS5sZW5ndGg+MCl7cmVmYnkudmFsKGRvY3VtZW50LnJlZmVycmVyKX19KTsoZnVuY3Rpb24oJCl7JC5mbG9hdFRoZWFkPSQuZmxvYXRUaGVhZHx8e307JC5mbG9hdFRoZWFkLmRlZmF1bHRzPXtoZWFkZXJDZWxsU2VsZWN0b3I6J3RyOnZpc2libGU6Zmlyc3Q+Kjp2aXNpYmxlJyx6SW5kZXg6MTAwMSxwb3NpdGlvbjonYXV0bycsdG9wOjAsYm90dG9tOjAsc2Nyb2xsQ29udGFpbmVyOmZ1bmN0aW9uKCR0YWJsZSl7cmV0dXJuICQoW10pfSxyZXNwb25zaXZlQ29udGFpbmVyOmZ1bmN0aW9uKCR0YWJsZSl7cmV0dXJuICQoW10pfSxnZXRTaXppbmdSb3c6ZnVuY3Rpb24oJHRhYmxlLCRjb2xzLCRmdGhDZWxscyl7cmV0dXJuICR0YWJsZS5maW5kKCd0Ym9keSB0cjp2aXNpYmxlOmZpcnN0Pio6dmlzaWJsZScpfSxmbG9hdFRhYmxlQ2xhc3M6J2Zsb2F0VGhlYWQtdGFibGUnLGZsb2F0V3JhcHBlckNsYXNzOidmbG9hdFRoZWFkLXdyYXBwZXInLGZsb2F0Q29udGFpbmVyQ2xhc3M6J2Zsb2F0VGhlYWQtY29udGFpbmVyJyxjb3B5VGFibGVDbGFzczohMCxlbmFibGVBcmlhOiExLGF1dG9SZWZsb3c6ITEsZGVidWc6ITEsc3VwcG9ydDp7Ym9vdHN0cmFwOiEwLGRhdGF0YWJsZXM6ITAsanF1ZXJ5VUk6ITAscGVyZmVjdFNjcm9sbGJhcjohMH19O3ZhciB1dGlsPXdpbmRvdy5fO3ZhciBjYW5PYnNlcnZlTXV0YXRpb25zPXR5cGVvZiBNdXRhdGlvbk9ic2VydmVyIT09J3VuZGVmaW5lZCc7dmFyIGllVmVyc2lvbj1mdW5jdGlvbigpe2Zvcih2YXIgYT0zLGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYiIpLGM9Yi5hbGx8fFtdO2E9MSthLGIuaW5uZXJIVE1MPSI8IS0tW2lmIGd0IElFICIrYSsiXT48aT48IVtlbmRpZl0tLT4iLGNbMF07KTtyZXR1cm4gNDxhP2E6ZG9jdW1lbnQuZG9jdW1lbnRNb2RlfSgpO3ZhciBpc0ZGPS9HZWNrb1wvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO3ZhciBpc1dlYmtpdD0vV2ViS2l0XC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoIShpZVZlcnNpb258fGlzRkZ8fGlzV2Via2l0KSl7aWVWZXJzaW9uPTExfQp2YXIgaXNUYWJsZVdpZHRoQnVnPWZ1bmN0aW9uKCl7aWYoaXNXZWJraXQpe3ZhciAkdGVzdD0kKCc8ZGl2IHN0eWxlPSJ3aWR0aDowcHgiPjx0YWJsZSBzdHlsZT0ibWF4LXdpZHRoOjEwMCUiPjx0cj48dGg+PGRpdiBzdHlsZT0ibWluLXdpZHRoOjEwMHB4OyI+WDwvZGl2PjwvdGg+PC90cj48L3RhYmxlPjwvZGl2PicpOyQoImJvZHkiKS5hcHBlbmQoJHRlc3QpO3ZhciByZXQ9KCR0ZXN0LmZpbmQoInRhYmxlIikud2lkdGgoKT09MCk7JHRlc3QucmVtb3ZlKCk7cmV0dXJuIHJldH0KcmV0dXJuITF9O3ZhciBjcmVhdGVFbGVtZW50cz0haXNGRiYmIWllVmVyc2lvbjt2YXIgJHdpbmRvdz0kKHdpbmRvdyk7aWYoIXdpbmRvdy5tYXRjaE1lZGlhKXt2YXIgX2JlZm9yZVByaW50PXdpbmRvdy5vbmJlZm9yZXByaW50O3ZhciBfYWZ0ZXJQcmludD13aW5kb3cub25hZnRlcnByaW50O3dpbmRvdy5vbmJlZm9yZXByaW50PWZ1bmN0aW9uKCl7X2JlZm9yZVByaW50JiZfYmVmb3JlUHJpbnQoKTskd2luZG93LnRyaWdnZXJIYW5kbGVyKCJiZWZvcmVwcmludCIpfTt3aW5kb3cub25hZnRlcnByaW50PWZ1bmN0aW9uKCl7X2FmdGVyUHJpbnQmJl9hZnRlclByaW50KCk7JHdpbmRvdy50cmlnZ2VySGFuZGxlcigiYWZ0ZXJwcmludCIpfX0KZnVuY3Rpb24gd2luZG93UmVzaXplKGV2ZW50TmFtZSxjYil7aWYoaWVWZXJzaW9uPT04KXt2YXIgd2luV2lkdGg9JHdpbmRvdy53aWR0aCgpO3ZhciBkZWJvdW5jZWRDYj11dGlsLmRlYm91bmNlKGZ1bmN0aW9uKCl7dmFyIHdpbldpZHRoTmV3PSR3aW5kb3cud2lkdGgoKTtpZih3aW5XaWR0aCE9d2luV2lkdGhOZXcpe3dpbldpZHRoPXdpbldpZHRoTmV3O2NiKCl9fSwxKTskd2luZG93Lm9uKGV2ZW50TmFtZSxkZWJvdW5jZWRDYil9ZWxzZXskd2luZG93Lm9uKGV2ZW50TmFtZSx1dGlsLmRlYm91bmNlKGNiLDEpKX19CmZ1bmN0aW9uIGdldENsb3Nlc3RTY3JvbGxDb250YWluZXIoJGVsZW0pe3ZhciBlbGVtPSRlbGVtWzBdO3ZhciBwYXJlbnQ9ZWxlbS5wYXJlbnRFbGVtZW50O2Rve3ZhciBwb3M9d2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdvdmVyZmxvdycpO2lmKHBvcyE9J3Zpc2libGUnKWJyZWFrfXdoaWxlKHBhcmVudD1wYXJlbnQucGFyZW50RWxlbWVudCk7aWYocGFyZW50PT1kb2N1bWVudC5ib2R5KXtyZXR1cm4gJChbXSl9CnJldHVybiAkKHBhcmVudCl9CmZ1bmN0aW9uIGRlYnVnKHN0cil7d2luZG93JiZ3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUuZXJyb3ImJndpbmRvdy5jb25zb2xlLmVycm9yKCJqUXVlcnkuZmxvYXRUaGVhZDogIitzdHIpfQpmdW5jdGlvbiBnZXRPZmZzZXRXaWR0aChlbCl7dmFyIHJlY3Q9ZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHJlY3Qud2lkdGh8fHJlY3QucmlnaHQtcmVjdC5sZWZ0fQpmdW5jdGlvbiBzY3JvbGxiYXJXaWR0aCgpe3ZhciAkZGl2PSQoJzxkaXYgc3R5bGU9IndpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3cteTpzY3JvbGw7JysncG9zaXRpb246YWJzb2x1dGU7dG9wOi0yMDBweDtsZWZ0Oi0yMDBweDsiPjxkaXYgc3R5bGU9ImhlaWdodDoxMDBweDt3aWR0aDoxMDAlIj4nKyc8L2Rpdj4nKTskKCdib2R5JykuYXBwZW5kKCRkaXYpO3ZhciB3MT0kZGl2LmlubmVyV2lkdGgoKTt2YXIgdzI9JCgnZGl2JywkZGl2KS5pbm5lcldpZHRoKCk7JGRpdi5yZW1vdmUoKTtyZXR1cm4gdzEtdzJ9CmZ1bmN0aW9uIGlzRGF0YXRhYmxlKCR0YWJsZSl7aWYoJHRhYmxlLmRhdGFUYWJsZVNldHRpbmdzKXtmb3IodmFyIGk9MDtpPCR0YWJsZS5kYXRhVGFibGVTZXR0aW5ncy5sZW5ndGg7aSsrKXt2YXIgdGFibGU9JHRhYmxlLmRhdGFUYWJsZVNldHRpbmdzW2ldLm5UYWJsZTtpZigkdGFibGVbMF09PXRhYmxlKXtyZXR1cm4hMH19fQpyZXR1cm4hMX0KZnVuY3Rpb24gdGFibGVXaWR0aCgkdGFibGUsJGZ0aENlbGxzLGlzT3V0ZXIpe3ZhciBmbj1pc091dGVyPyJvdXRlcldpZHRoIjoid2lkdGgiO2lmKGlzVGFibGVXaWR0aEJ1ZyYmJHRhYmxlLmNzcygibWF4LXdpZHRoIikpe3ZhciB3PTA7aWYoaXNPdXRlcil7dys9cGFyc2VJbnQoJHRhYmxlLmNzcygiYm9yZGVyTGVmdCIpLDEwKTt3Kz1wYXJzZUludCgkdGFibGUuY3NzKCJib3JkZXJSaWdodCIpLDEwKX0KZm9yKHZhciBpPTA7aTwkZnRoQ2VsbHMubGVuZ3RoO2krKyl7dys9JGZ0aENlbGxzLmdldChpKS5vZmZzZXRXaWR0aH0KcmV0dXJuIHd9ZWxzZXtyZXR1cm4gJHRhYmxlW2ZuXSgpfX0KJC5mbi5mbG9hdFRoZWFkPWZ1bmN0aW9uKG1hcCl7bWFwPW1hcHx8e307aWYoIXV0aWwpe3V0aWw9d2luZG93Ll98fCQuZmxvYXRUaGVhZC5fO2lmKCF1dGlsKXt0aHJvdyBuZXcgRXJyb3IoImpxdWVyeS5mbG9hdFRoZWFkLXNsaW0uanMgcmVxdWlyZXMgdW5kZXJzY29yZS4gWW91IHNob3VsZCB1c2UgdGhlIG5vbi1saXRlIHZlcnNpb24gc2luY2UgeW91IGRvIG5vdCBoYXZlIHVuZGVyc2NvcmUuIil9fQppZihpZVZlcnNpb248OCl7cmV0dXJuIHRoaXN9CnZhciBtT2JzPW51bGw7aWYodXRpbC5pc0Z1bmN0aW9uKGlzVGFibGVXaWR0aEJ1Zykpe2lzVGFibGVXaWR0aEJ1Zz1pc1RhYmxlV2lkdGhCdWcoKX0KaWYodXRpbC5pc1N0cmluZyhtYXApKXt2YXIgY29tbWFuZD1tYXA7dmFyIHJldD10aGlzO3RoaXMuZmlsdGVyKCd0YWJsZScpLmVhY2goZnVuY3Rpb24oKXt2YXIgJHRoaXM9JCh0aGlzKTt2YXIgb3B0cz0kdGhpcy5kYXRhKCdmbG9hdFRoZWFkLWxhenknKTtpZihvcHRzKXskdGhpcy5mbG9hdFRoZWFkKG9wdHMpfQp2YXIgb2JqPSR0aGlzLmRhdGEoJ2Zsb2F0VGhlYWQtYXR0YWNoZWQnKTtpZihvYmomJnV0aWwuaXNGdW5jdGlvbihvYmpbY29tbWFuZF0pKXt2YXIgcj1vYmpbY29tbWFuZF0oKTtpZih0eXBlb2YgciE9PSd1bmRlZmluZWQnKXtyZXQ9cn19fSk7cmV0dXJuIHJldH0KdmFyIG9wdHM9JC5leHRlbmQoe30sJC5mbG9hdFRoZWFkLmRlZmF1bHRzfHx7fSxtYXApOyQuZWFjaChtYXAsZnVuY3Rpb24oa2V5LHZhbCl7aWYoKCEoa2V5IGluICQuZmxvYXRUaGVhZC5kZWZhdWx0cykpJiZvcHRzLmRlYnVnKXtkZWJ1ZygiVXNlZCBbIitrZXkrIl0ga2V5IHRvIGluaXQgcGx1Z2luLCBidXQgdGhhdCBwYXJhbSBpcyBub3QgYW4gb3B0aW9uIGZvciB0aGUgcGx1Z2luLiBWYWxpZCBvcHRpb25zIGFyZTogIisodXRpbC5rZXlzKCQuZmxvYXRUaGVhZC5kZWZhdWx0cykpLmpvaW4oJywgJykpfX0pO2lmKG9wdHMuZGVidWcpe3ZhciB2PSQuZm4uanF1ZXJ5LnNwbGl0KCIuIik7aWYocGFyc2VJbnQodlswXSwxMCk9PTEmJnBhcnNlSW50KHZbMV0sMTApPD03KXtkZWJ1ZygialF1ZXJ5IHZlcnNpb24gIiskLmZuLmpxdWVyeSsiIGRldGVjdGVkISBUaGlzIHBsdWdpbiBzdXBwb3J0cyAxLjggb3IgYmV0dGVyLCBvciAxLjcueCB3aXRoIGpRdWVyeSBVSSAxLjguMjQgLT4gaHR0cDovL2pxdWVyeXVpLmNvbS9yZXNvdXJjZXMvZG93bmxvYWQvanF1ZXJ5LXVpLTEuOC4yNC56aXAiKX19CnRoaXMuZmlsdGVyKCc6bm90KC4nK29wdHMuZmxvYXRUYWJsZUNsYXNzKycpJykuZWFjaChmdW5jdGlvbigpe3ZhciBmbG9hdFRoZWFkSWQ9dXRpbC51bmlxdWVJZCgpO3ZhciAkdGFibGU9JCh0aGlzKTtpZigkdGFibGUuZGF0YSgnZmxvYXRUaGVhZC1hdHRhY2hlZCcpKXtyZXR1cm4hMH0KaWYoISR0YWJsZS5pcygndGFibGUnKSl7dGhyb3cgbmV3IEVycm9yKCdqUXVlcnkuZmxvYXRUaGVhZCBtdXN0IGJlIHJ1biBvbiBhIHRhYmxlIGVsZW1lbnQuIGV4OiAkKCJ0YWJsZSIpLmZsb2F0VGhlYWQoKTsnKX0KY2FuT2JzZXJ2ZU11dGF0aW9ucz1vcHRzLmF1dG9SZWZsb3cmJmNhbk9ic2VydmVNdXRhdGlvbnM7dmFyICRoZWFkZXI9JHRhYmxlLmNoaWxkcmVuKCd0aGVhZDpmaXJzdCcpO3ZhciAkdGJvZHk9JHRhYmxlLmNoaWxkcmVuKCd0Ym9keTpmaXJzdCcpO2lmKCRoZWFkZXIubGVuZ3RoPT0wfHwkdGJvZHkubGVuZ3RoPT0wKXskdGFibGUuZGF0YSgnZmxvYXRUaGVhZC1sYXp5JyxvcHRzKTskdGFibGUudW5iaW5kKCJyZWZsb3ciKS5vbmUoJ3JlZmxvdycsZnVuY3Rpb24oKXskdGFibGUuZmxvYXRUaGVhZChvcHRzKX0pO3JldHVybn0KaWYoJHRhYmxlLmRhdGEoJ2Zsb2F0VGhlYWQtbGF6eScpKXskdGFibGUudW5iaW5kKCJyZWZsb3ciKX0KJHRhYmxlLmRhdGEoJ2Zsb2F0VGhlYWQtbGF6eScsITEpO3ZhciBoZWFkZXJGbG9hdGVkPSEwO3ZhciBzY3JvbGxpbmdUb3Asc2Nyb2xsaW5nQm90dG9tO3ZhciBzY3JvbGxiYXJPZmZzZXQ9e3ZlcnRpY2FsOjAsaG9yaXpvbnRhbDowfTt2YXIgc2NXaWR0aD1zY3JvbGxiYXJXaWR0aCgpO3ZhciBsYXN0Q29sdW1uQ291bnQ9MDtpZihvcHRzLnNjcm9sbENvbnRhaW5lcj09PSEwKXtvcHRzLnNjcm9sbENvbnRhaW5lcj1nZXRDbG9zZXN0U2Nyb2xsQ29udGFpbmVyfQp2YXIgJHNjcm9sbENvbnRhaW5lcj1vcHRzLnNjcm9sbENvbnRhaW5lcigkdGFibGUpfHwkKFtdKTt2YXIgbG9ja2VkPSRzY3JvbGxDb250YWluZXIubGVuZ3RoPjA7dmFyICRyZXNwb25zaXZlQ29udGFpbmVyPWxvY2tlZD8kKFtdKTpvcHRzLnJlc3BvbnNpdmVDb250YWluZXIoJHRhYmxlKXx8JChbXSk7dmFyIHJlc3BvbnNpdmU9aXNSZXNwb25zaXZlQ29udGFpbmVyQWN0aXZlKCk7dmFyIHVzZUFic29sdXRlUG9zaXRpb25pbmc9bnVsbDtpZih0eXBlb2Ygb3B0cy51c2VBYnNvbHV0ZVBvc2l0aW9uaW5nIT09J3VuZGVmaW5lZCcpe29wdHMucG9zaXRpb249J2F1dG8nO2lmKG9wdHMudXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7b3B0cy5wb3NpdGlvbj1vcHRzLnVzZUFic29sdXRlUG9zaXRpb25pbmc/J2Fic29sdXRlJzonZml4ZWQnfQpkZWJ1Zygib3B0aW9uICd1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nJyBoYXMgYmVlbiByZW1vdmVkIGluIHYxLjMuMCwgdXNlIGBwb3NpdGlvbjonIitvcHRzLnBvc2l0aW9uKyInYCBpbnN0ZWFkLiBTZWUgZG9jcyBmb3IgbW9yZSBpbmZvOiBodHRwOi8vbWtvcnlhay5naXRodWIuaW8vZmxvYXRUaGVhZC8jb3B0aW9ucyIpfQppZih0eXBlb2Ygb3B0cy5zY3JvbGxpbmdUb3AhPT0ndW5kZWZpbmVkJyl7b3B0cy50b3A9b3B0cy5zY3JvbGxpbmdUb3A7ZGVidWcoIm9wdGlvbiAnc2Nyb2xsaW5nVG9wJyBoYXMgYmVlbiByZW5hbWVkIHRvICd0b3AnIGluIHYxLjMuMC4gU2VlIGRvY3MgZm9yIG1vcmUgaW5mbzogaHR0cDovL21rb3J5YWsuZ2l0aHViLmlvL2Zsb2F0VGhlYWQvI29wdGlvbnMiKX0KaWYodHlwZW9mIG9wdHMuc2Nyb2xsaW5nQm90dG9tIT09J3VuZGVmaW5lZCcpe29wdHMuYm90dG9tPW9wdHMuc2Nyb2xsaW5nQm90dG9tO2RlYnVnKCJvcHRpb24gJ3Njcm9sbGluZ0JvdHRvbScgaGFzIGJlZW4gcmVuYW1lZCB0byAnYm90dG9tJyBpbiB2MS4zLjAuIFNlZSBkb2NzIGZvciBtb3JlIGluZm86IGh0dHA6Ly9ta29yeWFrLmdpdGh1Yi5pby9mbG9hdFRoZWFkLyNvcHRpb25zIil9CmlmKG9wdHMucG9zaXRpb249PSdhdXRvJyl7dXNlQWJzb2x1dGVQb3NpdGlvbmluZz1udWxsfWVsc2UgaWYob3B0cy5wb3NpdGlvbj09J2ZpeGVkJyl7dXNlQWJzb2x1dGVQb3NpdGlvbmluZz0hMX1lbHNlIGlmKG9wdHMucG9zaXRpb249PSdhYnNvbHV0ZScpe3VzZUFic29sdXRlUG9zaXRpb25pbmc9ITB9ZWxzZSBpZihvcHRzLmRlYnVnKXtkZWJ1ZygnSW52YWxpZCB2YWx1ZSBnaXZlbiB0byAicG9zaXRpb24iIG9wdGlvbiwgdmFsaWQgaXMgImZpeGVkIiwgImFic29sdXRlIiBhbmQgImF1dG8iLiBZb3UgcGFzc2VkOiAnLG9wdHMucG9zaXRpb24pfQppZih1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nPT1udWxsKXt1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nPWxvY2tlZH0KdmFyICRjYXB0aW9uPSR0YWJsZS5maW5kKCJjYXB0aW9uIik7dmFyIGhhdmVDYXB0aW9uPSRjYXB0aW9uLmxlbmd0aD09MTtpZihoYXZlQ2FwdGlvbil7dmFyIGNhcHRpb25BbGlnblRvcD0oJGNhcHRpb24uY3NzKCJjYXB0aW9uLXNpZGUiKXx8JGNhcHRpb24uYXR0cigiYWxpZ24iKXx8InRvcCIpPT09InRvcCJ9CnZhciAkZnRoR3JwPSQoJzxmdGhmb290IHN0eWxlPSJkaXNwbGF5OnRhYmxlLWZvb3Rlci1ncm91cDtib3JkZXItc3BhY2luZzowO2hlaWdodDowO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTt2aXNpYmlsaXR5OmhpZGRlbiIvPicpO3ZhciB3cmFwcGVkQ29udGFpbmVyPSExO3ZhciAkd3JhcHBlcj0kKFtdKTt2YXIgYWJzb2x1dGVUb0ZpeGVkT25TY3JvbGw9aWVWZXJzaW9uPD05JiYhbG9ja2VkJiZ1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nO3ZhciAkZmxvYXRUYWJsZT0kKCI8dGFibGUvPiIpO3ZhciAkZmxvYXRDb2xHcm91cD0kKCI8Y29sZ3JvdXAvPiIpO3ZhciAkdGFibGVDb2xHcm91cD0kdGFibGUuY2hpbGRyZW4oJ2NvbGdyb3VwOmZpcnN0Jyk7dmFyIGV4aXN0aW5nQ29sR3JvdXA9ITA7aWYoJHRhYmxlQ29sR3JvdXAubGVuZ3RoPT0wKXskdGFibGVDb2xHcm91cD0kKCI8Y29sZ3JvdXAvPiIpO2V4aXN0aW5nQ29sR3JvdXA9ITF9CnZhciAkZnRoUm93PSQoJzxmdGh0ciBzdHlsZT0iZGlzcGxheTp0YWJsZS1yb3c7Ym9yZGVyLXNwYWNpbmc6MDtoZWlnaHQ6MDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2UiLz4nKTt2YXIgJGZsb2F0Q29udGFpbmVyPSQoJzxkaXYgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW47IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9kaXY+Jyk7dmFyIGZsb2F0VGFibGVIaWRkZW49ITE7dmFyICRuZXdIZWFkZXI9JCgiPHRoZWFkLz4iKTt2YXIgJHNpemVyUm93PSQoJzx0ciBjbGFzcz0ic2l6ZS1yb3ciLz4nKTt2YXIgJHNpemVyQ2VsbHM9JChbXSk7dmFyICR0YWJsZUNlbGxzPSQoW10pO3ZhciAkaGVhZGVyQ2VsbHM9JChbXSk7dmFyICRmdGhDZWxscz0kKFtdKTskbmV3SGVhZGVyLmFwcGVuZCgkc2l6ZXJSb3cpOyR0YWJsZS5wcmVwZW5kKCR0YWJsZUNvbEdyb3VwKTtpZihjcmVhdGVFbGVtZW50cyl7JGZ0aEdycC5hcHBlbmQoJGZ0aFJvdyk7JHRhYmxlLmFwcGVuZCgkZnRoR3JwKX0KJGZsb2F0VGFibGUuYXBwZW5kKCRmbG9hdENvbEdyb3VwKTskZmxvYXRDb250YWluZXIuYXBwZW5kKCRmbG9hdFRhYmxlKTtpZihvcHRzLmNvcHlUYWJsZUNsYXNzKXskZmxvYXRUYWJsZS5hdHRyKCdjbGFzcycsJHRhYmxlLmF0dHIoJ2NsYXNzJykpfQokZmxvYXRUYWJsZS5hdHRyKHsnY2VsbHBhZGRpbmcnOiR0YWJsZS5hdHRyKCdjZWxscGFkZGluZycpLCdjZWxsc3BhY2luZyc6JHRhYmxlLmF0dHIoJ2NlbGxzcGFjaW5nJyksJ2JvcmRlcic6JHRhYmxlLmF0dHIoJ2JvcmRlcicpfSk7dmFyIHRhYmxlRGlzcGxheUNzcz0kdGFibGUuY3NzKCdkaXNwbGF5Jyk7JGZsb2F0VGFibGUuY3NzKHsnYm9yZGVyQ29sbGFwc2UnOiR0YWJsZS5jc3MoJ2JvcmRlckNvbGxhcHNlJyksJ2JvcmRlcic6JHRhYmxlLmNzcygnYm9yZGVyJyksJ2Rpc3BsYXknOnRhYmxlRGlzcGxheUNzc30pO2lmKCFsb2NrZWQpeyRmbG9hdFRhYmxlLmNzcygnd2lkdGgnLCdhdXRvJyl9CmlmKHRhYmxlRGlzcGxheUNzcz09J25vbmUnKXtmbG9hdFRhYmxlSGlkZGVuPSEwfQokZmxvYXRUYWJsZS5hZGRDbGFzcyhvcHRzLmZsb2F0VGFibGVDbGFzcykuY3NzKHsnbWFyZ2luJzowLCdib3JkZXItYm90dG9tLXdpZHRoJzowfSk7aWYodXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7dmFyIG1ha2VSZWxhdGl2ZT1mdW5jdGlvbigkY29udGFpbmVyLGFsd2F5c1dyYXApe3ZhciBwb3NpdGlvbkNzcz0kY29udGFpbmVyLmNzcygncG9zaXRpb24nKTt2YXIgcmVsYXRpdmVUb1Njcm9sbENvbnRhaW5lcj0ocG9zaXRpb25Dc3M9PSJyZWxhdGl2ZSJ8fHBvc2l0aW9uQ3NzPT0iYWJzb2x1dGUiKTt2YXIgJGNvbnRhaW5lcldyYXA9JGNvbnRhaW5lcjtpZighcmVsYXRpdmVUb1Njcm9sbENvbnRhaW5lcnx8YWx3YXlzV3JhcCl7dmFyIGNzcz17InBhZGRpbmdMZWZ0IjokY29udGFpbmVyLmNzcygncGFkZGluZ0xlZnQnKSwicGFkZGluZ1JpZ2h0IjokY29udGFpbmVyLmNzcygncGFkZGluZ1JpZ2h0Jyl9OyRmbG9hdENvbnRhaW5lci5jc3MoY3NzKTskY29udGFpbmVyV3JhcD0kY29udGFpbmVyLmRhdGEoJ2Zsb2F0VGhlYWQtY29udGFpbmVyV3JhcCcpfHwkY29udGFpbmVyLndyYXAoIjxkaXYgY2xhc3M9JyIrb3B0cy5mbG9hdFdyYXBwZXJDbGFzcysiJyBzdHlsZT0ncG9zaXRpb246IHJlbGF0aXZlOyBjbGVhcjpib3RoOyc+PC9kaXY+IikucGFyZW50KCk7JGNvbnRhaW5lci5kYXRhKCdmbG9hdFRoZWFkLWNvbnRhaW5lcldyYXAnLCRjb250YWluZXJXcmFwKTt3cmFwcGVkQ29udGFpbmVyPSEwfQpyZXR1cm4gJGNvbnRhaW5lcldyYXB9O2lmKGxvY2tlZCl7JHdyYXBwZXI9bWFrZVJlbGF0aXZlKCRzY3JvbGxDb250YWluZXIsITApOyR3cmFwcGVyLnByZXBlbmQoJGZsb2F0Q29udGFpbmVyKX1lbHNleyR3cmFwcGVyPW1ha2VSZWxhdGl2ZSgkdGFibGUpOyR0YWJsZS5iZWZvcmUoJGZsb2F0Q29udGFpbmVyKX19ZWxzZXskdGFibGUuYmVmb3JlKCRmbG9hdENvbnRhaW5lcil9CiRmbG9hdENvbnRhaW5lci5jc3Moe3Bvc2l0aW9uOnVzZUFic29sdXRlUG9zaXRpb25pbmc/J2Fic29sdXRlJzonZml4ZWQnLG1hcmdpblRvcDowLHRvcDp1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nPzA6J2F1dG8nLHpJbmRleDpvcHRzLnpJbmRleH0pOyRmbG9hdENvbnRhaW5lci5hZGRDbGFzcyhvcHRzLmZsb2F0Q29udGFpbmVyQ2xhc3MpO3VwZGF0ZVNjcm9sbGluZ09mZnNldHMoKTt2YXIgbGF5b3V0Rml4ZWQ9eyd0YWJsZS1sYXlvdXQnOidmaXhlZCd9O3ZhciBsYXlvdXRBdXRvPXsndGFibGUtbGF5b3V0JzokdGFibGUuY3NzKCd0YWJsZUxheW91dCcpfHwnYXV0byd9O3ZhciBvcmlnaW5hbFRhYmxlV2lkdGg9JHRhYmxlWzBdLnN0eWxlLndpZHRofHwiIjt2YXIgb3JpZ2luYWxUYWJsZU1pbldpZHRoPSR0YWJsZS5jc3MoJ21pbldpZHRoJyl8fCIiO2Z1bmN0aW9uIGV2ZW50TmFtZShuYW1lKXtyZXR1cm4gbmFtZSsnLmZ0aC0nK2Zsb2F0VGhlYWRJZCsnLmZsb2F0VEhlYWQnfQpmdW5jdGlvbiBzZXRIZWFkZXJIZWlnaHQoKXt2YXIgaGVhZGVySGVpZ2h0PTA7JGhlYWRlci5jaGlsZHJlbigidHI6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24oKXtoZWFkZXJIZWlnaHQrPSQodGhpcykub3V0ZXJIZWlnaHQoITApfSk7aWYoJHRhYmxlLmNzcygnYm9yZGVyLWNvbGxhcHNlJyk9PSdjb2xsYXBzZScpe3ZhciB0YWJsZUJvcmRlclRvcEhlaWdodD1wYXJzZUludCgkdGFibGUuY3NzKCdib3JkZXItdG9wLXdpZHRoJyksMTApO3ZhciBjZWxsQm9yZGVyVG9wSGVpZ2h0PXBhcnNlSW50KCR0YWJsZS5maW5kKCJ0aGVhZCB0cjpmaXJzdCIpLmZpbmQoIj4qOmZpcnN0IikuY3NzKCdib3JkZXItdG9wLXdpZHRoJyksMTApO2lmKHRhYmxlQm9yZGVyVG9wSGVpZ2h0PmNlbGxCb3JkZXJUb3BIZWlnaHQpe2hlYWRlckhlaWdodC09KHRhYmxlQm9yZGVyVG9wSGVpZ2h0LzIpfX0KJHNpemVyUm93Lm91dGVySGVpZ2h0KGhlYWRlckhlaWdodCk7JHNpemVyQ2VsbHMub3V0ZXJIZWlnaHQoaGVhZGVySGVpZ2h0KX0KZnVuY3Rpb24gc2V0RmxvYXRXaWR0aCgpe3ZhciB0dz10YWJsZVdpZHRoKCR0YWJsZSwkZnRoQ2VsbHMsITApO3ZhciAkY29udGFpbmVyPXJlc3BvbnNpdmU/JHJlc3BvbnNpdmVDb250YWluZXI6JHNjcm9sbENvbnRhaW5lcjt2YXIgd2lkdGg9JGNvbnRhaW5lci53aWR0aCgpfHx0dzt2YXIgZmxvYXRDb250YWluZXJXaWR0aD0kY29udGFpbmVyLmNzcygib3ZlcmZsb3cteSIpIT0naGlkZGVuJz93aWR0aC1zY3JvbGxiYXJPZmZzZXQudmVydGljYWw6d2lkdGg7JGZsb2F0Q29udGFpbmVyLndpZHRoKGZsb2F0Q29udGFpbmVyV2lkdGgpO2lmKGxvY2tlZCl7dmFyIHBlcmNlbnQ9MTAwKnR3LyhmbG9hdENvbnRhaW5lcldpZHRoKTskZmxvYXRUYWJsZS5jc3MoJ3dpZHRoJyxwZXJjZW50KyclJyl9ZWxzZXskZmxvYXRUYWJsZS5vdXRlcldpZHRoKHR3KX19CmZ1bmN0aW9uIHVwZGF0ZVNjcm9sbGluZ09mZnNldHMoKXtzY3JvbGxpbmdUb3A9KHV0aWwuaXNGdW5jdGlvbihvcHRzLnRvcCk/b3B0cy50b3AoJHRhYmxlKTpvcHRzLnRvcCl8fDA7c2Nyb2xsaW5nQm90dG9tPSh1dGlsLmlzRnVuY3Rpb24ob3B0cy5ib3R0b20pP29wdHMuYm90dG9tKCR0YWJsZSk6b3B0cy5ib3R0b20pfHwwfQpmdW5jdGlvbiBjb2x1bW5OdW0oKXt2YXIgY291bnQ7dmFyICRoZWFkZXJDb2x1bW5zPSRoZWFkZXIuZmluZChvcHRzLmhlYWRlckNlbGxTZWxlY3Rvcik7aWYoZXhpc3RpbmdDb2xHcm91cCl7Y291bnQ9JHRhYmxlQ29sR3JvdXAuZmluZCgnY29sJykubGVuZ3RofWVsc2V7Y291bnQ9MDskaGVhZGVyQ29sdW1ucy5lYWNoKGZ1bmN0aW9uKCl7Y291bnQrPXBhcnNlSW50KCgkKHRoaXMpLmF0dHIoJ2NvbHNwYW4nKXx8MSksMTApfSl9CmlmKGNvdW50IT1sYXN0Q29sdW1uQ291bnQpe2xhc3RDb2x1bW5Db3VudD1jb3VudDt2YXIgY2VsbHM9W10sY29scz1bXSxwc3VlZG89W10sY29udGVudDtmb3IodmFyIHg9MDt4PGNvdW50O3grKyl7aWYob3B0cy5lbmFibGVBcmlhJiYoY29udGVudD0kaGVhZGVyQ29sdW1ucy5lcSh4KS50ZXh0KCkpKXtjZWxscy5wdXNoKCc8dGggc2NvcGU9ImNvbCIgY2xhc3M9ImZsb2F0VGhlYWQtY29sIj4nK2NvbnRlbnQrJzwvdGg+Jyl9ZWxzZXtjZWxscy5wdXNoKCc8dGggY2xhc3M9ImZsb2F0VGhlYWQtY29sIi8+Jyl9CmNvbHMucHVzaCgnPGNvbC8+Jyk7cHN1ZWRvLnB1c2goIjxmdGh0ZCBzdHlsZT0nZGlzcGxheTp0YWJsZS1jZWxsO2hlaWdodDowO3dpZHRoOmF1dG87Jy8+Iil9CmNvbHM9Y29scy5qb2luKCcnKTtjZWxscz1jZWxscy5qb2luKCcnKTtpZihjcmVhdGVFbGVtZW50cyl7cHN1ZWRvPXBzdWVkby5qb2luKCcnKTskZnRoUm93Lmh0bWwocHN1ZWRvKTskZnRoQ2VsbHM9JGZ0aFJvdy5maW5kKCdmdGh0ZCcpfQokc2l6ZXJSb3cuaHRtbChjZWxscyk7JHNpemVyQ2VsbHM9JHNpemVyUm93LmZpbmQoInRoIik7aWYoIWV4aXN0aW5nQ29sR3JvdXApeyR0YWJsZUNvbEdyb3VwLmh0bWwoY29scyl9CiR0YWJsZUNlbGxzPSR0YWJsZUNvbEdyb3VwLmZpbmQoJ2NvbCcpOyRmbG9hdENvbEdyb3VwLmh0bWwoY29scyk7JGhlYWRlckNlbGxzPSRmbG9hdENvbEdyb3VwLmZpbmQoImNvbCIpfQpyZXR1cm4gY291bnR9CmZ1bmN0aW9uIHJlZmxvYXQoKXtpZighaGVhZGVyRmxvYXRlZCl7aGVhZGVyRmxvYXRlZD0hMDtpZih1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nKXt2YXIgdHc9dGFibGVXaWR0aCgkdGFibGUsJGZ0aENlbGxzLCEwKTt2YXIgd3JhcHBlcldpZHRoPSR3cmFwcGVyLndpZHRoKCk7aWYodHc+d3JhcHBlcldpZHRoKXskdGFibGUuY3NzKCdtaW5XaWR0aCcsdHcpfX0KJHRhYmxlLmNzcyhsYXlvdXRGaXhlZCk7JGZsb2F0VGFibGUuY3NzKGxheW91dEZpeGVkKTskZmxvYXRUYWJsZS5hcHBlbmQoJGhlYWRlcik7JHRib2R5LmJlZm9yZSgkbmV3SGVhZGVyKTtzZXRIZWFkZXJIZWlnaHQoKX19CmZ1bmN0aW9uIHVuZmxvYXQoKXtpZihoZWFkZXJGbG9hdGVkKXtoZWFkZXJGbG9hdGVkPSExO2lmKHVzZUFic29sdXRlUG9zaXRpb25pbmcpeyR0YWJsZS53aWR0aChvcmlnaW5hbFRhYmxlV2lkdGgpfQokbmV3SGVhZGVyLmRldGFjaCgpOyR0YWJsZS5wcmVwZW5kKCRoZWFkZXIpOyR0YWJsZS5jc3MobGF5b3V0QXV0byk7JGZsb2F0VGFibGUuY3NzKGxheW91dEF1dG8pOyR0YWJsZS5jc3MoJ21pbldpZHRoJyxvcmlnaW5hbFRhYmxlTWluV2lkdGgpOyR0YWJsZS5jc3MoJ21pbldpZHRoJyx0YWJsZVdpZHRoKCR0YWJsZSwkZnRoQ2VsbHMpKX19CnZhciBpc0hlYWRlckZsb2F0aW5nTG9naWNhbD0hMTtmdW5jdGlvbiB0cmlnZ2VyRmxvYXRFdmVudChpc0Zsb2F0aW5nKXtpZihpc0hlYWRlckZsb2F0aW5nTG9naWNhbCE9aXNGbG9hdGluZyl7aXNIZWFkZXJGbG9hdGluZ0xvZ2ljYWw9aXNGbG9hdGluZzskdGFibGUudHJpZ2dlckhhbmRsZXIoImZsb2F0VGhlYWQiLFtpc0Zsb2F0aW5nLCRmbG9hdENvbnRhaW5lcl0pfX0KZnVuY3Rpb24gY2hhbmdlUG9zaXRpb25pbmcoaXNBYnNvbHV0ZSl7aWYodXNlQWJzb2x1dGVQb3NpdGlvbmluZyE9aXNBYnNvbHV0ZSl7dXNlQWJzb2x1dGVQb3NpdGlvbmluZz1pc0Fic29sdXRlOyRmbG9hdENvbnRhaW5lci5jc3Moe3Bvc2l0aW9uOnVzZUFic29sdXRlUG9zaXRpb25pbmc/J2Fic29sdXRlJzonZml4ZWQnfSl9fQpmdW5jdGlvbiBnZXRTaXppbmdSb3coJHRhYmxlLCRjb2xzLCRmdGhDZWxscyxpZVZlcnNpb24pe2lmKGNyZWF0ZUVsZW1lbnRzKXtyZXR1cm4gJGZ0aENlbGxzfWVsc2UgaWYoaWVWZXJzaW9uKXtyZXR1cm4gb3B0cy5nZXRTaXppbmdSb3coJHRhYmxlLCRjb2xzLCRmdGhDZWxscyl9ZWxzZXtyZXR1cm4gJGNvbHN9fQpmdW5jdGlvbiByZWZsb3coKXt2YXIgaTt2YXIgbnVtQ29scz1jb2x1bW5OdW0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgc2Nyb2xsTGVmdD0kZmxvYXRDb250YWluZXIuc2Nyb2xsTGVmdCgpOyR0YWJsZUNlbGxzPSR0YWJsZUNvbEdyb3VwLmZpbmQoJ2NvbCcpO3ZhciAkcm93Q2VsbHM9Z2V0U2l6aW5nUm93KCR0YWJsZSwkdGFibGVDZWxscywkZnRoQ2VsbHMsaWVWZXJzaW9uKTtpZigkcm93Q2VsbHMubGVuZ3RoPT1udW1Db2xzJiZudW1Db2xzPjApe2lmKCFleGlzdGluZ0NvbEdyb3VwKXtmb3IoaT0wO2k8bnVtQ29scztpKyspeyR0YWJsZUNlbGxzLmVxKGkpLmNzcygnd2lkdGgnLCcnKX19CnVuZmxvYXQoKTt2YXIgd2lkdGhzPVtdO2ZvcihpPTA7aTxudW1Db2xzO2krKyl7d2lkdGhzW2ldPWdldE9mZnNldFdpZHRoKCRyb3dDZWxscy5nZXQoaSkpfQpmb3IoaT0wO2k8bnVtQ29scztpKyspeyRoZWFkZXJDZWxscy5lcShpKS53aWR0aCh3aWR0aHNbaV0pOyR0YWJsZUNlbGxzLmVxKGkpLndpZHRoKHdpZHRoc1tpXSl9CnJlZmxvYXQoKX1lbHNleyRmbG9hdFRhYmxlLmFwcGVuZCgkaGVhZGVyKTskdGFibGUuY3NzKGxheW91dEF1dG8pOyRmbG9hdFRhYmxlLmNzcyhsYXlvdXRBdXRvKTtzZXRIZWFkZXJIZWlnaHQoKX0KJGZsb2F0Q29udGFpbmVyLnNjcm9sbExlZnQoc2Nyb2xsTGVmdCk7JHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJyZWZsb3dlZCIsWyRmbG9hdENvbnRhaW5lcl0pfX0KZnVuY3Rpb24gZmxvYXRDb250YWluZXJCb3JkZXJXaWR0aChzaWRlKXt2YXIgYm9yZGVyPSRzY3JvbGxDb250YWluZXIuY3NzKCJib3JkZXItIitzaWRlKyItd2lkdGgiKTt2YXIgdz0wO2lmKGJvcmRlciYmfmJvcmRlci5pbmRleE9mKCdweCcpKXt3PXBhcnNlSW50KGJvcmRlciwxMCl9CnJldHVybiB3fQpmdW5jdGlvbiBpc1Jlc3BvbnNpdmVDb250YWluZXJBY3RpdmUoKXtyZXR1cm4gJHJlc3BvbnNpdmVDb250YWluZXIuY3NzKCJvdmVyZmxvdy14Iik9PSdhdXRvJ30KZnVuY3Rpb24gY2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3NGbigpe3ZhciBzY3JvbGxpbmdDb250YWluZXJUb3A9JHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AoKTt2YXIgZmxvYXRFbmQ7dmFyIHRhYmxlQ29udGFpbmVyR2FwPTA7dmFyIGNhcHRpb25IZWlnaHQ9aGF2ZUNhcHRpb24/JGNhcHRpb24ub3V0ZXJIZWlnaHQoITApOjA7dmFyIGNhcHRpb25TY3JvbGxPZmZzZXQ9Y2FwdGlvbkFsaWduVG9wP2NhcHRpb25IZWlnaHQ6LWNhcHRpb25IZWlnaHQ7dmFyIGZsb2F0Q29udGFpbmVySGVpZ2h0PSRmbG9hdENvbnRhaW5lci5oZWlnaHQoKTt2YXIgdGFibGVPZmZzZXQ9JHRhYmxlLm9mZnNldCgpO3ZhciB0YWJsZUxlZnRHYXA9MDt2YXIgdGFibGVUb3BHYXA9MDtpZihsb2NrZWQpe3ZhciBjb250YWluZXJPZmZzZXQ9JHNjcm9sbENvbnRhaW5lci5vZmZzZXQoKTt0YWJsZUNvbnRhaW5lckdhcD10YWJsZU9mZnNldC50b3AtY29udGFpbmVyT2Zmc2V0LnRvcCtzY3JvbGxpbmdDb250YWluZXJUb3A7aWYoaGF2ZUNhcHRpb24mJmNhcHRpb25BbGlnblRvcCl7dGFibGVDb250YWluZXJHYXArPWNhcHRpb25IZWlnaHR9CnRhYmxlTGVmdEdhcD1mbG9hdENvbnRhaW5lckJvcmRlcldpZHRoKCdsZWZ0Jyk7dGFibGVUb3BHYXA9ZmxvYXRDb250YWluZXJCb3JkZXJXaWR0aCgndG9wJyk7dGFibGVDb250YWluZXJHYXAtPXRhYmxlVG9wR2FwfWVsc2V7ZmxvYXRFbmQ9dGFibGVPZmZzZXQudG9wLXNjcm9sbGluZ1RvcC1mbG9hdENvbnRhaW5lckhlaWdodCtzY3JvbGxpbmdCb3R0b20rc2Nyb2xsYmFyT2Zmc2V0Lmhvcml6b250YWx9CnZhciB3aW5kb3dUb3A9JHdpbmRvdy5zY3JvbGxUb3AoKTt2YXIgd2luZG93TGVmdD0kd2luZG93LnNjcm9sbExlZnQoKTt2YXIgc2Nyb2xsQ29udGFpbmVyTGVmdD0oaXNSZXNwb25zaXZlQ29udGFpbmVyQWN0aXZlKCk/JHJlc3BvbnNpdmVDb250YWluZXI6JHNjcm9sbENvbnRhaW5lcikuc2Nyb2xsTGVmdCgpO3JldHVybiBmdW5jdGlvbihldmVudFR5cGUpe3Jlc3BvbnNpdmU9aXNSZXNwb25zaXZlQ29udGFpbmVyQWN0aXZlKCk7dmFyIGlzVGFibGVIaWRkZW49JHRhYmxlWzBdLm9mZnNldFdpZHRoPD0wJiYkdGFibGVbMF0ub2Zmc2V0SGVpZ2h0PD0wO2lmKCFpc1RhYmxlSGlkZGVuJiZmbG9hdFRhYmxlSGlkZGVuKXtmbG9hdFRhYmxlSGlkZGVuPSExO3NldFRpbWVvdXQoZnVuY3Rpb24oKXskdGFibGUudHJpZ2dlckhhbmRsZXIoInJlZmxvdyIpfSwxKTtyZXR1cm4gbnVsbH0KaWYoaXNUYWJsZUhpZGRlbil7ZmxvYXRUYWJsZUhpZGRlbj0hMDtpZighdXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7cmV0dXJuIG51bGx9fQppZihldmVudFR5cGU9PSd3aW5kb3dTY3JvbGwnKXt3aW5kb3dUb3A9JHdpbmRvdy5zY3JvbGxUb3AoKTt3aW5kb3dMZWZ0PSR3aW5kb3cuc2Nyb2xsTGVmdCgpfWVsc2UgaWYoZXZlbnRUeXBlPT0nY29udGFpbmVyU2Nyb2xsJyl7aWYoJHJlc3BvbnNpdmVDb250YWluZXIubGVuZ3RoKXtpZighcmVzcG9uc2l2ZSl7cmV0dXJufQpzY3JvbGxDb250YWluZXJMZWZ0PSRyZXNwb25zaXZlQ29udGFpbmVyLnNjcm9sbExlZnQoKX1lbHNle3Njcm9sbGluZ0NvbnRhaW5lclRvcD0kc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCgpO3Njcm9sbENvbnRhaW5lckxlZnQ9JHNjcm9sbENvbnRhaW5lci5zY3JvbGxMZWZ0KCl9fWVsc2UgaWYoZXZlbnRUeXBlIT0naW5pdCcpe3dpbmRvd1RvcD0kd2luZG93LnNjcm9sbFRvcCgpO3dpbmRvd0xlZnQ9JHdpbmRvdy5zY3JvbGxMZWZ0KCk7c2Nyb2xsaW5nQ29udGFpbmVyVG9wPSRzY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wKCk7c2Nyb2xsQ29udGFpbmVyTGVmdD0ocmVzcG9uc2l2ZT8kcmVzcG9uc2l2ZUNvbnRhaW5lcjokc2Nyb2xsQ29udGFpbmVyKS5zY3JvbGxMZWZ0KCl9CmlmKGlzV2Via2l0JiYod2luZG93VG9wPDB8fHdpbmRvd0xlZnQ8MCkpe3JldHVybn0KaWYoYWJzb2x1dGVUb0ZpeGVkT25TY3JvbGwpe2lmKGV2ZW50VHlwZT09J3dpbmRvd1Njcm9sbERvbmUnKXtjaGFuZ2VQb3NpdGlvbmluZyghMCl9ZWxzZXtjaGFuZ2VQb3NpdGlvbmluZyghMSl9fWVsc2UgaWYoZXZlbnRUeXBlPT0nd2luZG93U2Nyb2xsRG9uZScpe3JldHVybiBudWxsfQp0YWJsZU9mZnNldD0kdGFibGUub2Zmc2V0KCk7aWYoaGF2ZUNhcHRpb24mJmNhcHRpb25BbGlnblRvcCl7dGFibGVPZmZzZXQudG9wKz1jYXB0aW9uSGVpZ2h0fQp2YXIgdG9wLGxlZnQ7dmFyIHRhYmxlSGVpZ2h0PSR0YWJsZS5vdXRlckhlaWdodCgpO2lmKGxvY2tlZCYmdXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7aWYodGFibGVDb250YWluZXJHYXA+PXNjcm9sbGluZ0NvbnRhaW5lclRvcCl7dmFyIGdhcD10YWJsZUNvbnRhaW5lckdhcC1zY3JvbGxpbmdDb250YWluZXJUb3ArdGFibGVUb3BHYXA7dG9wPWdhcD4wP2dhcDowO3RyaWdnZXJGbG9hdEV2ZW50KCExKX1lbHNle3RvcD13cmFwcGVkQ29udGFpbmVyP3RhYmxlVG9wR2FwOnNjcm9sbGluZ0NvbnRhaW5lclRvcDt0cmlnZ2VyRmxvYXRFdmVudCghMCl9CmxlZnQ9dGFibGVMZWZ0R2FwfWVsc2UgaWYoIWxvY2tlZCYmdXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7aWYod2luZG93VG9wPmZsb2F0RW5kK3RhYmxlSGVpZ2h0K2NhcHRpb25TY3JvbGxPZmZzZXQpe3RvcD10YWJsZUhlaWdodC1mbG9hdENvbnRhaW5lckhlaWdodCtjYXB0aW9uU2Nyb2xsT2Zmc2V0fWVsc2UgaWYodGFibGVPZmZzZXQudG9wPj13aW5kb3dUb3Arc2Nyb2xsaW5nVG9wKXt0b3A9MDt1bmZsb2F0KCk7dHJpZ2dlckZsb2F0RXZlbnQoITEpfWVsc2V7dG9wPXNjcm9sbGluZ1RvcCt3aW5kb3dUb3AtdGFibGVPZmZzZXQudG9wK3RhYmxlQ29udGFpbmVyR2FwKyhjYXB0aW9uQWxpZ25Ub3A/Y2FwdGlvbkhlaWdodDowKTtyZWZsb2F0KCk7dHJpZ2dlckZsb2F0RXZlbnQoITApfQpsZWZ0PXNjcm9sbENvbnRhaW5lckxlZnR9ZWxzZSBpZihsb2NrZWQmJiF1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nKXtpZih0YWJsZUNvbnRhaW5lckdhcD5zY3JvbGxpbmdDb250YWluZXJUb3B8fHNjcm9sbGluZ0NvbnRhaW5lclRvcC10YWJsZUNvbnRhaW5lckdhcD50YWJsZUhlaWdodCl7dG9wPXRhYmxlT2Zmc2V0LnRvcC13aW5kb3dUb3A7dW5mbG9hdCgpO3RyaWdnZXJGbG9hdEV2ZW50KCExKX1lbHNle3RvcD10YWJsZU9mZnNldC50b3Arc2Nyb2xsaW5nQ29udGFpbmVyVG9wLXdpbmRvd1RvcC10YWJsZUNvbnRhaW5lckdhcDtyZWZsb2F0KCk7dHJpZ2dlckZsb2F0RXZlbnQoITApfQpsZWZ0PXRhYmxlT2Zmc2V0LmxlZnQrc2Nyb2xsQ29udGFpbmVyTGVmdC13aW5kb3dMZWZ0fWVsc2UgaWYoIWxvY2tlZCYmIXVzZUFic29sdXRlUG9zaXRpb25pbmcpe2lmKHdpbmRvd1RvcD5mbG9hdEVuZCt0YWJsZUhlaWdodCtjYXB0aW9uU2Nyb2xsT2Zmc2V0KXt0b3A9dGFibGVIZWlnaHQrc2Nyb2xsaW5nVG9wLXdpbmRvd1RvcCtmbG9hdEVuZCtjYXB0aW9uU2Nyb2xsT2Zmc2V0fWVsc2UgaWYodGFibGVPZmZzZXQudG9wPndpbmRvd1RvcCtzY3JvbGxpbmdUb3Ape3RvcD10YWJsZU9mZnNldC50b3Atd2luZG93VG9wO3JlZmxvYXQoKTt0cmlnZ2VyRmxvYXRFdmVudCghMSl9ZWxzZXt0b3A9c2Nyb2xsaW5nVG9wO3RyaWdnZXJGbG9hdEV2ZW50KCEwKX0KbGVmdD10YWJsZU9mZnNldC5sZWZ0K3Njcm9sbENvbnRhaW5lckxlZnQtd2luZG93TGVmdH0KcmV0dXJue3RvcDp0b3AsbGVmdDpsZWZ0fX19CmZ1bmN0aW9uIHJlcG9zaXRpb25GbG9hdENvbnRhaW5lckZuKCl7dmFyIG9sZFRvcD1udWxsO3ZhciBvbGRMZWZ0PW51bGw7dmFyIG9sZFNjcm9sbExlZnQ9bnVsbDtyZXR1cm4gZnVuY3Rpb24ocG9zLHNldFdpZHRoLHNldEhlaWdodCl7aWYocG9zIT1udWxsJiYob2xkVG9wIT1wb3MudG9wfHxvbGRMZWZ0IT1wb3MubGVmdCkpeyRmbG9hdENvbnRhaW5lci5jc3Moe3RvcDpwb3MudG9wLGxlZnQ6cG9zLmxlZnR9KTtvbGRUb3A9cG9zLnRvcDtvbGRMZWZ0PXBvcy5sZWZ0fQppZihzZXRXaWR0aCl7c2V0RmxvYXRXaWR0aCgpfQppZihzZXRIZWlnaHQpe3NldEhlYWRlckhlaWdodCgpfQp2YXIgc2Nyb2xsTGVmdD0ocmVzcG9uc2l2ZT8kcmVzcG9uc2l2ZUNvbnRhaW5lcjokc2Nyb2xsQ29udGFpbmVyKS5zY3JvbGxMZWZ0KCk7aWYoIXVzZUFic29sdXRlUG9zaXRpb25pbmd8fG9sZFNjcm9sbExlZnQhPXNjcm9sbExlZnQpeyRmbG9hdENvbnRhaW5lci5zY3JvbGxMZWZ0KHNjcm9sbExlZnQpO29sZFNjcm9sbExlZnQ9c2Nyb2xsTGVmdH19fQpmdW5jdGlvbiBjYWxjdWxhdGVTY3JvbGxCYXJTaXplKCl7aWYoJHNjcm9sbENvbnRhaW5lci5sZW5ndGgpe2lmKG9wdHMuc3VwcG9ydCYmb3B0cy5zdXBwb3J0LnBlcmZlY3RTY3JvbGxiYXImJiRzY3JvbGxDb250YWluZXIuZGF0YSgpLnBlcmZlY3RTY3JvbGxiYXIpe3Njcm9sbGJhck9mZnNldD17aG9yaXpvbnRhbDowLHZlcnRpY2FsOjB9fWVsc2V7aWYoJHNjcm9sbENvbnRhaW5lci5jc3MoJ292ZXJmbG93LXgnKT09J3Njcm9sbCcpe3Njcm9sbGJhck9mZnNldC5ob3Jpem9udGFsPXNjV2lkdGh9ZWxzZXt2YXIgc3c9JHNjcm9sbENvbnRhaW5lci53aWR0aCgpLHR3PXRhYmxlV2lkdGgoJHRhYmxlLCRmdGhDZWxscyk7dmFyIG9mZnNldHY9c2g8dGg/c2NXaWR0aDowO3Njcm9sbGJhck9mZnNldC5ob3Jpem9udGFsPXN3LW9mZnNldHY8dHc/c2NXaWR0aDowfQppZigkc2Nyb2xsQ29udGFpbmVyLmNzcygnb3ZlcmZsb3cteScpPT0nc2Nyb2xsJyl7c2Nyb2xsYmFyT2Zmc2V0LnZlcnRpY2FsPXNjV2lkdGh9ZWxzZXt2YXIgc2g9JHNjcm9sbENvbnRhaW5lci5oZWlnaHQoKSx0aD0kdGFibGUuaGVpZ2h0KCk7dmFyIG9mZnNldGg9c3c8dHc/c2NXaWR0aDowO3Njcm9sbGJhck9mZnNldC52ZXJ0aWNhbD1zaC1vZmZzZXRoPHRoP3NjV2lkdGg6MH19fX0KY2FsY3VsYXRlU2Nyb2xsQmFyU2l6ZSgpO3ZhciBmbG93O3ZhciBlbnN1cmVSZWZsb3c9ZnVuY3Rpb24oKXtmbG93PXJlZmxvdygpO2Zsb3coKX07ZW5zdXJlUmVmbG93KCk7dmFyIGNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zPWNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zRm4oKTt2YXIgcmVwb3NpdGlvbkZsb2F0Q29udGFpbmVyPXJlcG9zaXRpb25GbG9hdENvbnRhaW5lckZuKCk7cmVwb3NpdGlvbkZsb2F0Q29udGFpbmVyKGNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zKCdpbml0JyksITApO3ZhciB3aW5kb3dTY3JvbGxEb25lRXZlbnQ9dXRpbC5kZWJvdW5jZShmdW5jdGlvbigpe3JlcG9zaXRpb25GbG9hdENvbnRhaW5lcihjYWxjdWxhdGVGbG9hdENvbnRhaW5lclBvcygnd2luZG93U2Nyb2xsRG9uZScpLCExKX0sMSk7dmFyIHdpbmRvd1Njcm9sbEV2ZW50PWZ1bmN0aW9uKCl7cmVwb3NpdGlvbkZsb2F0Q29udGFpbmVyKGNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zKCd3aW5kb3dTY3JvbGwnKSwhMSk7aWYoYWJzb2x1dGVUb0ZpeGVkT25TY3JvbGwpe3dpbmRvd1Njcm9sbERvbmVFdmVudCgpfX07dmFyIGNvbnRhaW5lclNjcm9sbEV2ZW50PWZ1bmN0aW9uKCl7cmVwb3NpdGlvbkZsb2F0Q29udGFpbmVyKGNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zKCdjb250YWluZXJTY3JvbGwnKSwhMSl9O3ZhciB3aW5kb3dSZXNpemVFdmVudD1mdW5jdGlvbigpe2lmKCR0YWJsZS5pcygiOmhpZGRlbiIpKXtyZXR1cm59CnVwZGF0ZVNjcm9sbGluZ09mZnNldHMoKTtjYWxjdWxhdGVTY3JvbGxCYXJTaXplKCk7ZW5zdXJlUmVmbG93KCk7Y2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3M9Y2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3NGbigpO3JlcG9zaXRpb25GbG9hdENvbnRhaW5lcj1yZXBvc2l0aW9uRmxvYXRDb250YWluZXJGbigpO3JlcG9zaXRpb25GbG9hdENvbnRhaW5lcihjYWxjdWxhdGVGbG9hdENvbnRhaW5lclBvcygncmVzaXplJyksITAsITApfTt2YXIgcmVmbG93RXZlbnQ9dXRpbC5kZWJvdW5jZShmdW5jdGlvbigpe2lmKCR0YWJsZS5pcygiOmhpZGRlbiIpKXtyZXR1cm59CmNhbGN1bGF0ZVNjcm9sbEJhclNpemUoKTt1cGRhdGVTY3JvbGxpbmdPZmZzZXRzKCk7ZW5zdXJlUmVmbG93KCk7Y2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3M9Y2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3NGbigpO3JlcG9zaXRpb25GbG9hdENvbnRhaW5lcihjYWxjdWxhdGVGbG9hdENvbnRhaW5lclBvcygncmVmbG93JyksITApfSwxKTt2YXIgYmVmb3JlUHJpbnQ9ZnVuY3Rpb24oKXskdGFibGUuZmxvYXRUaGVhZCgnZGVzdHJveScsWyEwXSl9O3ZhciBhZnRlclByaW50PWZ1bmN0aW9uKCl7JHRhYmxlLmZsb2F0VGhlYWQob3B0cyl9O3ZhciBwcmludEV2ZW50PWZ1bmN0aW9uKG1xbCl7aWYobXFsLm1hdGNoZXMpe2JlZm9yZVByaW50KCl9ZWxzZXthZnRlclByaW50KCl9fTtpZih3aW5kb3cubWF0Y2hNZWRpYSl7d2luZG93Lm1hdGNoTWVkaWEoInByaW50IikuYWRkTGlzdGVuZXIocHJpbnRFdmVudCl9ZWxzZXskd2luZG93Lm9uKCdiZWZvcmVwcmludCcsYmVmb3JlUHJpbnQpOyR3aW5kb3cub24oJ2FmdGVycHJpbnQnLGFmdGVyUHJpbnQpfQppZihsb2NrZWQpe2lmKHVzZUFic29sdXRlUG9zaXRpb25pbmcpeyRzY3JvbGxDb250YWluZXIub24oZXZlbnROYW1lKCdzY3JvbGwnKSxjb250YWluZXJTY3JvbGxFdmVudCl9ZWxzZXskc2Nyb2xsQ29udGFpbmVyLm9uKGV2ZW50TmFtZSgnc2Nyb2xsJyksY29udGFpbmVyU2Nyb2xsRXZlbnQpOyR3aW5kb3cub24oZXZlbnROYW1lKCdzY3JvbGwnKSx3aW5kb3dTY3JvbGxFdmVudCl9fWVsc2V7JHJlc3BvbnNpdmVDb250YWluZXIub24oZXZlbnROYW1lKCdzY3JvbGwnKSxjb250YWluZXJTY3JvbGxFdmVudCk7JHdpbmRvdy5vbihldmVudE5hbWUoJ3Njcm9sbCcpLHdpbmRvd1Njcm9sbEV2ZW50KX0KJHdpbmRvdy5vbihldmVudE5hbWUoJ2xvYWQnKSxyZWZsb3dFdmVudCk7d2luZG93UmVzaXplKGV2ZW50TmFtZSgncmVzaXplJyksd2luZG93UmVzaXplRXZlbnQpOyR0YWJsZS5vbigncmVmbG93JyxyZWZsb3dFdmVudCk7aWYob3B0cy5zdXBwb3J0JiZvcHRzLnN1cHBvcnQuZGF0YXRhYmxlcyYmaXNEYXRhdGFibGUoJHRhYmxlKSl7JHRhYmxlLm9uKCdmaWx0ZXInLHJlZmxvd0V2ZW50KS5vbignc29ydCcscmVmbG93RXZlbnQpLm9uKCdwYWdlJyxyZWZsb3dFdmVudCl9CmlmKG9wdHMuc3VwcG9ydCYmb3B0cy5zdXBwb3J0LmJvb3RzdHJhcCl7JHdpbmRvdy5vbihldmVudE5hbWUoJ3Nob3duLmJzLnRhYicpLHJlZmxvd0V2ZW50KX0KaWYob3B0cy5zdXBwb3J0JiZvcHRzLnN1cHBvcnQuanF1ZXJ5VUkpeyR3aW5kb3cub24oZXZlbnROYW1lKCd0YWJzYWN0aXZhdGUnKSxyZWZsb3dFdmVudCl9CmlmKGNhbk9ic2VydmVNdXRhdGlvbnMpe3ZhciBtdXRhdGlvbkVsZW1lbnQ9bnVsbDtpZih1dGlsLmlzRnVuY3Rpb24ob3B0cy5hdXRvUmVmbG93KSl7bXV0YXRpb25FbGVtZW50PW9wdHMuYXV0b1JlZmxvdygkdGFibGUsJHNjcm9sbENvbnRhaW5lcil9CmlmKCFtdXRhdGlvbkVsZW1lbnQpe211dGF0aW9uRWxlbWVudD0kc2Nyb2xsQ29udGFpbmVyLmxlbmd0aD8kc2Nyb2xsQ29udGFpbmVyWzBdOiR0YWJsZVswXX0KbU9icz1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihlKXt2YXIgd2FzVGFibGVSZWxhdGVkPWZ1bmN0aW9uKG5vZGVzKXtyZXR1cm4gbm9kZXMmJm5vZGVzWzBdJiYobm9kZXNbMF0ubm9kZU5hbWU9PSJUSEVBRCJ8fG5vZGVzWzBdLm5vZGVOYW1lPT0iVEQifHxub2Rlc1swXS5ub2RlTmFtZT09IlRIIil9O2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXtpZighKHdhc1RhYmxlUmVsYXRlZChlW2ldLmFkZGVkTm9kZXMpfHx3YXNUYWJsZVJlbGF0ZWQoZVtpXS5yZW1vdmVkTm9kZXMpKSl7cmVmbG93RXZlbnQoKTticmVha319fSk7bU9icy5vYnNlcnZlKG11dGF0aW9uRWxlbWVudCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KX0KJHRhYmxlLmRhdGEoJ2Zsb2F0VGhlYWQtYXR0YWNoZWQnLHtkZXN0cm95OmZ1bmN0aW9uKGUsaXNQcmludEV2ZW50KXt2YXIgbnM9Jy5mdGgtJytmbG9hdFRoZWFkSWQ7dW5mbG9hdCgpOyR0YWJsZS5jc3MobGF5b3V0QXV0byk7JHRhYmxlQ29sR3JvdXAucmVtb3ZlKCk7Y3JlYXRlRWxlbWVudHMmJiRmdGhHcnAucmVtb3ZlKCk7aWYoJG5ld0hlYWRlci5wYXJlbnQoKS5sZW5ndGgpeyRuZXdIZWFkZXIucmVwbGFjZVdpdGgoJGhlYWRlcil9CnRyaWdnZXJGbG9hdEV2ZW50KCExKTtpZihjYW5PYnNlcnZlTXV0YXRpb25zKXttT2JzLmRpc2Nvbm5lY3QoKTttT2JzPW51bGx9CiR0YWJsZS5vZmYoJ3JlZmxvdyByZWZsb3dlZCcpOyRzY3JvbGxDb250YWluZXIub2ZmKG5zKTskcmVzcG9uc2l2ZUNvbnRhaW5lci5vZmYobnMpO2lmKHdyYXBwZWRDb250YWluZXIpe2lmKCRzY3JvbGxDb250YWluZXIubGVuZ3RoKXskc2Nyb2xsQ29udGFpbmVyLnVud3JhcCgpfQplbHNleyR0YWJsZS51bndyYXAoKX19CmlmKGxvY2tlZCl7JHNjcm9sbENvbnRhaW5lci5kYXRhKCdmbG9hdFRoZWFkLWNvbnRhaW5lcldyYXAnLCExKX1lbHNleyR0YWJsZS5kYXRhKCdmbG9hdFRoZWFkLWNvbnRhaW5lcldyYXAnLCExKX0KJHRhYmxlLmNzcygnbWluV2lkdGgnLG9yaWdpbmFsVGFibGVNaW5XaWR0aCk7JGZsb2F0Q29udGFpbmVyLnJlbW92ZSgpOyR0YWJsZS5kYXRhKCdmbG9hdFRoZWFkLWF0dGFjaGVkJywhMSk7JHdpbmRvdy5vZmYobnMpO2lmKCFpc1ByaW50RXZlbnQpe3dpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgicHJpbnQiKS5yZW1vdmVMaXN0ZW5lcihwcmludEV2ZW50KTtiZWZvcmVQcmludD1hZnRlclByaW50PWZ1bmN0aW9uKCl7fX19LHJlZmxvdzpmdW5jdGlvbigpe3JlZmxvd0V2ZW50KCl9LHNldEhlYWRlckhlaWdodDpmdW5jdGlvbigpe3NldEhlYWRlckhlaWdodCgpfSxnZXRGbG9hdENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiAkZmxvYXRDb250YWluZXJ9LGdldFJvd0dyb3VwczpmdW5jdGlvbigpe2lmKGhlYWRlckZsb2F0ZWQpe3JldHVybiAkZmxvYXRDb250YWluZXIuZmluZCgnPnRhYmxlPnRoZWFkJykuYWRkKCR0YWJsZS5jaGlsZHJlbigidGJvZHksdGZvb3QiKSl9ZWxzZXtyZXR1cm4gJHRhYmxlLmNoaWxkcmVuKCJ0aGVhZCx0Ym9keSx0Zm9vdCIpfX19KX0pO3JldHVybiB0aGlzfX0pKGpRdWVyeSk7KGZ1bmN0aW9uKCQpeyQuZmxvYXRUaGVhZD0kLmZsb2F0VGhlYWR8fHt9OyQuZmxvYXRUaGVhZC5fPXdpbmRvdy5ffHwoZnVuY3Rpb24oKXt2YXIgdGhhdD17fTt2YXIgaGFzT3duUHJvcGVydHk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxpc1RoaW5ncz1bJ0FyZ3VtZW50cycsJ0Z1bmN0aW9uJywnU3RyaW5nJywnTnVtYmVyJywnRGF0ZScsJ1JlZ0V4cCddO3RoYXQuaGFzPWZ1bmN0aW9uKG9iaixrZXkpe3JldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixrZXkpfTt0aGF0LmtleXM9ZnVuY3Rpb24ob2JqKXtpZihvYmohPT1PYmplY3Qob2JqKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG9iamVjdCcpO3ZhciBrZXlzPVtdO2Zvcih2YXIga2V5IGluIG9iailpZih0aGF0LmhhcyhvYmosa2V5KSlrZXlzLnB1c2goa2V5KTtyZXR1cm4ga2V5c307dmFyIGlkQ291bnRlcj0wO3RoYXQudW5pcXVlSWQ9ZnVuY3Rpb24ocHJlZml4KXt2YXIgaWQ9KytpZENvdW50ZXIrJyc7cmV0dXJuIHByZWZpeD9wcmVmaXgraWQ6aWR9OyQuZWFjaChpc1RoaW5ncyxmdW5jdGlvbigpe3ZhciBuYW1lPXRoaXM7dGhhdFsnaXMnK25hbWVdPWZ1bmN0aW9uKG9iail7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopPT0nW29iamVjdCAnK25hbWUrJ10nfX0pO3RoYXQuZGVib3VuY2U9ZnVuY3Rpb24oZnVuYyx3YWl0LGltbWVkaWF0ZSl7dmFyIHRpbWVvdXQsYXJncyxjb250ZXh0LHRpbWVzdGFtcCxyZXN1bHQ7cmV0dXJuIGZ1bmN0aW9uKCl7Y29udGV4dD10aGlzO2FyZ3M9YXJndW1lbnRzO3RpbWVzdGFtcD1uZXcgRGF0ZSgpO3ZhciBsYXRlcj1mdW5jdGlvbigpe3ZhciBsYXN0PShuZXcgRGF0ZSgpKS10aW1lc3RhbXA7aWYobGFzdDx3YWl0KXt0aW1lb3V0PXNldFRpbWVvdXQobGF0ZXIsd2FpdC1sYXN0KX1lbHNle3RpbWVvdXQ9bnVsbDtpZighaW1tZWRpYXRlKXJlc3VsdD1mdW5jLmFwcGx5KGNvbnRleHQsYXJncyl9fTt2YXIgY2FsbE5vdz1pbW1lZGlhdGUmJiF0aW1lb3V0O2lmKCF0aW1lb3V0KXt0aW1lb3V0PXNldFRpbWVvdXQobGF0ZXIsd2FpdCl9CmlmKGNhbGxOb3cpcmVzdWx0PWZ1bmMuYXBwbHkoY29udGV4dCxhcmdzKTtyZXR1cm4gcmVzdWx0fX07cmV0dXJuIHRoYXR9KSgpfSkoalF1ZXJ5KTsoZnVuY3Rpb24oKXt2YXIgaW5pdGlhbGl6aW5nPSExLGZuVGVzdD0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87dGhpcy5DbGFzcz1mdW5jdGlvbigpe307Q2xhc3MuZXh0ZW5kPWZ1bmN0aW9uKHByb3Ape3ZhciBfc3VwZXI9dGhpcy5wcm90b3R5cGU7aW5pdGlhbGl6aW5nPSEwO3ZhciBwcm90b3R5cGU9bmV3IHRoaXMoKTtpbml0aWFsaXppbmc9ITE7Zm9yKHZhciBuYW1lIGluIHByb3Ape3Byb3RvdHlwZVtuYW1lXT10eXBlb2YgcHJvcFtuYW1lXT09ImZ1bmN0aW9uIiYmdHlwZW9mIF9zdXBlcltuYW1lXT09ImZ1bmN0aW9uIiYmZm5UZXN0LnRlc3QocHJvcFtuYW1lXSk/KGZ1bmN0aW9uKG5hbWUsZm4pe3JldHVybiBmdW5jdGlvbigpe3ZhciB0bXA9dGhpcy5fc3VwZXI7dGhpcy5fc3VwZXI9X3N1cGVyW25hbWVdO3ZhciByZXQ9Zm4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuX3N1cGVyPXRtcDtyZXR1cm4gcmV0fX0pKG5hbWUscHJvcFtuYW1lXSk6cHJvcFtuYW1lXX0KZnVuY3Rpb24gQ2xhc3MoKXtpZighaW5pdGlhbGl6aW5nJiZ0aGlzLmluaXQpCnRoaXMuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9CkNsYXNzLnByb3RvdHlwZT1wcm90b3R5cGU7Q2xhc3MuY29uc3RydWN0b3I9Q2xhc3M7Q2xhc3MuZXh0ZW5kPWFyZ3VtZW50cy5jYWxsZWU7cmV0dXJuIENsYXNzfX0pKCk7SlNMaXN0Qm94PWZ1bmN0aW9uKGNvbmZpZ09iamVjdCl7dGhpcy5pdGVtcz1bXTt0aGlzLmNvbnRhaW5lclNlbGVjdG9yPScjJytjb25maWdPYmplY3QuY29udGFpbmVyU2VsZWN0b3I7JCh0aGlzLmNvbnRhaW5lclNlbGVjdG9yKS5jc3MoInBvc2l0aW9uIiwicmVsYXRpdmUiKTt2YXIgdG1wQ29udGFpbmVyPSQoJzxkaXYgY2xhc3M9Im1lbnVDb250YWluZXJKU0xpc3RCb3giIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDsiPjwvZGl2PicpO2lmKGNvbmZpZ09iamVjdC5zdHlsZW1hcCkKdG1wQ29udGFpbmVyLmNzcyhjb25maWdPYmplY3Quc3R5bGVtYXApO3RoaXMubWVudUNvbnRhaW5lckhUTUw9dG1wQ29udGFpbmVyLmNsb25lKCkud3JhcCgnPGRpdj48L2Rpdj4nKS5wYXJlbnQoKS5odG1sKCk7dGhpcy5TZWxlY3RlZEl0ZW09bnVsbDt0aGlzLlNlbGVjdGVkSW5kZXg9bnVsbH07SlNMaXN0Qm94LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaXRlbXM9W107dGhpcy5yZWZyZXNoKCl9O0pTTGlzdEJveC5wcm90b3R5cGUuYWRkSXRlbT1mdW5jdGlvbihpdGVtKXt0aGlzLml0ZW1zLnB1c2goaXRlbSk7dGhpcy5yZWZyZXNoKCl9O0pTTGlzdEJveC5wcm90b3R5cGUuYWRkSXRlbXM9ZnVuY3Rpb24obmV3SXRlbXMpe2Zvcih2YXIgaSBpbiBuZXdJdGVtcykKe3RoaXMuaXRlbXMucHVzaChuZXdJdGVtc1tpXSl9CnRoaXMucmVmcmVzaCgpfTtKU0xpc3RCb3gucHJvdG90eXBlLnJlbW92ZUF0PWZ1bmN0aW9uKGluZGV4KXt0aGlzLml0ZW1zLnNwbGljZShpbmRleCwxKTt0aGlzLnJlZnJlc2goKX07SlNMaXN0Qm94LnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5tZW51Q29udGFpbmVyKQp0aGlzLm1lbnVDb250YWluZXIudW5iaW5kKCk7JCh0aGlzLmNvbnRhaW5lclNlbGVjdG9yKS5odG1sKHRoaXMubWVudUNvbnRhaW5lckhUTUwpO3RoaXMubWVudUNvbnRhaW5lcj0kKHRoaXMuY29udGFpbmVyU2VsZWN0b3IrJyAubWVudUNvbnRhaW5lckpTTGlzdEJveCcpO2Zvcih2YXIgaSBpbiB0aGlzLml0ZW1zKQp7dmFyIGl0ZW09dGhpcy5pdGVtc1tpXTt2YXIgcmVuZGVyZWRJdGVtSFRNTD1pdGVtLnJlbmRlcigpO3ZhciBpdGVtQWN0aXZhdGVkPSExO2lmKHRoaXMuU2VsZWN0ZWRJdGVtPT1pdGVtKQppdGVtQWN0aXZhdGVkPSEwOyQoIjxsaT48L2xpPiIpLmRhdGEoImpzbGlzdGJveC5pdGVtIixpdGVtKS5hdHRyKCJlbmFibGVkIixpdGVtLmVuYWJsZWQpLmF0dHIoImFjdGl2YXRlZCIsaXRlbUFjdGl2YXRlZCkuYXBwZW5kKCQocmVuZGVyZWRJdGVtSFRNTCkpLmFwcGVuZFRvKHRoaXMubWVudUNvbnRhaW5lcil9CnZhciBzZWxmPXRoaXM7JCh0aGlzLm1lbnVDb250YWluZXIpLmxpc3Qoe3NlbGVjdGVkOmZ1bmN0aW9uKGV2ZW50LHVpKXt2YXIgaXRlbT11aS5pdGVtLmRhdGEoImpzbGlzdGJveC5pdGVtIik7c2VsZi5zZXRTZWxlY3RlZEl0ZW0oaXRlbSk7aXRlbS5vbkNsaWNrKCk7cmV0dXJuITB9LGRibHNlbGVjdGVkOmZ1bmN0aW9uKGV2ZW50LHVpKXt2YXIgaXRlbT11aS5pdGVtLmRhdGEoImpzbGlzdGJveC5pdGVtIik7aXRlbS5vbkRibENsaWNrKCk7cmV0dXJuITB9fSl9O0pTTGlzdEJveC5wcm90b3R5cGUuc2V0U2VsZWN0ZWRJdGVtPWZ1bmN0aW9uKGl0ZW0pe3RoaXMuU2VsZWN0ZWRJdGVtPWl0ZW07dGhpcy5TZWxlY3RlZEluZGV4PXRoaXMuZ2V0SXRlbUluZGV4KGl0ZW0pfTtKU0xpc3RCb3gucHJvdG90eXBlLnNldFNlbGVjdGVkSW5kZXg9ZnVuY3Rpb24oaW5kZXgpe3RoaXMuU2VsZWN0ZWRJdGVtPXRoaXMuaXRlbXNbaW5kZXhdO3RoaXMuU2VsZWN0ZWRJbmRleD1pbmRleH07SlNMaXN0Qm94LnByb3RvdHlwZS5nZXRJdGVtSW5kZXg9ZnVuY3Rpb24oaXRlbSl7Zm9yKHZhciBpIGluIHRoaXMuaXRlbXMpCntpZih0aGlzLml0ZW1zW2ldPT1pdGVtKQpyZXR1cm4gaX0KcmV0dXJuIG51bGx9O0pTTGlzdEJveC5JdGVtPUNsYXNzLmV4dGVuZCh7dmFsdWU6IiIsZW5hYmxlZDohMCxpbml0OmZ1bmN0aW9uKCl7fSxyZW5kZXI6ZnVuY3Rpb24oKXtyZXR1cm4nPGEgaHJlZj0iIyI+Jyt0aGlzLnZhbHVlKyc8L2E+J30sb25DbGljazpmdW5jdGlvbigpe30sb25EYmxDbGljazpmdW5jdGlvbigpe319KTsoZnVuY3Rpb24oJCl7JC53aWRnZXQoInVpLmxpc3QiLHtfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpczt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5hdHRyKHtyb2xlOiJsaXN0Ym94IiwiYXJpYS1hY3RpdmVkZXNjZW5kYW50IjoidWktYWN0aXZlLW1lbnVpdGVtIn0pLmNsaWNrKGZ1bmN0aW9uKGV2ZW50KXtpZighJChldmVudC50YXJnZXQpLmNsb3Nlc3QoIi51aS1tZW51LWl0ZW0gYSIpLmxlbmd0aCl7cmV0dXJufQppZihzZWxmLmhpZ2hsaWdodGVkKQp7dmFyIGhpZ2hsaWdodGVkSXRlbT1zZWxmLmhpZ2hsaWdodGVkO2lmKHNlbGYuY2xpY2tIYW5kbGVyJiYhc2VsZi5jbGlja0hhbmRsZXIoKSl7cmV0dXJufQpzZWxmLmFjdGl2YXRlKGV2ZW50LGhpZ2hsaWdodGVkSXRlbSk7ZXZlbnQucHJldmVudERlZmF1bHQoKTtzZWxmLnNlbGVjdChldmVudCl9fSkuZGJsY2xpY2soZnVuY3Rpb24oZXZlbnQpe2lmKCEkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSBhIikubGVuZ3RoKXtyZXR1cm59CmlmKHNlbGYuaGlnaGxpZ2h0ZWQpCntldmVudC5wcmV2ZW50RGVmYXVsdCgpO3NlbGYuZGJsc2VsZWN0KGV2ZW50KX19KTt0aGlzLnJlZnJlc2goKX0sc2V0Q2xpY2tIYW5kbGVyOmZ1bmN0aW9uKGhhbmRsZXIpe3RoaXMuY2xpY2tIYW5kbGVyPWhhbmRsZXJ9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3ZhciBpdGVtcz10aGlzLmVsZW1lbnQuY2hpbGRyZW4oImxpOm5vdCgudWktbWVudS1pdGVtKTpoYXMoYSkiKS5hZGRDbGFzcygidWktbWVudS1pdGVtIikuYXR0cigicm9sZSIsIm1lbnVpdGVtIik7aXRlbXMuY2hpbGRyZW4oImEiKS5hZGRDbGFzcygidWktY29ybmVyLWFsbCIpLmF0dHIoInRhYmluZGV4IiwtMSkubW91c2VlbnRlcihmdW5jdGlvbihldmVudCl7c2VsZi5oaWdobGlnaHQoZXZlbnQsJCh0aGlzKS5wYXJlbnQoKSl9KS5tb3VzZWxlYXZlKGZ1bmN0aW9uKCl7c2VsZi5sb3dsaWdodCgpfSk7Zm9yKHZhciBpPTA7aTxpdGVtcy5sZW5ndGg7aSsrKQp7dmFyIGl0ZW09JChpdGVtc1tpXSk7aWYoaXRlbS5hdHRyKCJhY3RpdmF0ZWQiKT09InRydWUiKQpzZWxmLmFjdGl2YXRlKG51bGwsaXRlbSl9fSxoaWdobGlnaHQ6ZnVuY3Rpb24oZXZlbnQsaXRlbSl7dGhpcy5sb3dsaWdodCgpO2lmKGl0ZW0uYXR0cigiZW5hYmxlZCIpPT0idHJ1ZSIpCnt0aGlzLmhpZ2hsaWdodGVkPWl0ZW0uZXEoMCkuY2hpbGRyZW4oImEiKS5hZGRDbGFzcygidWktbGlzdGJveC1zdGF0ZS1oaWdobGlnaHQiKS5lbmQoKX19LGxvd2xpZ2h0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGlnaGxpZ2h0ZWQpe3JldHVybn0KdGhpcy5oaWdobGlnaHRlZC5jaGlsZHJlbigiYSIpLnJlbW92ZUNsYXNzKCJ1aS1saXN0Ym94LXN0YXRlLWhpZ2hsaWdodCIpO3RoaXMuaGlnaGxpZ2h0ZWQ9bnVsbH0sYWN0aXZhdGU6ZnVuY3Rpb24oZXZlbnQsaXRlbSl7dGhpcy5kZWFjdGl2YXRlKCk7aWYodGhpcy5oYXNTY3JvbGwoKSl7dmFyIG9mZnNldD1pdGVtLm9mZnNldCgpLnRvcC10aGlzLmVsZW1lbnQub2Zmc2V0KCkudG9wLHNjcm9sbD10aGlzLmVsZW1lbnQuYXR0cigic2Nyb2xsVG9wIiksZWxlbWVudEhlaWdodD10aGlzLmVsZW1lbnQuaGVpZ2h0KCk7aWYob2Zmc2V0PDApe3RoaXMuZWxlbWVudC5hdHRyKCJzY3JvbGxUb3AiLHNjcm9sbCtvZmZzZXQpfWVsc2UgaWYob2Zmc2V0Pj1lbGVtZW50SGVpZ2h0KXt0aGlzLmVsZW1lbnQuYXR0cigic2Nyb2xsVG9wIixzY3JvbGwrb2Zmc2V0LWVsZW1lbnRIZWlnaHQraXRlbS5oZWlnaHQoKSl9fQp0aGlzLmFjdGl2ZT1pdGVtLmVxKDApLmNoaWxkcmVuKCJhIikuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIikuYXR0cigiaWQiLCJ1aS1hY3RpdmUtbWVudWl0ZW0iKS5lbmQoKTt0aGlzLl90cmlnZ2VyKCJmb2N1cyIsZXZlbnQse2l0ZW06aXRlbX0pfSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYWN0aXZlKXtyZXR1cm59CnRoaXMuYWN0aXZlLmNoaWxkcmVuKCJhIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIikucmVtb3ZlQXR0cigiaWQiKTt0aGlzLl90cmlnZ2VyKCJibHVyIik7dGhpcy5hY3RpdmU9bnVsbH0sbmV4dDpmdW5jdGlvbihldmVudCl7dGhpcy5tb3ZlKCJuZXh0IiwiLnVpLW1lbnUtaXRlbTpmaXJzdCIsZXZlbnQpfSxwcmV2aW91czpmdW5jdGlvbihldmVudCl7dGhpcy5tb3ZlKCJwcmV2IiwiLnVpLW1lbnUtaXRlbTpsYXN0IixldmVudCl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUucHJldkFsbCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aH0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLm5leHRBbGwoIi51aS1tZW51LWl0ZW0iKS5sZW5ndGh9LG1vdmU6ZnVuY3Rpb24oZGlyZWN0aW9uLGVkZ2UsZXZlbnQpe2lmKCF0aGlzLmFjdGl2ZSl7dGhpcy5hY3RpdmF0ZShldmVudCx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oZWRnZSkpO3JldHVybn0KdmFyIG5leHQ9dGhpcy5hY3RpdmVbZGlyZWN0aW9uKyJBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKDApO2lmKG5leHQubGVuZ3RoKXt0aGlzLmFjdGl2YXRlKGV2ZW50LG5leHQpfWVsc2V7dGhpcy5hY3RpdmF0ZShldmVudCx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oZWRnZSkpfX0sbmV4dFBhZ2U6ZnVuY3Rpb24oZXZlbnQpe2lmKHRoaXMuaGFzU2Nyb2xsKCkpe2lmKCF0aGlzLmFjdGl2ZXx8dGhpcy5sYXN0KCkpe3RoaXMuYWN0aXZhdGUoZXZlbnQsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmZpcnN0IikpO3JldHVybn0KdmFyIGJhc2U9dGhpcy5hY3RpdmUub2Zmc2V0KCkudG9wLGhlaWdodD10aGlzLmVsZW1lbnQuaGVpZ2h0KCkscmVzdWx0PXRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBjbG9zZT0kKHRoaXMpLm9mZnNldCgpLnRvcC1iYXNlLWhlaWdodCskKHRoaXMpLmhlaWdodCgpO3JldHVybiBjbG9zZTwxMCYmY2xvc2U+LTEwfSk7aWYoIXJlc3VsdC5sZW5ndGgpe3Jlc3VsdD10aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW06bGFzdCIpfQp0aGlzLmFjdGl2YXRlKGV2ZW50LHJlc3VsdCl9ZWxzZXt0aGlzLmFjdGl2YXRlKGV2ZW50LHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcighdGhpcy5hY3RpdmV8fHRoaXMubGFzdCgpPyI6Zmlyc3QiOiI6bGFzdCIpKX19LHByZXZpb3VzUGFnZTpmdW5jdGlvbihldmVudCl7aWYodGhpcy5oYXNTY3JvbGwoKSl7aWYoIXRoaXMuYWN0aXZlfHx0aGlzLmZpcnN0KCkpe3RoaXMuYWN0aXZhdGUoZXZlbnQsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmxhc3QiKSk7cmV0dXJufQp2YXIgYmFzZT10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3AsaGVpZ2h0PXRoaXMuZWxlbWVudC5oZWlnaHQoKTtyZXN1bHQ9dGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtIikuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGNsb3NlPSQodGhpcykub2Zmc2V0KCkudG9wLWJhc2UraGVpZ2h0LSQodGhpcykuaGVpZ2h0KCk7cmV0dXJuIGNsb3NlPDEwJiZjbG9zZT4tMTB9KTtpZighcmVzdWx0Lmxlbmd0aCl7cmVzdWx0PXRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbTpmaXJzdCIpfQp0aGlzLmFjdGl2YXRlKGV2ZW50LHJlc3VsdCl9ZWxzZXt0aGlzLmFjdGl2YXRlKGV2ZW50LHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcighdGhpcy5hY3RpdmV8fHRoaXMuZmlyc3QoKT8iOmxhc3QiOiI6Zmlyc3QiKSl9fSxoYXNTY3JvbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50LmhlaWdodCgpPHRoaXMuZWxlbWVudC5hdHRyKCJzY3JvbGxIZWlnaHQiKX0sc2VsZWN0OmZ1bmN0aW9uKGV2ZW50KXt0aGlzLl90cmlnZ2VyKCJzZWxlY3RlZCIsZXZlbnQse2l0ZW06dGhpcy5hY3RpdmV9KX0sZGJsc2VsZWN0OmZ1bmN0aW9uKGV2ZW50KXt0aGlzLl90cmlnZ2VyKCJkYmxzZWxlY3RlZCIsZXZlbnQse2l0ZW06dGhpcy5hY3RpdmV9KX19KX0oalF1ZXJ5KSk=(Line 519)
Message:
[cycle] terminating; too few slides: 1
console-api warning URL: data:text/javascript;base64,KGZ1bmN0aW9uKCQpe3ZhciBEQVRBX09SSUdJTkFMX0RPTV9LRVk9J2NvbHVtbml6ZXItb3JpZ2luYWwtZG9tJzskLmZuLmNvbHVtbml6ZT1mdW5jdGlvbihvcHRpb25zKXt0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgJGVsPSQodGhpcyk7JGVsLmRhdGEoREFUQV9PUklHSU5BTF9ET01fS0VZLCRlbC5jbG9uZSghMCwhMCkpfSk7dGhpcy5jb2xzPVtdO3RoaXMub2Zmc2V0PTA7dGhpcy5iZWZvcmU9W107dGhpcy5sYXN0T3RoZXI9MDt0aGlzLnByZXZNYXg9MDt0aGlzLmRlYnVnPTA7dGhpcy5zZXRDb2x1bW5TdGFydD1udWxsO3RoaXMuZWxpcHNpc1RleHQ9Jyc7dmFyIGRlZmF1bHRzPXt3aWR0aDo0MDAsY29sdW1uczohMSxidWlsZE9uY2U6ITEsb3ZlcmZsb3c6ITEsZG9uZUZ1bmM6ZnVuY3Rpb24oKXt9LHRhcmdldDohMSxpZ25vcmVJbWFnZUxvYWRpbmc6ITAsY29sdW1uRmxvYXQ6ImxlZnQiLGxhc3ROZXZlclRhbGxlc3Q6ITEsYWNjdXJhY3k6ITEscHJlY2lzZTohMSxtYW51YWxCcmVha3M6ITEsZGlzYWJsZVNpbmdsZTohMSxjc3NDbGFzc1ByZWZpeDoiIixlbGlwc2lzVGV4dDonLi4uJyxkZWJ1ZzowfTtvcHRpb25zPSQuZXh0ZW5kKGRlZmF1bHRzLG9wdGlvbnMpO3ZhciB0YWJsZXM9bmV3IEFycmF5KCk7JCgndGFibGUnKS5lYWNoKGZ1bmN0aW9uKCl7aWYoISQodGhpcykuaGFzQ2xhc3MoJ3RhYmxlU2F2ZWQnKSl7JCh0aGlzKS5hZGRDbGFzcygndGFibGVTYXZlZCcpCiQodGhpcykuYWRkQ2xhc3MoJ3RhYmxlSUQtJyt0YWJsZXMubGVuZ3RoKQp0YWJsZXMucHVzaCh7dGFibGVJRDondGFibGVJRC0nK3RhYmxlcy5sZW5ndGgsdGhlYWQ6JCh0aGlzKS5maW5kKCd0aGVhZDpmaXJzdCcpLmNsb25lKCksdGZvb3Q6JCh0aGlzKS5maW5kKCd0Zm9vdDpmaXJzdCcpLmNsb25lKCl9KX19KTtmdW5jdGlvbiBmaXhUYWJsZXMoJHB1bGxPdXRIZXJlKXtmb3IoaT0wO2k8dGFibGVzLmxlbmd0aDtpKyspe2lmKCRwdWxsT3V0SGVyZS5pcygidGFibGUiKSl7aWYoJHB1bGxPdXRIZXJlLmNoaWxkcmVuKCd0Zm9vdCcpLmxlbmd0aD09MCYmJHB1bGxPdXRIZXJlLmhhc0NsYXNzKHRhYmxlc1tpXS50YWJsZUlEKSl7JCh0YWJsZXNbaV0udGZvb3QpLmNsb25lKCkucHJlcGVuZFRvKCRwdWxsT3V0SGVyZSl9CmlmKCRwdWxsT3V0SGVyZS5jaGlsZHJlbigndGhlYWQnKS5sZW5ndGg9PTAmJiRwdWxsT3V0SGVyZS5oYXNDbGFzcyh0YWJsZXNbaV0udGFibGVJRCkpeyQodGFibGVzW2ldLnRoZWFkKS5jbG9uZSgpLnByZXBlbmRUbygkcHVsbE91dEhlcmUpfX0KJHB1bGxPdXRIZXJlLmZpbmQoJ3RhYmxlIC4nK3RhYmxlc1tpXS50YWJsZUlEKS5lYWNoKGZ1bmN0aW9uKCl7aWYoJCh0aGlzKS5jaGlsZHJlbigndGZvb3QnKS5sZW5ndGg9PTApeyQodGFibGVzW2ldLnRmb290KS5jbG9uZSgpLnByZXBlbmRUbyh0aGlzKX0KaWYoJCh0aGlzKS5jaGlsZHJlbigndGhlYWQnKS5sZW5ndGg9PTApeyQodGFibGVzW2ldLnRoZWFkKS5jbG9uZSgpLnByZXBlbmRUbyh0aGlzKX19KX19CmlmKHR5cGVvZihvcHRpb25zLndpZHRoKT09InN0cmluZyIpe29wdGlvbnMud2lkdGg9cGFyc2VJbnQob3B0aW9ucy53aWR0aCwxMCk7aWYoaXNOYU4ob3B0aW9ucy53aWR0aCkpe29wdGlvbnMud2lkdGg9ZGVmYXVsdHMud2lkdGh9fQppZih0eXBlb2Ygb3B0aW9ucy5zZXRDb2x1bW5TdGFydD09J2Z1bmN0aW9uJyl7dGhpcy5zZXRDb2x1bW5TdGFydD1vcHRpb25zLnNldENvbHVtblN0YXJ0fQppZih0eXBlb2Ygb3B0aW9ucy5lbGlwc2lzVGV4dD09J3N0cmluZycpe3RoaXMuZWxpcHNpc1RleHQ9b3B0aW9ucy5lbGlwc2lzVGV4dH0KaWYob3B0aW9ucy5kZWJ1Zyl7dGhpcy5kZWJ1Zz1vcHRpb25zLmRlYnVnfQppZighb3B0aW9ucy5zZXRXaWR0aCl7aWYob3B0aW9ucy5wcmVjaXNlKXtvcHRpb25zLnNldFdpZHRoPWZ1bmN0aW9uKG51bUNvbHMpe3JldHVybiAxMDAvbnVtQ29sc319ZWxzZXtvcHRpb25zLnNldFdpZHRoPWZ1bmN0aW9uKG51bUNvbHMpe3JldHVybiBNYXRoLmZsb29yKDEwMC9udW1Db2xzKX19fQpmdW5jdGlvbiBhcHBlbmRTYWZlKCR0YXJnZXQsJGVsZW0pe3RyeXskdGFyZ2V0LmFwcGVuZCgkZWxlbSl9Y2F0Y2goZSl7JHRhcmdldFswXS5hcHBlbmRDaGlsZCgkZWxlbVswXSl9fQpyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyICRpbkJveD1vcHRpb25zLnRhcmdldD8kKG9wdGlvbnMudGFyZ2V0KTokKHRoaXMpO3ZhciBtYXhIZWlnaHQ9JCh0aGlzKS5oZWlnaHQoKTt2YXIgJGNhY2hlPSQoJzxkaXY+PC9kaXY+Jyk7dmFyIGxhc3RXaWR0aD0wO3ZhciBjb2x1bW5pemluZz0hMTt2YXIgbWFudWFsQnJlYWtzPW9wdGlvbnMubWFudWFsQnJlYWtzO3ZhciBjc3NDbGFzc1ByZWZpeD1kZWZhdWx0cy5jc3NDbGFzc1ByZWZpeDtpZih0eXBlb2Yob3B0aW9ucy5jc3NDbGFzc1ByZWZpeCk9PSJzdHJpbmciKXtjc3NDbGFzc1ByZWZpeD1vcHRpb25zLmNzc0NsYXNzUHJlZml4fQp2YXIgYWRqdXN0bWVudD0wO2FwcGVuZFNhZmUoJGNhY2hlLCQodGhpcykuY29udGVudHMoKS5jbG9uZSghMCkpO2lmKCFvcHRpb25zLmlnbm9yZUltYWdlTG9hZGluZyYmIW9wdGlvbnMudGFyZ2V0KXtpZighJGluQm94LmRhdGEoImltYWdlTG9hZGVkIikpeyRpbkJveC5kYXRhKCJpbWFnZUxvYWRlZCIsITApO2lmKCQodGhpcykuZmluZCgiaW1nIikubGVuZ3RoPjApe3ZhciBmdW5jPWZ1bmN0aW9uKCRpbkJveCwkY2FjaGUpe3JldHVybiBmdW5jdGlvbigpe2lmKCEkaW5Cb3guZGF0YSgiZmlyc3RJbWFnZUxvYWRlZCIpKXskaW5Cb3guZGF0YSgiZmlyc3RJbWFnZUxvYWRlZCIsInRydWUiKTthcHBlbmRTYWZlKCRpbkJveC5lbXB0eSgpLCRjYWNoZS5jaGlsZHJlbigpLmNsb25lKCEwKSk7JGluQm94LmNvbHVtbml6ZShvcHRpb25zKX19fSgkKHRoaXMpLCRjYWNoZSk7JCh0aGlzKS5maW5kKCJpbWciKS5vbmUoImxvYWQiLGZ1bmMpOyQodGhpcykuZmluZCgiaW1nIikub25lKCJhYm9ydCIsZnVuYyk7cmV0dXJufX19CiRpbkJveC5lbXB0eSgpO2NvbHVtbml6ZUl0KCk7aWYoIW9wdGlvbnMuYnVpbGRPbmNlKXskKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCl7aWYoIW9wdGlvbnMuYnVpbGRPbmNlKXtpZigkaW5Cb3guZGF0YSgidGltZW91dCIpKXtjbGVhclRpbWVvdXQoJGluQm94LmRhdGEoInRpbWVvdXQiKSl9CiRpbkJveC5kYXRhKCJ0aW1lb3V0IixzZXRUaW1lb3V0KGNvbHVtbml6ZUl0LDIwMCkpfX0pfQpmdW5jdGlvbiBwcmVmaXhUaGVDbGFzc05hbWUoY2xhc3NOYW1lLHdpdGhEb3Qpe3ZhciBkb3Q9d2l0aERvdD8iLiI6IiI7aWYoY3NzQ2xhc3NQcmVmaXgubGVuZ3RoKXtyZXR1cm4gZG90K2Nzc0NsYXNzUHJlZml4KyItIitjbGFzc05hbWV9CnJldHVybiBkb3QrY2xhc3NOYW1lfQpmdW5jdGlvbiBjb2x1bW5pemUoJHB1dEluSGVyZSwkcHVsbE91dEhlcmUsJHBhcmVudENvbHVtbix0YXJnZXRIZWlnaHQpe3doaWxlKChtYW51YWxCcmVha3N8fCRwYXJlbnRDb2x1bW4uaGVpZ2h0KCk8dGFyZ2V0SGVpZ2h0KSYmJHB1bGxPdXRIZXJlWzBdLmNoaWxkTm9kZXMubGVuZ3RoKXt2YXIgbm9kZT0kcHVsbE91dEhlcmVbMF0uY2hpbGROb2Rlc1swXTtpZigkKG5vZGUpLmZpbmQocHJlZml4VGhlQ2xhc3NOYW1lKCJjb2x1bW5icmVhayIsITApKS5sZW5ndGgpe3JldHVybn0KaWYoJChub2RlKS5oYXNDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImNvbHVtbmJyZWFrIikpKXtyZXR1cm59CmFwcGVuZFNhZmUoJHB1dEluSGVyZSwkKG5vZGUpKX0KaWYoJHB1dEluSGVyZVswXS5jaGlsZE5vZGVzLmxlbmd0aD09PTApcmV0dXJuO3ZhciBraWRzPSRwdXRJbkhlcmVbMF0uY2hpbGROb2Rlczt2YXIgbGFzdEtpZD1raWRzW2tpZHMubGVuZ3RoLTFdOyRwdXRJbkhlcmVbMF0ucmVtb3ZlQ2hpbGQobGFzdEtpZCk7dmFyICRpdGVtPSQobGFzdEtpZCk7aWYoJGl0ZW1bMF0ubm9kZVR5cGU9PTMpe3ZhciBvVGV4dD0kaXRlbVswXS5ub2RlVmFsdWU7dmFyIGNvdW50ZXIyPW9wdGlvbnMud2lkdGgvMTg7aWYob3B0aW9ucy5hY2N1cmFjeSkKY291bnRlcjI9b3B0aW9ucy5hY2N1cmFjeTt2YXIgY29sdW1uVGV4dDt2YXIgbGF0ZXN0VGV4dE5vZGU9bnVsbDt3aGlsZSgkcGFyZW50Q29sdW1uLmhlaWdodCgpPHRhcmdldEhlaWdodCYmb1RleHQubGVuZ3RoKXt2YXIgaW5kZXhPZlNwYWNlPW9UZXh0LmluZGV4T2YoJyAnLGNvdW50ZXIyKTtpZihpbmRleE9mU3BhY2UhPS0xKXtjb2x1bW5UZXh0PW9UZXh0LnN1YnN0cmluZygwLGluZGV4T2ZTcGFjZSl9ZWxzZXtjb2x1bW5UZXh0PW9UZXh0fQpsYXRlc3RUZXh0Tm9kZT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2x1bW5UZXh0KTthcHBlbmRTYWZlKCRwdXRJbkhlcmUsJChsYXRlc3RUZXh0Tm9kZSkpO2lmKG9UZXh0Lmxlbmd0aD5jb3VudGVyMiYmaW5kZXhPZlNwYWNlIT0tMSl7b1RleHQ9b1RleHQuc3Vic3RyaW5nKGluZGV4T2ZTcGFjZSl9ZWxzZXtvVGV4dD0iIn19CmlmKCRwYXJlbnRDb2x1bW4uaGVpZ2h0KCk+PXRhcmdldEhlaWdodCYmbGF0ZXN0VGV4dE5vZGUhPT1udWxsKXskcHV0SW5IZXJlWzBdLnJlbW92ZUNoaWxkKGxhdGVzdFRleHROb2RlKTtvVGV4dD1sYXRlc3RUZXh0Tm9kZS5ub2RlVmFsdWUrb1RleHR9CmlmKG9UZXh0Lmxlbmd0aCl7JGl0ZW1bMF0ubm9kZVZhbHVlPW9UZXh0fWVsc2V7cmV0dXJuITF9fQppZigkcHVsbE91dEhlcmUuY29udGVudHMoKS5sZW5ndGgpeyRwdWxsT3V0SGVyZS5wcmVwZW5kKCRpdGVtKX1lbHNle2FwcGVuZFNhZmUoJHB1bGxPdXRIZXJlLCRpdGVtKX0KcmV0dXJuICRpdGVtWzBdLm5vZGVUeXBlPT0zfQpmdW5jdGlvbiBzcGxpdCgkcHV0SW5IZXJlLCRwdWxsT3V0SGVyZSwkcGFyZW50Q29sdW1uLHRhcmdldEhlaWdodCl7aWYoJHB1dEluSGVyZS5jb250ZW50cygiOmxhc3QiKS5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uYnJlYWsiLCEwKSkubGVuZ3RoKXtmaXhUYWJsZXMoJHB1bGxPdXRIZXJlKTtyZXR1cm59CmlmKCRwdXRJbkhlcmUuY29udGVudHMoIjpsYXN0IikuaGFzQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJjb2x1bW5icmVhayIpKSl7Zml4VGFibGVzKCRwdWxsT3V0SGVyZSk7cmV0dXJufQppZigkcHVsbE91dEhlcmUuY29udGVudHMoKS5sZW5ndGgpe3ZhciAkY2xvbmVNZT0kcHVsbE91dEhlcmUuY29udGVudHMoIjpmaXJzdCIpO2lmKHR5cGVvZiAkY2xvbmVNZS5nZXQoMCk9PSd1bmRlZmluZWQnfHwkY2xvbmVNZS5nZXQoMCkubm9kZVR5cGUhPTEpcmV0dXJuO3ZhciAkY2xvbmU9JGNsb25lTWUuY2xvbmUoITApO2lmKCRjbG9uZU1lLmhhc0NsYXNzKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uYnJlYWsiKSkpe2FwcGVuZFNhZmUoJHB1dEluSGVyZSwkY2xvbmUpOyRjbG9uZU1lLnJlbW92ZSgpfWVsc2UgaWYobWFudWFsQnJlYWtzKXthcHBlbmRTYWZlKCRwdXRJbkhlcmUsJGNsb25lKTskY2xvbmVNZS5yZW1vdmUoKX1lbHNlIGlmKCRjbG9uZS5nZXQoMCkubm9kZVR5cGU9PTEmJiEkY2xvbmUuaGFzQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJkb250ZW5kIikpKXthcHBlbmRTYWZlKCRwdXRJbkhlcmUsJGNsb25lKTtpZigkY2xvbmUuaXMoImltZyIpJiYkcGFyZW50Q29sdW1uLmhlaWdodCgpPHRhcmdldEhlaWdodCsyMCl7JGNsb25lTWUucmVtb3ZlKCl9ZWxzZSBpZigkY2xvbmVNZS5oYXNDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImRvbnRzcGxpdCIpKSYmJHBhcmVudENvbHVtbi5oZWlnaHQoKTx0YXJnZXRIZWlnaHQrMjApeyRjbG9uZU1lLnJlbW92ZSgpfWVsc2UgaWYoJGNsb25lLmlzKCJpbWciKXx8JGNsb25lTWUuaGFzQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJkb250c3BsaXQiKSkpeyRjbG9uZS5yZW1vdmUoKX1lbHNleyRjbG9uZS5lbXB0eSgpO2lmKCFjb2x1bW5pemUoJGNsb25lLCRjbG9uZU1lLCRwYXJlbnRDb2x1bW4sdGFyZ2V0SGVpZ2h0KSl7JGNsb25lTWUuYWRkQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJzcGxpdCIpKTtpZigkY2xvbmVNZS5nZXQoMCkudGFnTmFtZT09J09MJyl7dmFyIHN0YXJ0V2l0aD0kY2xvbmUuZ2V0KDApLmNoaWxkRWxlbWVudENvdW50KyRjbG9uZS5nZXQoMCkuc3RhcnQ7JGNsb25lTWUuYXR0cignc3RhcnQnLHN0YXJ0V2l0aCsxKX0KaWYoJGNsb25lTWUuY2hpbGRyZW4oKS5sZW5ndGgpe3NwbGl0KCRjbG9uZSwkY2xvbmVNZSwkcGFyZW50Q29sdW1uLHRhcmdldEhlaWdodCl9fWVsc2V7JGNsb25lTWUuYWRkQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJzcGxpdCIpKX0KaWYoJGNsb25lLmdldCgwKS5jaGlsZE5vZGVzLmxlbmd0aD09PTApeyRjbG9uZS5yZW1vdmUoKTskY2xvbmVNZS5yZW1vdmVDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoInNwbGl0IikpfWVsc2UgaWYoJGNsb25lLmdldCgwKS5jaGlsZE5vZGVzLmxlbmd0aD09MSl7dmFyIG9ubHlOb2RlPSRjbG9uZS5nZXQoMCkuY2hpbGROb2Rlc1swXTtpZihvbmx5Tm9kZS5ub2RlVHlwZT09Myl7dmFyIG5vbndoaXRlc3BhY2U9L1xTLzt2YXIgc3RyPW9ubHlOb2RlLm5vZGVWYWx1ZTtpZighbm9ud2hpdGVzcGFjZS50ZXN0KHN0cikpeyRjbG9uZS5yZW1vdmUoKTskY2xvbmVNZS5yZW1vdmVDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoInNwbGl0IikpfX19fX19CmZpeFRhYmxlcygkcHVsbE91dEhlcmUpfQpmdW5jdGlvbiBzaW5nbGVDb2x1bW5pemVJdCgpe2lmKCRpbkJveC5kYXRhKCJjb2x1bW5pemVkIikmJiRpbkJveC5jaGlsZHJlbigpLmxlbmd0aD09MSl7cmV0dXJufQokaW5Cb3guZGF0YSgiY29sdW1uaXplZCIsITApOyRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIsITApOyRpbkJveC5lbXB0eSgpOyRpbkJveC5hcHBlbmQoJCgiPGRpdiBjbGFzcz0nIitwcmVmaXhUaGVDbGFzc05hbWUoImZpcnN0IikrIiAiK3ByZWZpeFRoZUNsYXNzTmFtZSgibGFzdCIpKyIgIitwcmVmaXhUaGVDbGFzc05hbWUoImNvbHVtbiIpKyIgIisiJyBzdHlsZT0nd2lkdGg6MTAwJTsgZmxvYXQ6ICIrb3B0aW9ucy5jb2x1bW5GbG9hdCsiOyc+PC9kaXY+IikpOyRjb2w9JGluQm94LmNoaWxkcmVuKCkuZXEoJGluQm94LmNoaWxkcmVuKCkubGVuZ3RoLTEpOyRkZXN0cm95YWJsZT0kY2FjaGUuY2xvbmUoITApO2lmKG9wdGlvbnMub3ZlcmZsb3cpe3RhcmdldEhlaWdodD1vcHRpb25zLm92ZXJmbG93LmhlaWdodDtjb2x1bW5pemUoJGNvbCwkZGVzdHJveWFibGUsJGNvbCx0YXJnZXRIZWlnaHQpO2lmKCEkZGVzdHJveWFibGUuY29udGVudHMoKS5maW5kKCI6Zmlyc3QtY2hpbGQiKS5oYXNDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImRvbnRlbmQiKSkpe3NwbGl0KCRjb2wsJGRlc3Ryb3lhYmxlLCRjb2wsdGFyZ2V0SGVpZ2h0KX0Kd2hpbGUoJGNvbC5jb250ZW50cygiOmxhc3QiKS5sZW5ndGgmJmNoZWNrRG9udEVuZENvbHVtbigkY29sLmNvbnRlbnRzKCI6bGFzdCIpLmdldCgwKSkpe3ZhciAkbGFzdEtpZD0kY29sLmNvbnRlbnRzKCI6bGFzdCIpOyRsYXN0S2lkLnJlbW92ZSgpOyRkZXN0cm95YWJsZS5wcmVwZW5kKCRsYXN0S2lkKX0KdmFyIGh0bWw9IiI7dmFyIGRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTt3aGlsZSgkZGVzdHJveWFibGVbMF0uY2hpbGROb2Rlcy5sZW5ndGg+MCl7dmFyIGtpZD0kZGVzdHJveWFibGVbMF0uY2hpbGROb2Rlc1swXTtpZihraWQuYXR0cmlidXRlcyl7Zm9yKHZhciBpPTA7aTxraWQuYXR0cmlidXRlcy5sZW5ndGg7aSsrKXtpZihraWQuYXR0cmlidXRlc1tpXS5ub2RlTmFtZS5pbmRleE9mKCJqUXVlcnkiKT09PTApe2tpZC5yZW1vdmVBdHRyaWJ1dGUoa2lkLmF0dHJpYnV0ZXNbaV0ubm9kZU5hbWUpfX19CmRpdi5pbm5lckhUTUw9IiI7ZGl2LmFwcGVuZENoaWxkKCRkZXN0cm95YWJsZVswXS5jaGlsZE5vZGVzWzBdKTtodG1sKz1kaXYuaW5uZXJIVE1MfQp2YXIgb3ZlcmZsb3c9JChvcHRpb25zLm92ZXJmbG93LmlkKVswXTtvdmVyZmxvdy5pbm5lckhUTUw9aHRtbH1lbHNle2FwcGVuZFNhZmUoJGNvbCwkZGVzdHJveWFibGUuY29udGVudHMoKSl9CiRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIsITEpO2lmKG9wdGlvbnMub3ZlcmZsb3cmJm9wdGlvbnMub3ZlcmZsb3cuZG9uZUZ1bmMpe29wdGlvbnMub3ZlcmZsb3cuZG9uZUZ1bmMoKX0Kb3B0aW9ucy5kb25lRnVuYygpfQpmdW5jdGlvbiBjaGVja0RvbnRFbmRDb2x1bW4oZG9tKXtpZihkb20ubm9kZVR5cGU9PTMpe2lmKC9eXHMrJC8udGVzdChkb20ubm9kZVZhbHVlKSl7aWYoIWRvbS5wcmV2aW91c1NpYmxpbmcpcmV0dXJuITE7cmV0dXJuIGNoZWNrRG9udEVuZENvbHVtbihkb20ucHJldmlvdXNTaWJsaW5nKX0KcmV0dXJuITF9CmlmKGRvbS5ub2RlVHlwZSE9MSlyZXR1cm4hMTtpZigkKGRvbSkuaGFzQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJkb250ZW5kIikpKXJldHVybiEwO2lmKGRvbS5jaGlsZE5vZGVzLmxlbmd0aD09PTApcmV0dXJuITE7cmV0dXJuIGNoZWNrRG9udEVuZENvbHVtbihkb20uY2hpbGROb2Rlc1tkb20uY2hpbGROb2Rlcy5sZW5ndGgtMV0pfQpmdW5jdGlvbiBjb2x1bW5pemVJdCgpe2FkanVzdG1lbnQ9MDtpZihsYXN0V2lkdGg9PSRpbkJveC53aWR0aCgpKXJldHVybjtsYXN0V2lkdGg9JGluQm94LndpZHRoKCk7dmFyIG51bUNvbHM9TWF0aC5yb3VuZCgkaW5Cb3gud2lkdGgoKS9vcHRpb25zLndpZHRoKTt2YXIgb3B0aW9uV2lkdGg9b3B0aW9ucy53aWR0aDt2YXIgb3B0aW9uSGVpZ2h0PW9wdGlvbnMuaGVpZ2h0O2lmKG9wdGlvbnMuY29sdW1ucyludW1Db2xzPW9wdGlvbnMuY29sdW1ucztpZihtYW51YWxCcmVha3Mpe251bUNvbHM9JGNhY2hlLmZpbmQocHJlZml4VGhlQ2xhc3NOYW1lKCJjb2x1bW5icmVhayIsITApKS5sZW5ndGgrMTtvcHRpb25XaWR0aD0hMX0KaWYobnVtQ29sczw9MSYmIW9wdGlvbnMuZGlzYWJsZVNpbmdsZSl7cmV0dXJuIHNpbmdsZUNvbHVtbml6ZUl0KCl9CmlmKCRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIpKXJldHVybjskaW5Cb3guZGF0YSgiY29sdW1uaXplZCIsITApOyRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIsITApOyRpbkJveC5lbXB0eSgpOyRpbkJveC5hcHBlbmQoJCgiPGRpdiBzdHlsZT0nd2lkdGg6IitvcHRpb25zLnNldFdpZHRoKG51bUNvbHMpKyIlOyBmbG9hdDogIitvcHRpb25zLmNvbHVtbkZsb2F0KyI7Jz48L2Rpdj4iKSk7JGNvbD0kaW5Cb3guY2hpbGRyZW4oIjpsYXN0Iik7YXBwZW5kU2FmZSgkY29sLCRjYWNoZS5jbG9uZSgpKTttYXhIZWlnaHQ9JGNvbC5oZWlnaHQoKTskaW5Cb3guZW1wdHkoKTt2YXIgdGFyZ2V0SGVpZ2h0PW1heEhlaWdodC9udW1Db2xzO3ZhciBmaXJzdFRpbWU9ITA7dmFyIG1heExvb3BzPTM7dmFyIHNjcm9sbEhvcml6b250YWxseT0hMTtpZihvcHRpb25zLm92ZXJmbG93KXttYXhMb29wcz0xO3RhcmdldEhlaWdodD1vcHRpb25zLm92ZXJmbG93LmhlaWdodH1lbHNlIGlmKG9wdGlvbkhlaWdodCYmb3B0aW9uV2lkdGgpe21heExvb3BzPTE7dGFyZ2V0SGVpZ2h0PW9wdGlvbkhlaWdodDtzY3JvbGxIb3Jpem9udGFsbHk9ITB9CmZvcih2YXIgbG9vcENvdW50PTA7bG9vcENvdW50PG1heExvb3BzJiZsb29wQ291bnQ8MjA7bG9vcENvdW50KyspeyRpbkJveC5lbXB0eSgpO3ZhciAkZGVzdHJveWFibGUsY2xhc3NOYW1lLCRjb2wsJGxhc3RLaWQ7dHJ5eyRkZXN0cm95YWJsZT0kY2FjaGUuY2xvbmUoITApfWNhdGNoKGUpeyRkZXN0cm95YWJsZT0kY2FjaGUuY2xvbmUoKX0KJGRlc3Ryb3lhYmxlLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpO2Zvcih2YXIgaT0wO2k8bnVtQ29scztpKyspe2NsYXNzTmFtZT0oaT09PTApP3ByZWZpeFRoZUNsYXNzTmFtZSgiZmlyc3QiKToiIjtjbGFzc05hbWUrPSIgIitwcmVmaXhUaGVDbGFzc05hbWUoImNvbHVtbiIpO2NsYXNzTmFtZT0oaT09bnVtQ29scy0xKT8ocHJlZml4VGhlQ2xhc3NOYW1lKCJsYXN0IikrIiAiK2NsYXNzTmFtZSk6Y2xhc3NOYW1lOyRpbkJveC5hcHBlbmQoJCgiPGRpdiBjbGFzcz0nIitjbGFzc05hbWUrIicgc3R5bGU9J3dpZHRoOiIrb3B0aW9ucy5zZXRXaWR0aChudW1Db2xzKSsiJTsgZmxvYXQ6ICIrb3B0aW9ucy5jb2x1bW5GbG9hdCsiOyc+PC9kaXY+IikpfQppPTA7d2hpbGUoaTxudW1Db2xzLShvcHRpb25zLm92ZXJmbG93PzA6MSl8fHNjcm9sbEhvcml6b250YWxseSYmJGRlc3Ryb3lhYmxlLmNvbnRlbnRzKCkubGVuZ3RoKXtpZigkaW5Cb3guY2hpbGRyZW4oKS5sZW5ndGg8PWkpeyRpbkJveC5hcHBlbmQoJCgiPGRpdiBjbGFzcz0nIitjbGFzc05hbWUrIicgc3R5bGU9J3dpZHRoOiIrb3B0aW9ucy5zZXRXaWR0aChudW1Db2xzKSsiJTsgZmxvYXQ6ICIrb3B0aW9ucy5jb2x1bW5GbG9hdCsiOyc+PC9kaXY+IikpfQokY29sPSRpbkJveC5jaGlsZHJlbigpLmVxKGkpO2lmKHNjcm9sbEhvcml6b250YWxseSl7JGNvbC53aWR0aChvcHRpb25XaWR0aCsicHgiKX0KY29sdW1uaXplKCRjb2wsJGRlc3Ryb3lhYmxlLCRjb2wsdGFyZ2V0SGVpZ2h0KTtzcGxpdCgkY29sLCRkZXN0cm95YWJsZSwkY29sLHRhcmdldEhlaWdodCk7d2hpbGUoJGNvbC5jb250ZW50cygiOmxhc3QiKS5sZW5ndGgmJmNoZWNrRG9udEVuZENvbHVtbigkY29sLmNvbnRlbnRzKCI6bGFzdCIpLmdldCgwKSkpeyRsYXN0S2lkPSRjb2wuY29udGVudHMoIjpsYXN0Iik7JGxhc3RLaWQucmVtb3ZlKCk7JGRlc3Ryb3lhYmxlLnByZXBlbmQoJGxhc3RLaWQpfQppKys7aWYoJGNvbC5jb250ZW50cygpLmxlbmd0aD09PTAmJiRkZXN0cm95YWJsZS5jb250ZW50cygpLmxlbmd0aCl7JGNvbC5hcHBlbmQoJGRlc3Ryb3lhYmxlLmNvbnRlbnRzKCI6Zmlyc3QiKSl9ZWxzZSBpZihpPT1udW1Db2xzLShvcHRpb25zLm92ZXJmbG93PzA6MSkmJiFvcHRpb25zLm92ZXJmbG93KXtpZigkZGVzdHJveWFibGUuZmluZChwcmVmaXhUaGVDbGFzc05hbWUoImNvbHVtbmJyZWFrIiwhMCkpLmxlbmd0aCl7bnVtQ29scyArK319fQppZihvcHRpb25zLm92ZXJmbG93JiYhc2Nyb2xsSG9yaXpvbnRhbGx5KXt2YXIgSUU2PSExO3ZhciBJRTc9KGRvY3VtZW50LmFsbCkmJihuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCJNU0lFIDcuIikhPS0xKTtpZihJRTZ8fElFNyl7dmFyIGh0bWw9IiI7dmFyIGRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTt3aGlsZSgkZGVzdHJveWFibGVbMF0uY2hpbGROb2Rlcy5sZW5ndGg+MCl7dmFyIGtpZD0kZGVzdHJveWFibGVbMF0uY2hpbGROb2Rlc1swXTtmb3IoaT0wO2k8a2lkLmF0dHJpYnV0ZXMubGVuZ3RoO2krKyl7aWYoa2lkLmF0dHJpYnV0ZXNbaV0ubm9kZU5hbWUuaW5kZXhPZigialF1ZXJ5Iik9PT0wKXtraWQucmVtb3ZlQXR0cmlidXRlKGtpZC5hdHRyaWJ1dGVzW2ldLm5vZGVOYW1lKX19CmRpdi5pbm5lckhUTUw9IiI7ZGl2LmFwcGVuZENoaWxkKCRkZXN0cm95YWJsZVswXS5jaGlsZE5vZGVzWzBdKTtodG1sKz1kaXYuaW5uZXJIVE1MfQp2YXIgb3ZlcmZsb3c9JChvcHRpb25zLm92ZXJmbG93LmlkKVswXTtvdmVyZmxvdy5pbm5lckhUTUw9aHRtbH1lbHNleyQob3B0aW9ucy5vdmVyZmxvdy5pZCkuZW1wdHkoKS5hcHBlbmQoJGRlc3Ryb3lhYmxlLmNvbnRlbnRzKCkuY2xvbmUoITApKX19ZWxzZSBpZighc2Nyb2xsSG9yaXpvbnRhbGx5KXskY29sPSRpbkJveC5jaGlsZHJlbigpLmVxKCRpbkJveC5jaGlsZHJlbigpLmxlbmd0aC0xKTskZGVzdHJveWFibGUuY29udGVudHMoKS5lYWNoKGZ1bmN0aW9uKCl7JGNvbC5hcHBlbmQoJCh0aGlzKSl9KTt2YXIgYWZ0ZXJIPSRjb2wuaGVpZ2h0KCk7dmFyIGRpZmY9YWZ0ZXJILXRhcmdldEhlaWdodDt2YXIgdG90YWxIPTA7dmFyIG1pbj0xMDAwMDAwMDt2YXIgbWF4PTA7dmFyIGxhc3RJc01heD0hMTt2YXIgbnVtYmVyT2ZDb2x1bW5zVGhhdERvbnRFbmRJbkFDb2x1bW5CcmVhaz0wOyRpbkJveC5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oJGluQm94KXtyZXR1cm4gZnVuY3Rpb24oJGl0ZW0pe3ZhciAkY29sPSRpbkJveC5jaGlsZHJlbigpLmVxKCRpdGVtKTt2YXIgZW5kc0luQnJlYWs9JGNvbC5jaGlsZHJlbigiOmxhc3QiKS5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uYnJlYWsiLCEwKSkubGVuZ3RoO2lmKCFlbmRzSW5CcmVhayl7dmFyIGg9JGNvbC5oZWlnaHQoKTtsYXN0SXNNYXg9ITE7dG90YWxIKz1oO2lmKGg+bWF4KXttYXg9aDtsYXN0SXNNYXg9ITB9CmlmKGg8bWluKW1pbj1oO251bWJlck9mQ29sdW1uc1RoYXREb250RW5kSW5BQ29sdW1uQnJlYWsrK319fSgkaW5Cb3gpKTt2YXIgYXZnSD10b3RhbEgvbnVtYmVyT2ZDb2x1bW5zVGhhdERvbnRFbmRJbkFDb2x1bW5CcmVhaztpZih0b3RhbEg9PT0wKXtsb29wQ291bnQ9bWF4TG9vcHN9ZWxzZSBpZihvcHRpb25zLmxhc3ROZXZlclRhbGxlc3QmJmxhc3RJc01heCl7YWRqdXN0bWVudCs9NTt0YXJnZXRIZWlnaHQ9dGFyZ2V0SGVpZ2h0KzMwO2lmKGxvb3BDb3VudD09bWF4TG9vcHMtMSltYXhMb29wcysrfWVsc2UgaWYobWF4LW1pbj4zMCl7dGFyZ2V0SGVpZ2h0PWF2Z0grMzB9ZWxzZSBpZihNYXRoLmFicyhhdmdILXRhcmdldEhlaWdodCk+MjApe3RhcmdldEhlaWdodD1hdmdIfWVsc2V7bG9vcENvdW50PW1heExvb3BzfX1lbHNleyRpbkJveC5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oaSl7JGNvbD0kaW5Cb3guY2hpbGRyZW4oKS5lcShpKTskY29sLndpZHRoKG9wdGlvbldpZHRoKyJweCIpO2lmKGk9PT0wKXskY29sLmFkZENsYXNzKHByZWZpeFRoZUNsYXNzTmFtZSgiZmlyc3QiKSl9ZWxzZSBpZihpPT0kaW5Cb3guY2hpbGRyZW4oKS5sZW5ndGgtMSl7JGNvbC5hZGRDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImxhc3QiKSl9ZWxzZXskY29sLnJlbW92ZUNsYXNzKHByZWZpeFRoZUNsYXNzTmFtZSgiZmlyc3QiKSk7JGNvbC5yZW1vdmVDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImxhc3QiKSl9fSk7JGluQm94LndpZHRoKCRpbkJveC5jaGlsZHJlbigpLmxlbmd0aCpvcHRpb25XaWR0aCsicHgiKX0KJGluQm94LmFwcGVuZCgkKCI8YnIgc3R5bGU9J2NsZWFyOmJvdGg7Jz4iKSl9CiRpbkJveC5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uIiwhMCkpLmZpbmQoIjpmaXJzdCIrcHJlZml4VGhlQ2xhc3NOYW1lKCJyZW1vdmVpZmZpcnN0IiwhMCkpLnJlbW92ZSgpOyRpbkJveC5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uIiwhMCkpLmZpbmQoJzpsYXN0JytwcmVmaXhUaGVDbGFzc05hbWUoInJlbW92ZWlmbGFzdCIsITApKS5yZW1vdmUoKTskaW5Cb3guZmluZChwcmVmaXhUaGVDbGFzc05hbWUoInNwbGl0IiwhMCkpLmZpbmQoIjpmaXJzdCIrcHJlZml4VGhlQ2xhc3NOYW1lKCJyZW1vdmVpZmZpcnN0IiwhMCkpLnJlbW92ZSgpOyRpbkJveC5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgic3BsaXQiLCEwKSkuZmluZCgnOmxhc3QnK3ByZWZpeFRoZUNsYXNzTmFtZSgicmVtb3ZlaWZsYXN0IiwhMCkpLnJlbW92ZSgpOyRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIsITEpO2lmKG9wdGlvbnMub3ZlcmZsb3cpe29wdGlvbnMub3ZlcmZsb3cuZG9uZUZ1bmMoKX0Kb3B0aW9ucy5kb25lRnVuYygpfX0pfTskLmZuLnVuY29sdW1uaXplPWZ1bmN0aW9uKCl7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyICRlbD0kKHRoaXMpLCRjbG9uZTtpZigkY2xvbmU9JGVsLmRhdGEoREFUQV9PUklHSU5BTF9ET01fS0VZKSl7JGVsLnJlcGxhY2VXaXRoKCRjbG9uZSl9fSl9OyQuZm4ucmVudW1iZXJCeUpTPWZ1bmN0aW9uKCRzZWFyY2hUYWcsJGNvbG5vLCR0YXJnZXRJZCwkdGFyZ2V0Q2xhc3Mpe3RoaXMuc2V0TGlzdD1mdW5jdGlvbigkY29scywkbGlzdCwkdGFnMSl7dmFyICRwYXJlbnRzPXRoaXMuYmVmb3JlLnBhcmVudHMoKTt2YXIgJHJlc3Q7JHJlc3Q9JCgkY29sc1t0aGlzLm9mZnNldC0xXSkuZmluZCgnPionKTtpZigoJHJlc3QubGFzdCgpKVswXS50YWdOYW1lIT0kdGFnMS50b1VwcGVyQ2FzZSgpKXtpZih0aGlzLmRlYnVnKXtjb25zb2xlLmxvZygiTGFzdCBpdGVtIGluIHByZXZpb3VzIGNvbHVtbiwgaXNuJ3QgYSBsaXN0Li4uIil9CnJldHVybiAwfQokcmVzdD0kcmVzdC5sZW5ndGg7dmFyICR0aW50PTE7aWYodGhpcy5sYXN0T3RoZXI8PTApeyR0aW50PXRoaXMuYmVmb3JlLmNoaWxkcmVuKCkubGVuZ3RoKzF9ZWxzZXskdGludD0kKCRwYXJlbnRzW3RoaXMubGFzdE90aGVyXSkuY2hpbGRyZW4oKS5sZW5ndGgrMX0KaWYoJCgkY29sc1t0aGlzLm9mZnNldF0pLmZpbmQoJHRhZzErJzpmaXJzdCBsaS5zcGxpdCcpLmxlbmd0aCl7dmFyICR3aGVyZUVsaXBzaXM9JCgkY29sc1t0aGlzLm9mZnNldC0xXSkuZmluZCgkdGFnMSsnOmxhc3QgbGk6bGFzdCcpO2lmKHRoaXMuZWxpcHNpc1RleHQ9PT0nJ3x8JCgkY29sc1t0aGlzLm9mZnNldC0xXSkuZmluZCgkdGFnMSsnOmxhc3QgfiBkaXYnKS5sZW5ndGh8fCQoJGNvbHNbdGhpcy5vZmZzZXQtMV0pLmZpbmQoJHRhZzErJzpsYXN0IH4gcCcpLmxlbmd0aCl7fWVsc2V7aWYoJCgkd2hlcmVFbGlwc2lzKS5maW5kKCd1bCwgb2wsIGRsJykubGVuZ3RoPT0wKXt2YXIgJHR4dD0kd2hlcmVFbGlwc2lzLmxhc3QoKS50ZXh0KCk7dmFyICRsZW49JHR4dC5sZW5ndGg7aWYoJHR4dC5zdWJzdHJpbmcoJGxlbi0xKT09JzsnKXtpZigkdHh0LnN1YnN0cmluZygkbGVuLTQpIT10aGlzLmVsaXBzaXNUZXh0Kyc7Jyl7JHR4dD0kdHh0LnN1YnN0cmluZygwLCRsZW4tMSkrdGhpcy5lbGlwc2lzVGV4dCsnOyd9fWVsc2V7aWYoJHR4dC5zdWJzdHJpbmcoJGxlbi0zKSE9dGhpcy5lbGlwc2lzVGV4dCl7JHR4dCs9dGhpcy5lbGlwc2lzVGV4dH19CiR3aGVyZUVsaXBzaXMubGFzdCgpLnRleHQoJHR4dCl9fQppZigkKCRjb2xzW3RoaXMub2Zmc2V0XSkuZmluZCgkdGFnMSsnOmZpcnN0ID5saS5zcGxpdCA+JyskdGFnMSkubGVuZ3RoPT0wKXskdGludC0tfX0KaWYoJHJlc3Q9PTEpeyR0aW50Kz10aGlzLnByZXZNYXh9CmlmKHRoaXMubmVzdD4xKXtpZih0aGlzLmRlYnVnKXtjb25zb2xlLmxvZygiU3VwcG9zZWQgdG8gYmUgYSBuZXN0ZWQgbGlzdC4uLmRlY3IiKX0KJHRpbnQtLTt2YXIgJHR0PSQoJGNvbHNbdGhpcy5vZmZzZXQtMV0pLmZpbmQoJHRhZzErJzpmaXJzdCBsaS5zcGxpdDpmaXJzdCcpO2lmKCR0dC5sZW5ndGg+MCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coIlByZXZpb3VzIGNvbHVtbiBzdGFydGVkIHdpdGggYSBzcGxpdCBpdGVtLCBzbyB0aGF0IGNvdW50IGlzIG9uZSBsZXNzIHRoYW4gZXhwZWN0ZWQiKX0KJHRpbnQtLX0KJHR0PSQoJGNvbHNbdGhpcy5vZmZzZXRdKS5maW5kKCR0YWcxKyc6Zmlyc3QgbGk6Zmlyc3QnKS5jbG9uZSgpOyR0dC5jaGlsZHJlbigpLnJlbW92ZSgpO2lmKCQudHJpbSgkdHQudGV4dCgpKS5sZW5ndGg+MCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coIklmIHRoYXQgd2FzIGEgY29tcGxldGUgbGlzdCBpbiB0aGUgcHJldmlvdXMgY29sdW1uLCBkb24ndCBkZWNyLiIpfQokdGludCsrO2lmKCQoJGNvbHNbdGhpcy5vZmZzZXQtMV0pLmZpbmQoIj4iKyR0YWcxKyc6bGFzdCAnKS5jaGlsZHJlbigpLmxlbmd0aD09MCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coInVubGVzcyB0aGF0IHdhcyBlbXB0eSwgaW4gd2hpY2ggY2FzZSByZXZlcnQiKX0KJHRpbnQtLX19fWVsc2V7dmFyICR0dD0kKCRjb2xzW3RoaXMub2Zmc2V0XSkuZmluZCgkdGFnMSsnOmZpcnN0IGxpOmZpcnN0ICcrJHRhZzErIi5zcGxpdCBsaS5zcGxpdCIpO2lmKCR0dC5sZW5ndGg+MCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coIltOZXN0ZWRdIENvbHVtbiBzdGFydGVkIHdpdGggYSBzcGxpdCBpdGVtLCBzbyB0aGF0IGNvdW50IGlzIG9uZSBsZXNzIHRoYW4gZXhwZWN0ZWQiKX0KJHRpbnQtLX19CmlmKHRoaXMuZGVidWcpe2NvbnNvbGUubG9nKCJTZXR0aW5nIHRoZSBzdGFydCB2YWx1ZSB0byAiKyR0aW50KyIgKCIrdGhpcy5wcmV2TWF4KyIpIil9CmlmKCR0aW50PjApe2lmKHR5cGVvZiB0aGlzLnNldENvbHVtblN0YXJ0PT0nZnVuY3Rpb24nKXt0aGlzLnNldENvbHVtblN0YXJ0KCRsaXN0LCR0aW50KX1lbHNleyRsaXN0LmF0dHIoJ3N0YXJ0JywkdGludCl9fQpyZXR1cm4gMH0KaWYodHlwZW9mICR0YXJnZXRJZD09PSd1bmRlZmluZWQnKXskdGFyZ2V0SWQ9ITF9CmlmKHR5cGVvZiAkdGFyZ2V0Q2xhc3M9PT0ndW5kZWZpbmVkJyl7JHRhcmdldENsYXNzPSExfQppZighJHRhcmdldElkJiYhJHRhcmdldENsYXNzKXt0aHJvdyAicmVudW1iZXJCeUpTKCk6IEJhZCBwYXJhbSwgbXVzdCBwYXNzIGFuIGlkIG9yIGEgY2xhc3MifQp2YXIgJHRhcmdldD0nJzt0aGlzLnByZXZNYXg9MTtpZigkdGFyZ2V0Q2xhc3MpeyR0YXJnZXQ9Ii4iKyR0YXJnZXRDbGFzc31lbHNleyR0YXJnZXQ9IiMiKyR0YXJnZXRJZH0KdmFyICR0YWcxPSRzZWFyY2hUYWcudG9Mb3dlckNhc2UoKTt2YXIgJHRhZzI9JHNlYXJjaFRhZy50b1VwcGVyQ2FzZSgpO3RoaXMuY29scz0kKCR0YXJnZXQpO2lmKHRoaXMuZGVidWcpe2NvbnNvbGUubG9nKCJUaGVyZSBhcmUgIit0aGlzLmNvbHMubGVuZ3RoKyIgaXRlbXMsIGxvb2tpbmcgZm9yICIrJHRhZzEpfQp0aGlzLmJlZm9yZT0kKHRoaXMuY29sc1swXSkuZmluZCgkdGFnMSsnOmxhc3QnKTt0aGlzLnByZXZNYXg9dGhpcy5iZWZvcmUuY2hpbGRyZW4oKS5sZW5ndGg7Zm9yKHRoaXMub2Zmc2V0PTE7dGhpcy5vZmZzZXQ8dGhpcy5jb2xzLmxlbmd0aDt0aGlzLm9mZnNldCsrKXtpZih0aGlzLmRlYnVnKXtjb25zb2xlLmxvZygiaXRlcmF0aW5nICIrdGhpcy5vZmZzZXQrIi4uLltvZiAiK3RoaXMuY29scy5sZW5ndGgrIl0iKX0KaWYodGhpcy5vZmZzZXQlJGNvbG5vPT0wKXtpZih0aGlzLmRlYnVnKXtjb25zb2xlLmxvZygiRmlyc3QgY29sdW1uIChpbiB0aGVvcnkuLikiKX0KdGhpcy5wcmV2TWF4PTE7Y29udGludWV9CnRoaXMuYmVmb3JlPSQodGhpcy5jb2xzW3RoaXMub2Zmc2V0LTFdKS5maW5kKCR0YWcxKyc6bGFzdCcpO2lmKHRoaXMuYmVmb3JlLmxlbmd0aCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coIkhhdmUgc29tZSAiKyRzZWFyY2hUYWcrIiBlbGVtZW50cyBpbiB0aGUgcHJldmlvdXMgY29sdW1uIil9CnZhciAkbGlzdD0kKHRoaXMuY29sc1t0aGlzLm9mZnNldF0pLmZpbmQoJHRhZzErJzpmaXJzdCcpO3ZhciAkZmlyc3Q9JCh0aGlzLmNvbHNbdGhpcy5vZmZzZXRdKS5maW5kKCcqOmZpcnN0Jyk7aWYoJGZpcnN0WzBdIT09JGxpc3RbMF0pe2NvbnRpbnVlfQp2YXIgJHBhcmVudHM9dGhpcy5iZWZvcmUucGFyZW50cygpO3RoaXMubGFzdE90aGVyPTA7dmFyICRmb3VuZD0hMTtmb3IoO3RoaXMubGFzdE90aGVyPCRwYXJlbnRzLmxlbmd0aDt0aGlzLmxhc3RPdGhlcisrKXtpZigkcGFyZW50c1t0aGlzLmxhc3RPdGhlcl0udGFnTmFtZSE9JHRhZzImJiRwYXJlbnRzW3RoaXMubGFzdE90aGVyXS50YWdOYW1lIT0iTEkiKXskZm91bmQ9ITA7dGhpcy5sYXN0T3RoZXItLTticmVha319CnRoaXMubmVzdD0xO2lmKCQodGhpcy5jb2xzW3RoaXMub2Zmc2V0XSkuZmluZCgiPiIrJHRhZzErJzpmaXJzdCBsaSAnKyR0YWcxKyI6Zmlyc3QiKS5sZW5ndGgpe3RoaXMubmVzdD0yfQp0aGlzLnNldExpc3QodGhpcy5jb2xzLCRsaXN0LCR0YWcxKTt0aGlzLmxhc3RPdGhlci0tOyRsaXN0PSQodGhpcy5jb2xzW3RoaXMub2Zmc2V0XSkuZmluZCgkdGFnMSsnOmZpcnN0IGxpICcrJHRhZzErIjpmaXJzdCIpO2lmKCRsaXN0Lmxlbmd0aCl7dGhpcy5iZWZvcmU9JCh0aGlzLmNvbHNbdGhpcy5vZmZzZXQtMV0pLmZpbmQoIj4iKyR0YWcxKyc6bGFzdCBsaSAnKyR0YWcxKyI6bGFzdCIpO3RoaXMucHJldk1heD0wO3RoaXMubmVzdD0xO3RoaXMuc2V0TGlzdCh0aGlzLmNvbHMsJGxpc3QsJHRhZzEpfQp2YXIgJHJlc2V0PSQodGhpcy5jb2xzW3RoaXMub2Zmc2V0LTFdKS5maW5kKCI+IiskdGFnMSsnOmxhc3QnKTt0aGlzLnByZXZNYXg9JHJlc2V0LmNoaWxkcmVuKCkubGVuZ3RofX0KcmV0dXJuIDB9fSkoalF1ZXJ5KTshZnVuY3Rpb24oYSl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiXSxmdW5jdGlvbihiKXtyZXR1cm4gYShiKX0pOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEocmVxdWlyZSgianF1ZXJ5IikpOmEod2luZG93LmpRdWVyeSl9KGZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGEpe3ZvaWQgMD09PWEmJihhPXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSxhPWEudG9Mb3dlckNhc2UoKTt2YXIgYj0vKGVkZ2UpXC8oW1x3Ll0rKS8uZXhlYyhhKXx8LyhvcHIpW1wvXShbXHcuXSspLy5leGVjKGEpfHwvKGNocm9tZSlbIFwvXShbXHcuXSspLy5leGVjKGEpfHwvKGllbW9iaWxlKVtcL10oW1x3Ll0rKS8uZXhlYyhhKXx8Lyh2ZXJzaW9uKShhcHBsZXdlYmtpdClbIFwvXShbXHcuXSspLiooc2FmYXJpKVsgXC9dKFtcdy5dKykvLmV4ZWMoYSl8fC8od2Via2l0KVsgXC9dKFtcdy5dKykuKih2ZXJzaW9uKVsgXC9dKFtcdy5dKykuKihzYWZhcmkpWyBcL10oW1x3Ll0rKS8uZXhlYyhhKXx8Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8uZXhlYyhhKXx8LyhvcGVyYSkoPzouKnZlcnNpb258KVsgXC9dKFtcdy5dKykvLmV4ZWMoYSl8fC8obXNpZSkgKFtcdy5dKykvLmV4ZWMoYSl8fGEuaW5kZXhPZigidHJpZGVudCIpPj0wJiYvKHJ2KSg/Ojp8ICkoW1x3Ll0rKS8uZXhlYyhhKXx8YS5pbmRleE9mKCJjb21wYXRpYmxlIik8MCYmLyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKXwpLy5leGVjKGEpfHxbXSxjPS8oaXBhZCkvLmV4ZWMoYSl8fC8oaXBvZCkvLmV4ZWMoYSl8fC8od2luZG93cyBwaG9uZSkvLmV4ZWMoYSl8fC8oaXBob25lKS8uZXhlYyhhKXx8LyhraW5kbGUpLy5leGVjKGEpfHwvKHNpbGspLy5leGVjKGEpfHwvKGFuZHJvaWQpLy5leGVjKGEpfHwvKHdpbikvLmV4ZWMoYSl8fC8obWFjKS8uZXhlYyhhKXx8LyhsaW51eCkvLmV4ZWMoYSl8fC8oY3JvcykvLmV4ZWMoYSl8fC8ocGxheWJvb2spLy5leGVjKGEpfHwvKGJiKS8uZXhlYyhhKXx8LyhibGFja2JlcnJ5KS8uZXhlYyhhKXx8W10sZD17fSxlPXticm93c2VyOmJbNV18fGJbM118fGJbMV18fCIiLHZlcnNpb246YlsyXXx8Yls0XXx8IjAiLHZlcnNpb25OdW1iZXI6Yls0XXx8YlsyXXx8IjAiLHBsYXRmb3JtOmNbMF18fCIifTtpZihlLmJyb3dzZXImJihkW2UuYnJvd3Nlcl09ITAsZC52ZXJzaW9uPWUudmVyc2lvbixkLnZlcnNpb25OdW1iZXI9cGFyc2VJbnQoZS52ZXJzaW9uTnVtYmVyLDEwKSksZS5wbGF0Zm9ybSYmKGRbZS5wbGF0Zm9ybV09ITApLChkLmFuZHJvaWR8fGQuYmJ8fGQuYmxhY2tiZXJyeXx8ZC5pcGFkfHxkLmlwaG9uZXx8ZC5pcG9kfHxkLmtpbmRsZXx8ZC5wbGF5Ym9va3x8ZC5zaWxrfHxkWyJ3aW5kb3dzIHBob25lIl0pJiYoZC5tb2JpbGU9ITApLChkLmNyb3N8fGQubWFjfHxkLmxpbnV4fHxkLndpbikmJihkLmRlc2t0b3A9ITApLChkLmNocm9tZXx8ZC5vcHJ8fGQuc2FmYXJpKSYmKGQud2Via2l0PSEwKSxkLnJ2fHxkLmllbW9iaWxlKXt2YXIgZj0ibXNpZSI7ZS5icm93c2VyPWYsZFtmXT0hMH1pZihkLmVkZ2Upe2RlbGV0ZSBkLmVkZ2U7dmFyIGc9Im1zZWRnZSI7ZS5icm93c2VyPWcsZFtnXT0hMH1pZihkLnNhZmFyaSYmZC5ibGFja2JlcnJ5KXt2YXIgaD0iYmxhY2tiZXJyeSI7ZS5icm93c2VyPWgsZFtoXT0hMH1pZihkLnNhZmFyaSYmZC5wbGF5Ym9vayl7dmFyIGk9InBsYXlib29rIjtlLmJyb3dzZXI9aSxkW2ldPSEwfWlmKGQuYmIpe3ZhciBqPSJibGFja2JlcnJ5IjtlLmJyb3dzZXI9aixkW2pdPSEwfWlmKGQub3ByKXt2YXIgaz0ib3BlcmEiO2UuYnJvd3Nlcj1rLGRba109ITB9aWYoZC5zYWZhcmkmJmQuYW5kcm9pZCl7dmFyIGw9ImFuZHJvaWQiO2UuYnJvd3Nlcj1sLGRbbF09ITB9aWYoZC5zYWZhcmkmJmQua2luZGxlKXt2YXIgbT0ia2luZGxlIjtlLmJyb3dzZXI9bSxkW21dPSEwfWlmKGQuc2FmYXJpJiZkLnNpbGspe3ZhciBuPSJzaWxrIjtlLmJyb3dzZXI9bixkW25dPSEwfXJldHVybiBkLm5hbWU9ZS5icm93c2VyLGQucGxhdGZvcm09ZS5wbGF0Zm9ybSxkfXJldHVybiB3aW5kb3cualFCcm93c2VyPWIod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy5qUUJyb3dzZXIudWFNYXRjaD1iLGEmJihhLmJyb3dzZXI9d2luZG93LmpRQnJvd3Nlciksd2luZG93LmpRQnJvd3Nlcn0pOyhmdW5jdGlvbigkKXskLmZuLmV4dGVuZCh7YnhHYWxsZXJ5OmZ1bmN0aW9uKG9wdGlvbnMpe3ZhciBkZWZhdWx0cz17bWF4d2lkdGg6JycsbWF4aGVpZ2h0OicnLHRodW1id2lkdGg6MjAwLHRodW1iY3JvcDohMSxjcm9wcGVyY2VudDouMzUsdGh1bWJwbGFjZW1lbnQ6J2JvdHRvbScsdGh1bWJjb250YWluZXI6Jycsb3BhY2l0eTouNyxsb2FkX3RleHQ6JycsbG9hZF9pbWFnZTonaHR0cDovL2kzMDIucGhvdG9idWNrZXQuY29tL2FsYnVtcy9ubjkyL3dhbmRvbGVkemVwL3NwaW5uZXIuZ2lmJyx3cmFwcGVyY2xhc3M6J291dGVyJ30KdmFyIG9wdGlvbnM9JC5leHRlbmQoZGVmYXVsdHMsb3B0aW9ucyk7dmFyIG89b3B0aW9uczt2YXIgY29udD0nJzt2YXIgY2FwdGlvbj0nJzt2YXIgY2FwdGlvbkV4dHJhPTEwO3ZhciAkb3V0ZXI9Jyc7dmFyICRvcmlnPXRoaXM7dmFyIHRhbGw9MDt2YXIgd2lkZT0wO3ZhciBzaG93aW5nPTA7dmFyIGk9MDt2YXIgaz0kb3JpZy5maW5kKCdhIGltZycpLnNpemUoKTt2YXIgY3VycmVudDtwcmVsb2FkX2ltZygpO2Z1bmN0aW9uIHByZWxvYWRfaW1nKCl7JG9yaWcuaGlkZSgpO2lmKG8ubG9hZF90ZXh0IT0nJyl7JG9yaWcuYmVmb3JlKCc8ZGl2IGlkPSJsb2FkaW5nIj4nK28ubG9hZF90ZXh0Kyc8L2Rpdj4nKX1lbHNleyRvcmlnLmJlZm9yZSgnPGRpdiBpZD0ibG9hZGluZyI+PGltZyBzcmM9Iicrby5sb2FkX2ltYWdlKyciIC8+PC9kaXY+Jyl9CiRvcmlnLnBhcmVudCgpLmZpbmQoJyNsb2FkaW5nJykuY3NzKHsndGV4dEFsaWduJzonY2VudGVyJywnd2lkdGgnOm8ubWF4d2lkdGh9KTskb3JpZy5maW5kKCdhIGltZycpLmVhY2goZnVuY3Rpb24oKXt2YXIgdGhlX3NvdXJjZT0kKHRoaXMpLmF0dHIoJ3NyYycpO3ZhciB0aGVfaW1nPW5ldyBJbWFnZSgpO3RoZV9pbWcub25sb2FkPWZ1bmN0aW9uKCl7cHJlbG9hZF9jaGVjaygpfTt0aGVfaW1nLnNyYz10aGVfc291cmNlfSl9CmZ1bmN0aW9uIHByZWxvYWRfY2hlY2soKXtpKys7aWYoaT09ayl7aW5pdCgpfX0KZnVuY3Rpb24gaW5pdCgpe3NldF9sYXlvdXQoKTtzZXRfbWFpbl9pbWcoKTtwbGFjZV90aHVtYmNvbnRhaW5lcigpO3NldF90aHVtYnMoKX0KZnVuY3Rpb24gc2V0X2xheW91dCgpeyRvcmlnLnBhcmVudCgpLmZpbmQoJyNsb2FkaW5nJykuaGlkZSgpOyRvcmlnLnNob3coKTskb3JpZy53cmFwKCc8ZGl2IGNsYXNzPSInK28ud3JhcHBlcmNsYXNzKyciPjwvZGl2PicpOyRvdXRlcj0kb3JpZy5wYXJlbnQoKTskb3JpZy5maW5kKCdsaScpLmNzcyh7J3Bvc2l0aW9uJzonYWJzb2x1dGUnfSl9CmZ1bmN0aW9uIHNldF9tYWluX2ltZygpeyRvcmlnLmZpbmQoJ2EgaW1nJykuZWFjaChmdW5jdGlvbigpe3ZhciAkdGhpcz0kKHRoaXMpO3ZhciAkaW1naGVpZ2h0PSR0aGlzLmhlaWdodCgpO3ZhciAkaW1nd2lkdGg9JHRoaXMud2lkdGgoKTtpZigkdGhpcy5wcm9wKCd0aXRsZScpIT0nJyl7Y2FwdGlvbj0kdGhpcy5wcm9wKCd0aXRsZScpOyR0aGlzLnBhcmVudCgpLmFwcGVuZCgnPGRpdiBjbGFzcz0iY2FwdGlvbiI+JytjYXB0aW9uKyc8L2Rpdj4nKX0KaWYoby5tYXh3aWR0aCE9Jycpe2lmKCR0aGlzLndpZHRoKCk+by5tYXh3aWR0aCl7JHRoaXMud2lkdGgoby5tYXh3aWR0aCk7JHRoaXMuaGVpZ2h0KCgkaW1naGVpZ2h0LyRpbWd3aWR0aCkqby5tYXh3aWR0aCl9fQppZihvLm1heGhlaWdodCE9Jycpe2lmKCR0aGlzLmhlaWdodCgpPm8ubWF4aGVpZ2h0KXskdGhpcy5oZWlnaHQoby5tYXhoZWlnaHQpOyR0aGlzLndpZHRoKCgkaW1nd2lkdGgvJGltZ2hlaWdodCkqby5tYXhoZWlnaHQpfX0KdmFyIGNhcHRpb25oZWlnaHQ9MDtpZigkdGhpcy5wYXJlbnQoKS5maW5kKCcuY2FwdGlvbicpLmhlaWdodCgpPjApe2NhcHRpb25oZWlnaHQ9JHRoaXMucGFyZW50KCkuZmluZCgnLmNhcHRpb24nKS5oZWlnaHQoKStjYXB0aW9uRXh0cmF9CmlmKCR0aGlzLmhlaWdodCgpK2NhcHRpb25oZWlnaHQ+dGFsbCl7dGFsbD0kdGhpcy5oZWlnaHQoKStjYXB0aW9uaGVpZ2h0fQppZigkdGhpcy53aWR0aCgpPndpZGUpe3dpZGU9JHRoaXMud2lkdGgoKX0KY29udCs9JzxsaT48aW1nIHNyYz0iJyskdGhpcy5wcm9wKCdzcmMnKSsnIiAvPjwvbGk+J30pOyRvcmlnLmZpbmQoJ2xpOm5vdCg6Zmlyc3QpJykuaGlkZSgpOyRvcmlnLmhlaWdodCh0YWxsKTskb3JpZy53aWR0aCh3aWRlKTskb3V0ZXIuZmluZCgnLmNhcHRpb24nKS53aWR0aCh3aWRlKX0KZnVuY3Rpb24gcGxhY2VfdGh1bWJjb250YWluZXIoKXtpZihvLnRodW1icGxhY2VtZW50PT0ndG9wJyl7JG91dGVyLnByZXBlbmQoJzx1bCBjbGFzcz0idGh1bWJzIj4nK2NvbnQrJzwvdWw+Jyk7JG91dGVyLmZpbmQoJy50aHVtYnMnKS5jc3MoeydvdmVyZmxvdyc6J2F1dG8nfSl9ZWxzZSBpZihvLnRodW1icGxhY2VtZW50PT0nbGVmdCcpeyRvdXRlci5wcmVwZW5kKCc8dWwgY2xhc3M9InRodW1icyI+Jytjb250Kyc8L3VsPicpOyRvcmlnLmNzcyh7J2Zsb2F0JzonbGVmdCd9KTskb3V0ZXIuZmluZCgnLnRodW1icycpLmNzcyh7J2Zsb2F0JzonbGVmdCd9KX1lbHNlIGlmKG8udGh1bWJwbGFjZW1lbnQ9PSdib3R0b20nKXskb3V0ZXIuYXBwZW5kKCc8dWwgY2xhc3M9InRodW1icyI+Jytjb250Kyc8L3VsPicpfWVsc2UgaWYoby50aHVtYnBsYWNlbWVudD09J3JpZ2h0Jyl7JG91dGVyLmFwcGVuZCgnPHVsIGNsYXNzPSJ0aHVtYnMiPicrY29udCsnPC91bD4nKTskb3JpZy5jc3MoeydmbG9hdCc6J2xlZnQnfSk7JG91dGVyLmZpbmQoJy50aHVtYnMnKS5jc3MoeydmbG9hdCc6J2xlZnQnfSl9CiRvdXRlci5hcHBlbmQoJzxkaXYgc3R5bGU9ImNsZWFyOmJvdGgiPjwvZGl2PicpO2lmKG8udGh1bWJjb250YWluZXIhPScnKXskb3V0ZXIuZmluZCgnLnRodW1icycpLndpZHRoKG8udGh1bWJjb250YWluZXIpfX0KZnVuY3Rpb24gc2V0X3RodW1icygpeyRvdXRlci5maW5kKCcudGh1bWJzIGxpJykuZWFjaChmdW5jdGlvbigpe3ZhciAkdGhpcz0kKHRoaXMpO3ZhciAkaW1nPSR0aGlzLmZpbmQoJ2ltZycpO3ZhciAkaW1nd2lkdGg9JGltZy53aWR0aCgpO3ZhciAkaW1naGVpZ2h0PSRpbWcuaGVpZ2h0KCk7aWYoby50aHVtYmNyb3ApeyRpbWcud2lkdGgoJGltZ3dpZHRoKm8uY3JvcHBlcmNlbnQpOyRpbWcuaGVpZ2h0KCgkaW1naGVpZ2h0LyRpbWd3aWR0aCkqJGltZy53aWR0aCgpKTskdGhpcy5jc3MoeydmbG9hdCc6J2xlZnQnLCd3aWR0aCc6by50aHVtYndpZHRoLCdoZWlnaHQnOm8udGh1bWJ3aWR0aCwnb3ZlcmZsb3cnOidoaWRkZW4nLCdjdXJzb3InOidwb2ludGVyJ30pfWVsc2V7JGltZy53aWR0aChvLnRodW1id2lkdGgpOyRpbWcuaGVpZ2h0KCgkaW1naGVpZ2h0LyRpbWd3aWR0aCkqby50aHVtYndpZHRoKTskdGhpcy5jc3MoeydmbG9hdCc6J2xlZnQnLCdjdXJzb3InOidwb2ludGVyJ30pOyR0aGlzLmhlaWdodCgkaW1nLmhlaWdodCgpKX0KJHRoaXMuY2xpY2soZnVuY3Rpb24oKXt2YXIgeD0kb3V0ZXIuZmluZCgnLnRodW1icyBsaScpLmluZGV4KCR0aGlzKTtpZihzaG93aW5nIT14KXskb3JpZy5maW5kKCdsaScpLmZhZGVPdXQoKTskb3JpZy5maW5kKCdsaScpLmVxKHgpLmZhZGVJbigpO3Nob3dpbmc9eH19KX0pO3ZhciAkdGh1bWI9JG91dGVyLmZpbmQoJy50aHVtYnMgbGknKTskdGh1bWIuZXEoMCkuYWRkQ2xhc3MoJ29uJyk7JHRodW1iLm5vdCgnLm9uJykuZmFkZVRvKDAsby5vcGFjaXR5KTskdGh1bWIuY2xpY2soZnVuY3Rpb24oKXt2YXIgdD0kKHRoaXMpO3ZhciBpPSR0aHVtYi5pbmRleCh0aGlzKTtpZihjdXJyZW50IT1pKXskdGh1bWIucmVtb3ZlQ2xhc3MoJ29uJyk7dC5hZGRDbGFzcygnb24nKTskdGh1bWIubm90KCcub24nKS5mYWRlVG8oMjAwLG8ub3BhY2l0eSk7Y3VycmVudD1pfX0pLmhvdmVyKGZ1bmN0aW9uKCl7JCh0aGlzKS5zdG9wKCkuZmFkZVRvKDIwMCwxKTskKHRoaXMpLmNsaWNrKCl9LGZ1bmN0aW9uKCl7JCh0aGlzKS5ub3QoJy5vbicpLnN0b3AoKS5mYWRlVG8oMjAwLG8ub3BhY2l0eSl9KX19fSl9KShqUXVlcnkpOyhmdW5jdGlvbigkLGRvY3VtZW50LHdpbmRvdyl7dmFyCmRlZmF1bHRzPXtodG1sOiExLHBob3RvOiExLGlmcmFtZTohMSxpbmxpbmU6ITEsdHJhbnNpdGlvbjoiZWxhc3RpYyIsc3BlZWQ6MzAwLGZhZGVPdXQ6MzAwLHdpZHRoOiExLGluaXRpYWxXaWR0aDoiNjAwIixpbm5lcldpZHRoOiExLG1heFdpZHRoOiExLGhlaWdodDohMSxpbml0aWFsSGVpZ2h0OiI0NTAiLGlubmVySGVpZ2h0OiExLG1heEhlaWdodDohMSxzY2FsZVBob3RvczohMCxzY3JvbGxpbmc6ITAsaHJlZjohMSx0aXRsZTohMSxyZWw6ITEsb3BhY2l0eTowLjkscHJlbG9hZGluZzohMCxjbGFzc05hbWU6ITEsb3ZlcmxheUNsb3NlOiEwLGVzY0tleTohMCxhcnJvd0tleTohMCx0b3A6ITEsYm90dG9tOiExLGxlZnQ6ITEscmlnaHQ6ITEsZml4ZWQ6ITEsZGF0YTp1bmRlZmluZWQsY2xvc2VCdXR0b246ITAsZmFzdElmcmFtZTohMCxvcGVuOiExLHJlcG9zaXRpb246ITAsbG9vcDohMCxzbGlkZXNob3c6ITEsc2xpZGVzaG93QXV0bzohMCxzbGlkZXNob3dTcGVlZDoyNTAwLHNsaWRlc2hvd1N0YXJ0OiJzdGFydCBzbGlkZXNob3ciLHNsaWRlc2hvd1N0b3A6InN0b3Agc2xpZGVzaG93IixwaG90b1JlZ2V4Oi9cLihnaWZ8cG5nfGpwKGV8Z3xlZyl8Ym1wfGljb3x3ZWJwKSgoI3xcPykuKik/JC9pLHJldGluYUltYWdlOiExLHJldGluYVVybDohMSxyZXRpbmFTdWZmaXg6J0AyeC4kMScsY3VycmVudDoiaW1hZ2Uge2N1cnJlbnR9IG9mIHt0b3RhbH0iLHByZXZpb3VzOiJwcmV2aW91cyIsbmV4dDoibmV4dCIsY2xvc2U6ImNsb3NlIix4aHJFcnJvcjoiVGhpcyBjb250ZW50IGZhaWxlZCB0byBsb2FkLiIsaW1nRXJyb3I6IlRoaXMgaW1hZ2UgZmFpbGVkIHRvIGxvYWQuIixyZXR1cm5Gb2N1czohMCx0cmFwRm9jdXM6ITAsb25PcGVuOiExLG9uTG9hZDohMSxvbkNvbXBsZXRlOiExLG9uQ2xlYW51cDohMSxvbkNsb3NlZDohMX0sY29sb3Jib3g9J2NvbG9yYm94JyxwcmVmaXg9J2Nib3gnLGJveEVsZW1lbnQ9cHJlZml4KydFbGVtZW50JyxldmVudF9vcGVuPXByZWZpeCsnX29wZW4nLGV2ZW50X2xvYWQ9cHJlZml4KydfbG9hZCcsZXZlbnRfY29tcGxldGU9cHJlZml4KydfY29tcGxldGUnLGV2ZW50X2NsZWFudXA9cHJlZml4KydfY2xlYW51cCcsZXZlbnRfY2xvc2VkPXByZWZpeCsnX2Nsb3NlZCcsZXZlbnRfcHVyZ2U9cHJlZml4KydfcHVyZ2UnLCRvdmVybGF5LCRib3gsJHdyYXAsJGNvbnRlbnQsJHRvcEJvcmRlciwkbGVmdEJvcmRlciwkcmlnaHRCb3JkZXIsJGJvdHRvbUJvcmRlciwkcmVsYXRlZCwkd2luZG93LCRsb2FkZWQsJGxvYWRpbmdCYXksJGxvYWRpbmdPdmVybGF5LCR0aXRsZSwkY3VycmVudCwkc2xpZGVzaG93LCRuZXh0LCRwcmV2LCRjbG9zZSwkZ3JvdXBDb250cm9scywkZXZlbnRzPSQoJzxhLz4nKSxzZXR0aW5ncyxpbnRlcmZhY2VIZWlnaHQsaW50ZXJmYWNlV2lkdGgsbG9hZGVkSGVpZ2h0LGxvYWRlZFdpZHRoLGVsZW1lbnQsaW5kZXgscGhvdG8sb3BlbixhY3RpdmUsY2xvc2luZyxsb2FkaW5nVGltZXIscHVibGljTWV0aG9kLGRpdj0iZGl2IixjbGFzc05hbWUscmVxdWVzdHM9MCxwcmV2aW91c0NTUz17fSxpbml0O2Z1bmN0aW9uICR0YWcodGFnLGlkLGNzcyl7dmFyIGVsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO2lmKGlkKXtlbGVtZW50LmlkPXByZWZpeCtpZH0KaWYoY3NzKXtlbGVtZW50LnN0eWxlLmNzc1RleHQ9Y3NzfQpyZXR1cm4gJChlbGVtZW50KX0KZnVuY3Rpb24gd2luaGVpZ2h0KCl7cmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodD93aW5kb3cuaW5uZXJIZWlnaHQ6JCh3aW5kb3cpLmhlaWdodCgpfQpmdW5jdGlvbiBnZXRJbmRleChpbmNyZW1lbnQpe3ZhcgptYXg9JHJlbGF0ZWQubGVuZ3RoLG5ld0luZGV4PShpbmRleCtpbmNyZW1lbnQpJW1heDtyZXR1cm4obmV3SW5kZXg8MCk/bWF4K25ld0luZGV4Om5ld0luZGV4fQpmdW5jdGlvbiBzZXRTaXplKHNpemUsZGltZW5zaW9uKXtyZXR1cm4gTWF0aC5yb3VuZCgoLyUvLnRlc3Qoc2l6ZSk/KChkaW1lbnNpb249PT0neCc/JHdpbmRvdy53aWR0aCgpOndpbmhlaWdodCgpKS8xMDApOjEpKnBhcnNlSW50KHNpemUsMTApKX0KZnVuY3Rpb24gaXNJbWFnZShzZXR0aW5ncyx1cmwpe3JldHVybiBzZXR0aW5ncy5waG90b3x8c2V0dGluZ3MucGhvdG9SZWdleC50ZXN0KHVybCl9CmZ1bmN0aW9uIHJldGluYVVybChzZXR0aW5ncyx1cmwpe3JldHVybiBzZXR0aW5ncy5yZXRpbmFVcmwmJndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvPjE/dXJsLnJlcGxhY2Uoc2V0dGluZ3MucGhvdG9SZWdleCxzZXR0aW5ncy5yZXRpbmFTdWZmaXgpOnVybH0KZnVuY3Rpb24gdHJhcEZvY3VzKGUpe2lmKCdjb250YWlucycgaW4gJGJveFswXSYmISRib3hbMF0uY29udGFpbnMoZS50YXJnZXQpKXtlLnN0b3BQcm9wYWdhdGlvbigpOyRib3guZm9jdXMoKX19CmZ1bmN0aW9uIG1ha2VTZXR0aW5ncygpe3ZhciBpLGRhdGE9JC5kYXRhKGVsZW1lbnQsY29sb3Jib3gpO2lmKGRhdGE9PW51bGwpe3NldHRpbmdzPSQuZXh0ZW5kKHt9LGRlZmF1bHRzKTtpZihjb25zb2xlJiZjb25zb2xlLmxvZyl7Y29uc29sZS5sb2coJ0Vycm9yOiBjYm94RWxlbWVudCBtaXNzaW5nIHNldHRpbmdzIG9iamVjdCcpfX1lbHNle3NldHRpbmdzPSQuZXh0ZW5kKHt9LGRhdGEpfQpmb3IoaSBpbiBzZXR0aW5ncyl7aWYoJC5pc0Z1bmN0aW9uKHNldHRpbmdzW2ldKSYmaS5zbGljZSgwLDIpIT09J29uJyl7c2V0dGluZ3NbaV09c2V0dGluZ3NbaV0uY2FsbChlbGVtZW50KX19CnNldHRpbmdzLnJlbD1zZXR0aW5ncy5yZWx8fGVsZW1lbnQucmVsfHwkKGVsZW1lbnQpLmRhdGEoJ3JlbCcpfHwnbm9mb2xsb3cnO3NldHRpbmdzLmhyZWY9c2V0dGluZ3MuaHJlZnx8JChlbGVtZW50KS5hdHRyKCdocmVmJyk7c2V0dGluZ3MudGl0bGU9c2V0dGluZ3MudGl0bGV8fGVsZW1lbnQudGl0bGU7aWYodHlwZW9mIHNldHRpbmdzLmhyZWY9PT0ic3RyaW5nIil7c2V0dGluZ3MuaHJlZj0kLnRyaW0oc2V0dGluZ3MuaHJlZil9fQpmdW5jdGlvbiB0cmlnZ2VyKGV2ZW50LGNhbGxiYWNrKXskKGRvY3VtZW50KS50cmlnZ2VyKGV2ZW50KTskZXZlbnRzLnRyaWdnZXJIYW5kbGVyKGV2ZW50KTtpZigkLmlzRnVuY3Rpb24oY2FsbGJhY2spKXtjYWxsYmFjay5jYWxsKGVsZW1lbnQpfX0KdmFyIHNsaWRlc2hvdz0oZnVuY3Rpb24oKXt2YXIgYWN0aXZlLGNsYXNzTmFtZT1wcmVmaXgrIlNsaWRlc2hvd18iLGNsaWNrPSJjbGljay4iK3ByZWZpeCx0aW1lT3V0O2Z1bmN0aW9uIGNsZWFyKCl7Y2xlYXJUaW1lb3V0KHRpbWVPdXQpfQpmdW5jdGlvbiBzZXQoKXtpZihzZXR0aW5ncy5sb29wfHwkcmVsYXRlZFtpbmRleCsxXSl7Y2xlYXIoKTt0aW1lT3V0PXNldFRpbWVvdXQocHVibGljTWV0aG9kLm5leHQsc2V0dGluZ3Muc2xpZGVzaG93U3BlZWQpfX0KZnVuY3Rpb24gc3RhcnQoKXskc2xpZGVzaG93Lmh0bWwoc2V0dGluZ3Muc2xpZGVzaG93U3RvcCkudW5iaW5kKGNsaWNrKS5vbmUoY2xpY2ssc3RvcCk7JGV2ZW50cy5iaW5kKGV2ZW50X2NvbXBsZXRlLHNldCkuYmluZChldmVudF9sb2FkLGNsZWFyKTskYm94LnJlbW92ZUNsYXNzKGNsYXNzTmFtZSsib2ZmIikuYWRkQ2xhc3MoY2xhc3NOYW1lKyJvbiIpfQpmdW5jdGlvbiBzdG9wKCl7Y2xlYXIoKTskZXZlbnRzLnVuYmluZChldmVudF9jb21wbGV0ZSxzZXQpLnVuYmluZChldmVudF9sb2FkLGNsZWFyKTskc2xpZGVzaG93Lmh0bWwoc2V0dGluZ3Muc2xpZGVzaG93U3RhcnQpLnVuYmluZChjbGljaykub25lKGNsaWNrLGZ1bmN0aW9uKCl7cHVibGljTWV0aG9kLm5leHQoKTtzdGFydCgpfSk7JGJveC5yZW1vdmVDbGFzcyhjbGFzc05hbWUrIm9uIikuYWRkQ2xhc3MoY2xhc3NOYW1lKyJvZmYiKX0KZnVuY3Rpb24gcmVzZXQoKXthY3RpdmU9ITE7JHNsaWRlc2hvdy5oaWRlKCk7Y2xlYXIoKTskZXZlbnRzLnVuYmluZChldmVudF9jb21wbGV0ZSxzZXQpLnVuYmluZChldmVudF9sb2FkLGNsZWFyKTskYm94LnJlbW92ZUNsYXNzKGNsYXNzTmFtZSsib2ZmICIrY2xhc3NOYW1lKyJvbiIpfQpyZXR1cm4gZnVuY3Rpb24oKXtpZihhY3RpdmUpe2lmKCFzZXR0aW5ncy5zbGlkZXNob3cpeyRldmVudHMudW5iaW5kKGV2ZW50X2NsZWFudXAscmVzZXQpO3Jlc2V0KCl9fWVsc2V7aWYoc2V0dGluZ3Muc2xpZGVzaG93JiYkcmVsYXRlZFsxXSl7YWN0aXZlPSEwOyRldmVudHMub25lKGV2ZW50X2NsZWFudXAscmVzZXQpO2lmKHNldHRpbmdzLnNsaWRlc2hvd0F1dG8pe3N0YXJ0KCl9ZWxzZXtzdG9wKCl9CiRzbGlkZXNob3cuc2hvdygpfX19fSgpKTtmdW5jdGlvbiBsYXVuY2godGFyZ2V0KXtpZighY2xvc2luZyl7ZWxlbWVudD10YXJnZXQ7bWFrZVNldHRpbmdzKCk7JHJlbGF0ZWQ9JChlbGVtZW50KTtpbmRleD0wO2lmKHNldHRpbmdzLnJlbCE9PSdub2ZvbGxvdycpeyRyZWxhdGVkPSQoJy4nK2JveEVsZW1lbnQpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBkYXRhPSQuZGF0YSh0aGlzLGNvbG9yYm94KSxyZWxSZWxhdGVkO2lmKGRhdGEpe3JlbFJlbGF0ZWQ9JCh0aGlzKS5kYXRhKCdyZWwnKXx8ZGF0YS5yZWx8fHRoaXMucmVsfQpyZXR1cm4ocmVsUmVsYXRlZD09PXNldHRpbmdzLnJlbCl9KTtpbmRleD0kcmVsYXRlZC5pbmRleChlbGVtZW50KTtpZihpbmRleD09PS0xKXskcmVsYXRlZD0kcmVsYXRlZC5hZGQoZWxlbWVudCk7aW5kZXg9JHJlbGF0ZWQubGVuZ3RoLTF9fQokb3ZlcmxheS5jc3Moe29wYWNpdHk6cGFyc2VGbG9hdChzZXR0aW5ncy5vcGFjaXR5KSxjdXJzb3I6c2V0dGluZ3Mub3ZlcmxheUNsb3NlPyJwb2ludGVyIjoiYXV0byIsdmlzaWJpbGl0eTondmlzaWJsZSd9KS5zaG93KCk7aWYoY2xhc3NOYW1lKXskYm94LmFkZCgkb3ZlcmxheSkucmVtb3ZlQ2xhc3MoY2xhc3NOYW1lKX0KaWYoc2V0dGluZ3MuY2xhc3NOYW1lKXskYm94LmFkZCgkb3ZlcmxheSkuYWRkQ2xhc3Moc2V0dGluZ3MuY2xhc3NOYW1lKX0KY2xhc3NOYW1lPXNldHRpbmdzLmNsYXNzTmFtZTtpZihzZXR0aW5ncy5jbG9zZUJ1dHRvbil7JGNsb3NlLmh0bWwoc2V0dGluZ3MuY2xvc2UpLmFwcGVuZFRvKCRjb250ZW50KX1lbHNleyRjbG9zZS5hcHBlbmRUbygnPGRpdi8+Jyl9CmlmKCFvcGVuKXtvcGVuPWFjdGl2ZT0hMDskYm94LmNzcyh7dmlzaWJpbGl0eTonaGlkZGVuJyxkaXNwbGF5OidibG9jayd9KTskbG9hZGVkPSR0YWcoZGl2LCdMb2FkZWRDb250ZW50Jywnd2lkdGg6MDsgaGVpZ2h0OjA7IG92ZXJmbG93OmhpZGRlbicpOyRjb250ZW50LmNzcyh7d2lkdGg6JycsaGVpZ2h0OicnfSkuYXBwZW5kKCRsb2FkZWQpO2ludGVyZmFjZUhlaWdodD0kdG9wQm9yZGVyLmhlaWdodCgpKyRib3R0b21Cb3JkZXIuaGVpZ2h0KCkrJGNvbnRlbnQub3V0ZXJIZWlnaHQoITApLSRjb250ZW50LmhlaWdodCgpO2ludGVyZmFjZVdpZHRoPSRsZWZ0Qm9yZGVyLndpZHRoKCkrJHJpZ2h0Qm9yZGVyLndpZHRoKCkrJGNvbnRlbnQub3V0ZXJXaWR0aCghMCktJGNvbnRlbnQud2lkdGgoKTtsb2FkZWRIZWlnaHQ9JGxvYWRlZC5vdXRlckhlaWdodCghMCk7bG9hZGVkV2lkdGg9JGxvYWRlZC5vdXRlcldpZHRoKCEwKTtzZXR0aW5ncy53PXNldFNpemUoc2V0dGluZ3MuaW5pdGlhbFdpZHRoLCd4Jyk7c2V0dGluZ3MuaD1zZXRTaXplKHNldHRpbmdzLmluaXRpYWxIZWlnaHQsJ3knKTskbG9hZGVkLmNzcyh7d2lkdGg6JycsaGVpZ2h0OnNldHRpbmdzLmh9KTtwdWJsaWNNZXRob2QucG9zaXRpb24oKTt0cmlnZ2VyKGV2ZW50X29wZW4sc2V0dGluZ3Mub25PcGVuKTskZ3JvdXBDb250cm9scy5hZGQoJHRpdGxlKS5oaWRlKCk7JGJveC5mb2N1cygpO2lmKHNldHRpbmdzLnRyYXBGb2N1cyl7aWYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcil7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLHRyYXBGb2N1cywhMCk7JGV2ZW50cy5vbmUoZXZlbnRfY2xvc2VkLGZ1bmN0aW9uKCl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLHRyYXBGb2N1cywhMCl9KX19CmlmKHNldHRpbmdzLnJldHVybkZvY3VzKXskZXZlbnRzLm9uZShldmVudF9jbG9zZWQsZnVuY3Rpb24oKXskKGVsZW1lbnQpLmZvY3VzKCl9KX19CmxvYWQoKX19CmZ1bmN0aW9uIGFwcGVuZEhUTUwoKXtpZighJGJveCYmZG9jdW1lbnQuYm9keSl7aW5pdD0hMTskd2luZG93PSQod2luZG93KTskYm94PSR0YWcoZGl2KS5hdHRyKHtpZDpjb2xvcmJveCwnY2xhc3MnOiQuc3VwcG9ydC5vcGFjaXR5PT09ITE/cHJlZml4KydJRSc6Jycscm9sZTonZGlhbG9nJyx0YWJpbmRleDonLTEnfSkuaGlkZSgpOyRvdmVybGF5PSR0YWcoZGl2LCJPdmVybGF5IikuaGlkZSgpOyRsb2FkaW5nT3ZlcmxheT0kKFskdGFnKGRpdiwiTG9hZGluZ092ZXJsYXkiKVswXSwkdGFnKGRpdiwiTG9hZGluZ0dyYXBoaWMiKVswXV0pOyR3cmFwPSR0YWcoZGl2LCJXcmFwcGVyIik7JGNvbnRlbnQ9JHRhZyhkaXYsIkNvbnRlbnQiKS5hcHBlbmQoJHRpdGxlPSR0YWcoZGl2LCJUaXRsZSIpLCRjdXJyZW50PSR0YWcoZGl2LCJDdXJyZW50IiksJHByZXY9JCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hdHRyKHtpZDpwcmVmaXgrJ1ByZXZpb3VzJ30pLCRuZXh0PSQoJzxidXR0b24gdHlwZT0iYnV0dG9uIi8+JykuYXR0cih7aWQ6cHJlZml4KydOZXh0J30pLCRzbGlkZXNob3c9JHRhZygnYnV0dG9uJywiU2xpZGVzaG93IiksJGxvYWRpbmdPdmVybGF5KTskY2xvc2U9JCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hdHRyKHtpZDpwcmVmaXgrJ0Nsb3NlJ30pOyR3cmFwLmFwcGVuZCgkdGFnKGRpdikuYXBwZW5kKCR0YWcoZGl2LCJUb3BMZWZ0IiksJHRvcEJvcmRlcj0kdGFnKGRpdiwiVG9wQ2VudGVyIiksJHRhZyhkaXYsIlRvcFJpZ2h0IikpLCR0YWcoZGl2LCExLCdjbGVhcjpsZWZ0JykuYXBwZW5kKCRsZWZ0Qm9yZGVyPSR0YWcoZGl2LCJNaWRkbGVMZWZ0IiksJGNvbnRlbnQsJHJpZ2h0Qm9yZGVyPSR0YWcoZGl2LCJNaWRkbGVSaWdodCIpKSwkdGFnKGRpdiwhMSwnY2xlYXI6bGVmdCcpLmFwcGVuZCgkdGFnKGRpdiwiQm90dG9tTGVmdCIpLCRib3R0b21Cb3JkZXI9JHRhZyhkaXYsIkJvdHRvbUNlbnRlciIpLCR0YWcoZGl2LCJCb3R0b21SaWdodCIpKSkuZmluZCgnZGl2IGRpdicpLmNzcyh7J2Zsb2F0JzonbGVmdCd9KTskbG9hZGluZ0JheT0kdGFnKGRpdiwhMSwncG9zaXRpb246YWJzb2x1dGU7IHdpZHRoOjk5OTlweDsgdmlzaWJpbGl0eTpoaWRkZW47IGRpc3BsYXk6bm9uZTsgbWF4LXdpZHRoOm5vbmU7Jyk7JGdyb3VwQ29udHJvbHM9JG5leHQuYWRkKCRwcmV2KS5hZGQoJGN1cnJlbnQpLmFkZCgkc2xpZGVzaG93KTskKGRvY3VtZW50LmJvZHkpLmFwcGVuZCgkb3ZlcmxheSwkYm94LmFwcGVuZCgkd3JhcCwkbG9hZGluZ0JheSkpfX0KZnVuY3Rpb24gYWRkQmluZGluZ3MoKXtmdW5jdGlvbiBjbGlja0hhbmRsZXIoZSl7aWYoIShlLndoaWNoPjF8fGUuc2hpZnRLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXl8fGUuY3RybEtleSkpe2UucHJldmVudERlZmF1bHQoKTtsYXVuY2godGhpcyl9fQppZigkYm94KXtpZighaW5pdCl7aW5pdD0hMDskbmV4dC5jbGljayhmdW5jdGlvbigpe3B1YmxpY01ldGhvZC5uZXh0KCl9KTskcHJldi5jbGljayhmdW5jdGlvbigpe3B1YmxpY01ldGhvZC5wcmV2KCl9KTskY2xvc2UuY2xpY2soZnVuY3Rpb24oKXtwdWJsaWNNZXRob2QuY2xvc2UoKX0pOyRvdmVybGF5LmNsaWNrKGZ1bmN0aW9uKCl7aWYoc2V0dGluZ3Mub3ZlcmxheUNsb3NlKXtwdWJsaWNNZXRob2QuY2xvc2UoKX19KTskKGRvY3VtZW50KS5iaW5kKCdrZXlkb3duLicrcHJlZml4LGZ1bmN0aW9uKGUpe3ZhciBrZXk9ZS5rZXlDb2RlO2lmKG9wZW4mJnNldHRpbmdzLmVzY0tleSYma2V5PT09Mjcpe2UucHJldmVudERlZmF1bHQoKTtwdWJsaWNNZXRob2QuY2xvc2UoKX0KaWYob3BlbiYmc2V0dGluZ3MuYXJyb3dLZXkmJiRyZWxhdGVkWzFdJiYhZS5hbHRLZXkpe2lmKGtleT09PTM3KXtlLnByZXZlbnREZWZhdWx0KCk7JHByZXYuY2xpY2soKX1lbHNlIGlmKGtleT09PTM5KXtlLnByZXZlbnREZWZhdWx0KCk7JG5leHQuY2xpY2soKX19fSk7aWYoJC5pc0Z1bmN0aW9uKCQuZm4ub24pKXskKGRvY3VtZW50KS5vbignY2xpY2suJytwcmVmaXgsJy4nK2JveEVsZW1lbnQsY2xpY2tIYW5kbGVyKX1lbHNleyQoJy4nK2JveEVsZW1lbnQpLmxpdmUoJ2NsaWNrLicrcHJlZml4LGNsaWNrSGFuZGxlcil9fQpyZXR1cm4hMH0KcmV0dXJuITF9CmlmKCQuY29sb3Jib3gpe3JldHVybn0KJChhcHBlbmRIVE1MKTtwdWJsaWNNZXRob2Q9JC5mbltjb2xvcmJveF09JFtjb2xvcmJveF09ZnVuY3Rpb24ob3B0aW9ucyxjYWxsYmFjayl7dmFyICR0aGlzPXRoaXM7b3B0aW9ucz1vcHRpb25zfHx7fTthcHBlbmRIVE1MKCk7aWYoYWRkQmluZGluZ3MoKSl7aWYoJC5pc0Z1bmN0aW9uKCR0aGlzKSl7JHRoaXM9JCgnPGEvPicpO29wdGlvbnMub3Blbj0hMH1lbHNlIGlmKCEkdGhpc1swXSl7cmV0dXJuICR0aGlzfQppZihjYWxsYmFjayl7b3B0aW9ucy5vbkNvbXBsZXRlPWNhbGxiYWNrfQokdGhpcy5lYWNoKGZ1bmN0aW9uKCl7JC5kYXRhKHRoaXMsY29sb3Jib3gsJC5leHRlbmQoe30sJC5kYXRhKHRoaXMsY29sb3Jib3gpfHxkZWZhdWx0cyxvcHRpb25zKSl9KS5hZGRDbGFzcyhib3hFbGVtZW50KTtpZigoJC5pc0Z1bmN0aW9uKG9wdGlvbnMub3BlbikmJm9wdGlvbnMub3Blbi5jYWxsKCR0aGlzKSl8fG9wdGlvbnMub3Blbil7bGF1bmNoKCR0aGlzWzBdKX19CnJldHVybiAkdGhpc307cHVibGljTWV0aG9kLnBvc2l0aW9uPWZ1bmN0aW9uKHNwZWVkLGxvYWRlZENhbGxiYWNrKXt2YXIKY3NzLHRvcD0wLGxlZnQ9MCxvZmZzZXQ9JGJveC5vZmZzZXQoKSxzY3JvbGxUb3Asc2Nyb2xsTGVmdDskd2luZG93LnVuYmluZCgncmVzaXplLicrcHJlZml4KTskYm94LmNzcyh7dG9wOi05ZTQsbGVmdDotOWU0fSk7c2Nyb2xsVG9wPSR3aW5kb3cuc2Nyb2xsVG9wKCk7c2Nyb2xsTGVmdD0kd2luZG93LnNjcm9sbExlZnQoKTtpZihzZXR0aW5ncy5maXhlZCl7b2Zmc2V0LnRvcC09c2Nyb2xsVG9wO29mZnNldC5sZWZ0LT1zY3JvbGxMZWZ0OyRib3guY3NzKHtwb3NpdGlvbjonZml4ZWQnfSl9ZWxzZXt0b3A9c2Nyb2xsVG9wO2xlZnQ9c2Nyb2xsTGVmdDskYm94LmNzcyh7cG9zaXRpb246J2Fic29sdXRlJ30pfQppZihzZXR0aW5ncy5yaWdodCE9PSExKXtsZWZ0Kz1NYXRoLm1heCgkd2luZG93LndpZHRoKCktc2V0dGluZ3Mudy1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aC1zZXRTaXplKHNldHRpbmdzLnJpZ2h0LCd4JyksMCl9ZWxzZSBpZihzZXR0aW5ncy5sZWZ0IT09ITEpe2xlZnQrPXNldFNpemUoc2V0dGluZ3MubGVmdCwneCcpfWVsc2V7bGVmdCs9TWF0aC5yb3VuZChNYXRoLm1heCgkd2luZG93LndpZHRoKCktc2V0dGluZ3Mudy1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aCwwKS8yKX0KaWYoc2V0dGluZ3MuYm90dG9tIT09ITEpe3RvcCs9TWF0aC5tYXgod2luaGVpZ2h0KCktc2V0dGluZ3MuaC1sb2FkZWRIZWlnaHQtaW50ZXJmYWNlSGVpZ2h0LXNldFNpemUoc2V0dGluZ3MuYm90dG9tLCd5JyksMCl9ZWxzZSBpZihzZXR0aW5ncy50b3AhPT0hMSl7dG9wKz1zZXRTaXplKHNldHRpbmdzLnRvcCwneScpfWVsc2V7dG9wKz1NYXRoLnJvdW5kKE1hdGgubWF4KHdpbmhlaWdodCgpLXNldHRpbmdzLmgtbG9hZGVkSGVpZ2h0LWludGVyZmFjZUhlaWdodCwwKS8yKX0KJGJveC5jc3Moe3RvcDpvZmZzZXQudG9wLGxlZnQ6b2Zmc2V0LmxlZnQsdmlzaWJpbGl0eTondmlzaWJsZSd9KTskd3JhcFswXS5zdHlsZS53aWR0aD0kd3JhcFswXS5zdHlsZS5oZWlnaHQ9Ijk5OTlweCI7ZnVuY3Rpb24gbW9kYWxEaW1lbnNpb25zKCl7JHRvcEJvcmRlclswXS5zdHlsZS53aWR0aD0kYm90dG9tQm9yZGVyWzBdLnN0eWxlLndpZHRoPSRjb250ZW50WzBdLnN0eWxlLndpZHRoPShwYXJzZUludCgkYm94WzBdLnN0eWxlLndpZHRoLDEwKS1pbnRlcmZhY2VXaWR0aCkrJ3B4JzskY29udGVudFswXS5zdHlsZS5oZWlnaHQ9JGxlZnRCb3JkZXJbMF0uc3R5bGUuaGVpZ2h0PSRyaWdodEJvcmRlclswXS5zdHlsZS5oZWlnaHQ9KHBhcnNlSW50KCRib3hbMF0uc3R5bGUuaGVpZ2h0LDEwKS1pbnRlcmZhY2VIZWlnaHQpKydweCd9CmNzcz17d2lkdGg6c2V0dGluZ3Mudytsb2FkZWRXaWR0aCtpbnRlcmZhY2VXaWR0aCxoZWlnaHQ6c2V0dGluZ3MuaCtsb2FkZWRIZWlnaHQraW50ZXJmYWNlSGVpZ2h0LHRvcDp0b3AsbGVmdDpsZWZ0fTtpZihzcGVlZCl7dmFyIHRlbXBTcGVlZD0wOyQuZWFjaChjc3MsZnVuY3Rpb24oaSl7aWYoY3NzW2ldIT09cHJldmlvdXNDU1NbaV0pe3RlbXBTcGVlZD1zcGVlZH19KTtzcGVlZD10ZW1wU3BlZWR9CnByZXZpb3VzQ1NTPWNzcztpZighc3BlZWQpeyRib3guY3NzKGNzcyl9CiRib3guZGVxdWV1ZSgpLmFuaW1hdGUoY3NzLHtkdXJhdGlvbjpzcGVlZHx8MCxjb21wbGV0ZTpmdW5jdGlvbigpe21vZGFsRGltZW5zaW9ucygpO2FjdGl2ZT0hMTskd3JhcFswXS5zdHlsZS53aWR0aD0oc2V0dGluZ3Mudytsb2FkZWRXaWR0aCtpbnRlcmZhY2VXaWR0aCkrInB4Ijskd3JhcFswXS5zdHlsZS5oZWlnaHQ9KHNldHRpbmdzLmgrbG9hZGVkSGVpZ2h0K2ludGVyZmFjZUhlaWdodCkrInB4IjtpZihzZXR0aW5ncy5yZXBvc2l0aW9uKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JHdpbmRvdy5iaW5kKCdyZXNpemUuJytwcmVmaXgscHVibGljTWV0aG9kLnBvc2l0aW9uKX0sMSl9CmlmKGxvYWRlZENhbGxiYWNrKXtsb2FkZWRDYWxsYmFjaygpfX0sc3RlcDptb2RhbERpbWVuc2lvbnN9KX07cHVibGljTWV0aG9kLnJlc2l6ZT1mdW5jdGlvbihvcHRpb25zKXt2YXIgc2Nyb2xsdG9wO2lmKG9wZW4pe29wdGlvbnM9b3B0aW9uc3x8e307aWYob3B0aW9ucy53aWR0aCl7c2V0dGluZ3Mudz1zZXRTaXplKG9wdGlvbnMud2lkdGgsJ3gnKS1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aH0KaWYob3B0aW9ucy5pbm5lcldpZHRoKXtzZXR0aW5ncy53PXNldFNpemUob3B0aW9ucy5pbm5lcldpZHRoLCd4Jyl9CiRsb2FkZWQuY3NzKHt3aWR0aDpzZXR0aW5ncy53fSk7aWYob3B0aW9ucy5oZWlnaHQpe3NldHRpbmdzLmg9c2V0U2l6ZShvcHRpb25zLmhlaWdodCwneScpLWxvYWRlZEhlaWdodC1pbnRlcmZhY2VIZWlnaHR9CmlmKG9wdGlvbnMuaW5uZXJIZWlnaHQpe3NldHRpbmdzLmg9c2V0U2l6ZShvcHRpb25zLmlubmVySGVpZ2h0LCd5Jyl9CmlmKCFvcHRpb25zLmlubmVySGVpZ2h0JiYhb3B0aW9ucy5oZWlnaHQpe3Njcm9sbHRvcD0kbG9hZGVkLnNjcm9sbFRvcCgpOyRsb2FkZWQuY3NzKHtoZWlnaHQ6ImF1dG8ifSk7c2V0dGluZ3MuaD0kbG9hZGVkLmhlaWdodCgpfQokbG9hZGVkLmNzcyh7aGVpZ2h0OnNldHRpbmdzLmh9KTtpZihzY3JvbGx0b3ApeyRsb2FkZWQuc2Nyb2xsVG9wKHNjcm9sbHRvcCl9CnB1YmxpY01ldGhvZC5wb3NpdGlvbihzZXR0aW5ncy50cmFuc2l0aW9uPT09Im5vbmUiPzA6c2V0dGluZ3Muc3BlZWQpfX07cHVibGljTWV0aG9kLnByZXA9ZnVuY3Rpb24ob2JqZWN0KXtpZighb3Blbil7cmV0dXJufQp2YXIgY2FsbGJhY2ssc3BlZWQ9c2V0dGluZ3MudHJhbnNpdGlvbj09PSJub25lIj8wOnNldHRpbmdzLnNwZWVkOyRsb2FkZWQuZW1wdHkoKS5yZW1vdmUoKTskbG9hZGVkPSR0YWcoZGl2LCdMb2FkZWRDb250ZW50JykuYXBwZW5kKG9iamVjdCk7ZnVuY3Rpb24gZ2V0V2lkdGgoKXtzZXR0aW5ncy53PXNldHRpbmdzLnd8fCRsb2FkZWQud2lkdGgoKTtzZXR0aW5ncy53PXNldHRpbmdzLm13JiZzZXR0aW5ncy5tdzxzZXR0aW5ncy53P3NldHRpbmdzLm13OnNldHRpbmdzLnc7cmV0dXJuIHNldHRpbmdzLnd9CmZ1bmN0aW9uIGdldEhlaWdodCgpe3NldHRpbmdzLmg9c2V0dGluZ3MuaHx8JGxvYWRlZC5oZWlnaHQoKTtzZXR0aW5ncy5oPXNldHRpbmdzLm1oJiZzZXR0aW5ncy5taDxzZXR0aW5ncy5oP3NldHRpbmdzLm1oOnNldHRpbmdzLmg7cmV0dXJuIHNldHRpbmdzLmh9CiRsb2FkZWQuaGlkZSgpLmFwcGVuZFRvKCRsb2FkaW5nQmF5LnNob3coKSkuY3NzKHt3aWR0aDpnZXRXaWR0aCgpLG92ZXJmbG93OnNldHRpbmdzLnNjcm9sbGluZz8nYXV0byc6J2hpZGRlbid9KS5jc3Moe2hlaWdodDpnZXRIZWlnaHQoKX0pLnByZXBlbmRUbygkY29udGVudCk7JGxvYWRpbmdCYXkuaGlkZSgpOyQocGhvdG8pLmNzcyh7J2Zsb2F0Jzonbm9uZSd9KTtjYWxsYmFjaz1mdW5jdGlvbigpe3ZhciB0b3RhbD0kcmVsYXRlZC5sZW5ndGgsaWZyYW1lLGZyYW1lQm9yZGVyPSdmcmFtZUJvcmRlcicsYWxsb3dUcmFuc3BhcmVuY3k9J2FsbG93VHJhbnNwYXJlbmN5Jyxjb21wbGV0ZTtpZighb3Blbil7cmV0dXJufQpmdW5jdGlvbiByZW1vdmVGaWx0ZXIoKXtpZigkLnN1cHBvcnQub3BhY2l0eT09PSExKXskYm94WzBdLnN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgnZmlsdGVyJyl9fQpjb21wbGV0ZT1mdW5jdGlvbigpe2NsZWFyVGltZW91dChsb2FkaW5nVGltZXIpOyRsb2FkaW5nT3ZlcmxheS5oaWRlKCk7dHJpZ2dlcihldmVudF9jb21wbGV0ZSxzZXR0aW5ncy5vbkNvbXBsZXRlKX07JHRpdGxlLmh0bWwoc2V0dGluZ3MudGl0bGUpLmFkZCgkbG9hZGVkKS5zaG93KCk7aWYodG90YWw+MSl7aWYodHlwZW9mIHNldHRpbmdzLmN1cnJlbnQ9PT0ic3RyaW5nIil7JGN1cnJlbnQuaHRtbChzZXR0aW5ncy5jdXJyZW50LnJlcGxhY2UoJ3tjdXJyZW50fScsaW5kZXgrMSkucmVwbGFjZSgne3RvdGFsfScsdG90YWwpKS5zaG93KCl9CiRuZXh0WyhzZXR0aW5ncy5sb29wfHxpbmRleDx0b3RhbC0xKT8ic2hvdyI6ImhpZGUiXSgpLmh0bWwoc2V0dGluZ3MubmV4dCk7JHByZXZbKHNldHRpbmdzLmxvb3B8fGluZGV4KT8ic2hvdyI6ImhpZGUiXSgpLmh0bWwoc2V0dGluZ3MucHJldmlvdXMpO3NsaWRlc2hvdygpO2lmKHNldHRpbmdzLnByZWxvYWRpbmcpeyQuZWFjaChbZ2V0SW5kZXgoLTEpLGdldEluZGV4KDEpXSxmdW5jdGlvbigpe3ZhciBzcmMsaW1nLGk9JHJlbGF0ZWRbdGhpc10sZGF0YT0kLmRhdGEoaSxjb2xvcmJveCk7aWYoZGF0YSYmZGF0YS5ocmVmKXtzcmM9ZGF0YS5ocmVmO2lmKCQuaXNGdW5jdGlvbihzcmMpKXtzcmM9c3JjLmNhbGwoaSl9fWVsc2V7c3JjPSQoaSkuYXR0cignaHJlZicpfQppZihzcmMmJmlzSW1hZ2UoZGF0YSxzcmMpKXtzcmM9cmV0aW5hVXJsKGRhdGEsc3JjKTtpbWc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7aW1nLnNyYz1zcmN9fSl9fWVsc2V7JGdyb3VwQ29udHJvbHMuaGlkZSgpfQppZihzZXR0aW5ncy5pZnJhbWUpe2lmcmFtZT0kdGFnKCdpZnJhbWUnKVswXTtpZihmcmFtZUJvcmRlciBpbiBpZnJhbWUpe2lmcmFtZVtmcmFtZUJvcmRlcl09MH0KaWYoYWxsb3dUcmFuc3BhcmVuY3kgaW4gaWZyYW1lKXtpZnJhbWVbYWxsb3dUcmFuc3BhcmVuY3ldPSJ0cnVlIn0KaWYoIXNldHRpbmdzLnNjcm9sbGluZyl7aWZyYW1lLnNjcm9sbGluZz0ibm8ifQokKGlmcmFtZSkuYXR0cih7c3JjOnNldHRpbmdzLmhyZWYsbmFtZToobmV3IERhdGUoKSkuZ2V0VGltZSgpLCdjbGFzcyc6cHJlZml4KydJZnJhbWUnLGFsbG93RnVsbFNjcmVlbjohMCx3ZWJraXRBbGxvd0Z1bGxTY3JlZW46ITAsbW96YWxsb3dmdWxsc2NyZWVuOiEwfSkub25lKCdsb2FkJyxjb21wbGV0ZSkuYXBwZW5kVG8oJGxvYWRlZCk7JGV2ZW50cy5vbmUoZXZlbnRfcHVyZ2UsZnVuY3Rpb24oKXtpZnJhbWUuc3JjPSIvL2Fib3V0OmJsYW5rIn0pO2lmKHNldHRpbmdzLmZhc3RJZnJhbWUpeyQoaWZyYW1lKS50cmlnZ2VyKCdsb2FkJyl9fWVsc2V7Y29tcGxldGUoKX0KaWYoc2V0dGluZ3MudHJhbnNpdGlvbj09PSdmYWRlJyl7JGJveC5mYWRlVG8oc3BlZWQsMSxyZW1vdmVGaWx0ZXIpfWVsc2V7cmVtb3ZlRmlsdGVyKCl9fTtpZihzZXR0aW5ncy50cmFuc2l0aW9uPT09J2ZhZGUnKXskYm94LmZhZGVUbyhzcGVlZCwwLGZ1bmN0aW9uKCl7cHVibGljTWV0aG9kLnBvc2l0aW9uKDAsY2FsbGJhY2spfSl9ZWxzZXtwdWJsaWNNZXRob2QucG9zaXRpb24oc3BlZWQsY2FsbGJhY2spfX07ZnVuY3Rpb24gbG9hZCgpe3ZhciBocmVmLHNldFJlc2l6ZSxwcmVwPXB1YmxpY01ldGhvZC5wcmVwLCRpbmxpbmUscmVxdWVzdD0rK3JlcXVlc3RzO2FjdGl2ZT0hMDtwaG90bz0hMTtlbGVtZW50PSRyZWxhdGVkW2luZGV4XTttYWtlU2V0dGluZ3MoKTt0cmlnZ2VyKGV2ZW50X3B1cmdlKTt0cmlnZ2VyKGV2ZW50X2xvYWQsc2V0dGluZ3Mub25Mb2FkKTtzZXR0aW5ncy5oPXNldHRpbmdzLmhlaWdodD9zZXRTaXplKHNldHRpbmdzLmhlaWdodCwneScpLWxvYWRlZEhlaWdodC1pbnRlcmZhY2VIZWlnaHQ6c2V0dGluZ3MuaW5uZXJIZWlnaHQmJnNldFNpemUoc2V0dGluZ3MuaW5uZXJIZWlnaHQsJ3knKTtzZXR0aW5ncy53PXNldHRpbmdzLndpZHRoP3NldFNpemUoc2V0dGluZ3Mud2lkdGgsJ3gnKS1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aDpzZXR0aW5ncy5pbm5lcldpZHRoJiZzZXRTaXplKHNldHRpbmdzLmlubmVyV2lkdGgsJ3gnKTtzZXR0aW5ncy5tdz1zZXR0aW5ncy53O3NldHRpbmdzLm1oPXNldHRpbmdzLmg7aWYoc2V0dGluZ3MubWF4V2lkdGgpe3NldHRpbmdzLm13PXNldFNpemUoc2V0dGluZ3MubWF4V2lkdGgsJ3gnKS1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aDtzZXR0aW5ncy5tdz1zZXR0aW5ncy53JiZzZXR0aW5ncy53PHNldHRpbmdzLm13P3NldHRpbmdzLnc6c2V0dGluZ3MubXd9CmlmKHNldHRpbmdzLm1heEhlaWdodCl7c2V0dGluZ3MubWg9c2V0U2l6ZShzZXR0aW5ncy5tYXhIZWlnaHQsJ3knKS1sb2FkZWRIZWlnaHQtaW50ZXJmYWNlSGVpZ2h0O3NldHRpbmdzLm1oPXNldHRpbmdzLmgmJnNldHRpbmdzLmg8c2V0dGluZ3MubWg/c2V0dGluZ3MuaDpzZXR0aW5ncy5taH0KaHJlZj1zZXR0aW5ncy5ocmVmO2xvYWRpbmdUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JGxvYWRpbmdPdmVybGF5LnNob3coKX0sMTAwKTtpZihzZXR0aW5ncy5pbmxpbmUpeyRpbmxpbmU9JHRhZyhkaXYpLmhpZGUoKS5pbnNlcnRCZWZvcmUoJChocmVmKVswXSk7JGV2ZW50cy5vbmUoZXZlbnRfcHVyZ2UsZnVuY3Rpb24oKXskaW5saW5lLnJlcGxhY2VXaXRoKCRsb2FkZWQuY2hpbGRyZW4oKSl9KTtwcmVwKCQoaHJlZikpfWVsc2UgaWYoc2V0dGluZ3MuaWZyYW1lKXtwcmVwKCIgIil9ZWxzZSBpZihzZXR0aW5ncy5odG1sKXtwcmVwKHNldHRpbmdzLmh0bWwpfWVsc2UgaWYoaXNJbWFnZShzZXR0aW5ncyxocmVmKSl7aHJlZj1yZXRpbmFVcmwoc2V0dGluZ3MsaHJlZik7cGhvdG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7JChwaG90bykuYWRkQ2xhc3MocHJlZml4KydQaG90bycpLmJpbmQoJ2Vycm9yJyxmdW5jdGlvbigpe3NldHRpbmdzLnRpdGxlPSExO3ByZXAoJHRhZyhkaXYsJ0Vycm9yJykuaHRtbChzZXR0aW5ncy5pbWdFcnJvcikpfSkub25lKCdsb2FkJyxmdW5jdGlvbigpe3ZhciBwZXJjZW50O2lmKHJlcXVlc3QhPT1yZXF1ZXN0cyl7cmV0dXJufQokLmVhY2goWydhbHQnLCdsb25nZGVzYycsJ2FyaWEtZGVzY3JpYmVkYnknXSxmdW5jdGlvbihpLHZhbCl7dmFyIGF0dHI9JChlbGVtZW50KS5hdHRyKHZhbCl8fCQoZWxlbWVudCkuYXR0cignZGF0YS0nK3ZhbCk7aWYoYXR0cil7cGhvdG8uc2V0QXR0cmlidXRlKHZhbCxhdHRyKX19KTtpZihzZXR0aW5ncy5yZXRpbmFJbWFnZSYmd2luZG93LmRldmljZVBpeGVsUmF0aW8+MSl7cGhvdG8uaGVpZ2h0PXBob3RvLmhlaWdodC93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztwaG90by53aWR0aD1waG90by53aWR0aC93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb30KaWYoc2V0dGluZ3Muc2NhbGVQaG90b3Mpe3NldFJlc2l6ZT1mdW5jdGlvbigpe3Bob3RvLmhlaWdodC09cGhvdG8uaGVpZ2h0KnBlcmNlbnQ7cGhvdG8ud2lkdGgtPXBob3RvLndpZHRoKnBlcmNlbnR9O2lmKHNldHRpbmdzLm13JiZwaG90by53aWR0aD5zZXR0aW5ncy5tdyl7cGVyY2VudD0ocGhvdG8ud2lkdGgtc2V0dGluZ3MubXcpL3Bob3RvLndpZHRoO3NldFJlc2l6ZSgpfQppZihzZXR0aW5ncy5taCYmcGhvdG8uaGVpZ2h0PnNldHRpbmdzLm1oKXtwZXJjZW50PShwaG90by5oZWlnaHQtc2V0dGluZ3MubWgpL3Bob3RvLmhlaWdodDtzZXRSZXNpemUoKX19CmlmKHNldHRpbmdzLmgpe3Bob3RvLnN0eWxlLm1hcmdpblRvcD1NYXRoLm1heChzZXR0aW5ncy5taC1waG90by5oZWlnaHQsMCkvMisncHgnfQppZigkcmVsYXRlZFsxXSYmKHNldHRpbmdzLmxvb3B8fCRyZWxhdGVkW2luZGV4KzFdKSl7cGhvdG8uc3R5bGUuY3Vyc29yPSdwb2ludGVyJztwaG90by5vbmNsaWNrPWZ1bmN0aW9uKCl7cHVibGljTWV0aG9kLm5leHQoKX19CnBob3RvLnN0eWxlLndpZHRoPXBob3RvLndpZHRoKydweCc7cGhvdG8uc3R5bGUuaGVpZ2h0PXBob3RvLmhlaWdodCsncHgnO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtwcmVwKHBob3RvKX0sMSl9KTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cGhvdG8uc3JjPWhyZWZ9LDEpfWVsc2UgaWYoaHJlZil7JGxvYWRpbmdCYXkubG9hZChocmVmLHNldHRpbmdzLmRhdGEsZnVuY3Rpb24oZGF0YSxzdGF0dXMpe2lmKHJlcXVlc3Q9PT1yZXF1ZXN0cyl7cHJlcChzdGF0dXM9PT0nZXJyb3InPyR0YWcoZGl2LCdFcnJvcicpLmh0bWwoc2V0dGluZ3MueGhyRXJyb3IpOiQodGhpcykuY29udGVudHMoKSl9fSl9fQpwdWJsaWNNZXRob2QubmV4dD1mdW5jdGlvbigpe2lmKCFhY3RpdmUmJiRyZWxhdGVkWzFdJiYoc2V0dGluZ3MubG9vcHx8JHJlbGF0ZWRbaW5kZXgrMV0pKXtpbmRleD1nZXRJbmRleCgxKTtsYXVuY2goJHJlbGF0ZWRbaW5kZXhdKX19O3B1YmxpY01ldGhvZC5wcmV2PWZ1bmN0aW9uKCl7aWYoIWFjdGl2ZSYmJHJlbGF0ZWRbMV0mJihzZXR0aW5ncy5sb29wfHxpbmRleCkpe2luZGV4PWdldEluZGV4KC0xKTtsYXVuY2goJHJlbGF0ZWRbaW5kZXhdKX19O3B1YmxpY01ldGhvZC5jbG9zZT1mdW5jdGlvbigpe2lmKG9wZW4mJiFjbG9zaW5nKXtjbG9zaW5nPSEwO29wZW49ITE7dHJpZ2dlcihldmVudF9jbGVhbnVwLHNldHRpbmdzLm9uQ2xlYW51cCk7JHdpbmRvdy51bmJpbmQoJy4nK3ByZWZpeCk7JG92ZXJsYXkuZmFkZVRvKHNldHRpbmdzLmZhZGVPdXR8fDAsMCk7JGJveC5zdG9wKCkuZmFkZVRvKHNldHRpbmdzLmZhZGVPdXR8fDAsMCxmdW5jdGlvbigpeyRib3guYWRkKCRvdmVybGF5KS5jc3MoeydvcGFjaXR5JzoxLGN1cnNvcjonYXV0byd9KS5oaWRlKCk7dHJpZ2dlcihldmVudF9wdXJnZSk7JGxvYWRlZC5lbXB0eSgpLnJlbW92ZSgpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjbG9zaW5nPSExO3RyaWdnZXIoZXZlbnRfY2xvc2VkLHNldHRpbmdzLm9uQ2xvc2VkKX0sMSl9KX19O3B1YmxpY01ldGhvZC5yZW1vdmU9ZnVuY3Rpb24oKXtpZighJGJveCl7cmV0dXJufQokYm94LnN0b3AoKTskLmNvbG9yYm94LmNsb3NlKCk7JGJveC5zdG9wKCkucmVtb3ZlKCk7JG92ZXJsYXkucmVtb3ZlKCk7Y2xvc2luZz0hMTskYm94PW51bGw7JCgnLicrYm94RWxlbWVudCkucmVtb3ZlRGF0YShjb2xvcmJveCkucmVtb3ZlQ2xhc3MoYm94RWxlbWVudCk7JChkb2N1bWVudCkudW5iaW5kKCdjbGljay4nK3ByZWZpeCl9O3B1YmxpY01ldGhvZC5lbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuICQoZWxlbWVudCl9O3B1YmxpY01ldGhvZC5zZXR0aW5ncz1kZWZhdWx0c30oalF1ZXJ5LGRvY3VtZW50LHdpbmRvdykpOyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBzZXR1cCgkKXskLmZuLl9mYWRlSW49JC5mbi5mYWRlSW47dmFyIG5vT3A9JC5ub29wfHxmdW5jdGlvbigpe307dmFyIG1zaWU9L01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7dmFyIGllNj0vTVNJRSA2LjAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiEvTVNJRSA4LjAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7dmFyIG1vZGU9ZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHwwO3ZhciBzZXRFeHByPSQuaXNGdW5jdGlvbihkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZS5zZXRFeHByZXNzaW9uKTskLmJsb2NrVUk9ZnVuY3Rpb24ob3B0cyl7aW5zdGFsbCh3aW5kb3csb3B0cyl9OyQudW5ibG9ja1VJPWZ1bmN0aW9uKG9wdHMpe3JlbW92ZSh3aW5kb3csb3B0cyl9OyQuZ3Jvd2xVST1mdW5jdGlvbih0aXRsZSxtZXNzYWdlLHRpbWVvdXQsb25DbG9zZSl7dmFyICRtPSQoJzxkaXYgY2xhc3M9Imdyb3dsVUkiPjwvZGl2PicpO2lmKHRpdGxlKSRtLmFwcGVuZCgnPGgxPicrdGl0bGUrJzwvaDE+Jyk7aWYobWVzc2FnZSkkbS5hcHBlbmQoJzxoMj4nK21lc3NhZ2UrJzwvaDI+Jyk7aWYodGltZW91dD09PXVuZGVmaW5lZCl0aW1lb3V0PTMwMDA7dmFyIGNhbGxCbG9jaz1mdW5jdGlvbihvcHRzKXtvcHRzPW9wdHN8fHt9OyQuYmxvY2tVSSh7bWVzc2FnZTokbSxmYWRlSW46dHlwZW9mIG9wdHMuZmFkZUluIT09J3VuZGVmaW5lZCc/b3B0cy5mYWRlSW46NzAwLGZhZGVPdXQ6dHlwZW9mIG9wdHMuZmFkZU91dCE9PSd1bmRlZmluZWQnP29wdHMuZmFkZU91dDoxMDAwLHRpbWVvdXQ6dHlwZW9mIG9wdHMudGltZW91dCE9PSd1bmRlZmluZWQnP29wdHMudGltZW91dDp0aW1lb3V0LGNlbnRlclk6ITEsc2hvd092ZXJsYXk6ITEsb25VbmJsb2NrOm9uQ2xvc2UsY3NzOiQuYmxvY2tVSS5kZWZhdWx0cy5ncm93bENTU30pfTtjYWxsQmxvY2soKTt2YXIgbm9ubW91c2VkT3BhY2l0eT0kbS5jc3MoJ29wYWNpdHknKTskbS5tb3VzZW92ZXIoZnVuY3Rpb24oKXtjYWxsQmxvY2soe2ZhZGVJbjowLHRpbWVvdXQ6MzAwMDB9KTt2YXIgZGlzcGxheUJsb2NrPSQoJy5ibG9ja01zZycpO2Rpc3BsYXlCbG9jay5zdG9wKCk7ZGlzcGxheUJsb2NrLmZhZGVUbygzMDAsMSl9KS5tb3VzZW91dChmdW5jdGlvbigpeyQoJy5ibG9ja01zZycpLmZhZGVPdXQoMTAwMCl9KX07JC5mbi5ibG9jaz1mdW5jdGlvbihvcHRzKXtpZih0aGlzWzBdPT09d2luZG93KXskLmJsb2NrVUkob3B0cyk7cmV0dXJuIHRoaXN9CnZhciBmdWxsT3B0cz0kLmV4dGVuZCh7fSwkLmJsb2NrVUkuZGVmYXVsdHMsb3B0c3x8e30pO3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciAkZWw9JCh0aGlzKTtpZihmdWxsT3B0cy5pZ25vcmVJZkJsb2NrZWQmJiRlbC5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcpKQpyZXR1cm47JGVsLnVuYmxvY2soe2ZhZGVPdXQ6MH0pfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKCQuY3NzKHRoaXMsJ3Bvc2l0aW9uJyk9PSdzdGF0aWMnKXt0aGlzLnN0eWxlLnBvc2l0aW9uPSdyZWxhdGl2ZSc7JCh0aGlzKS5kYXRhKCdibG9ja1VJLnN0YXRpYycsITApfQp0aGlzLnN0eWxlLnpvb209MTtpbnN0YWxsKHRoaXMsb3B0cyl9KX07JC5mbi51bmJsb2NrPWZ1bmN0aW9uKG9wdHMpe2lmKHRoaXNbMF09PT13aW5kb3cpeyQudW5ibG9ja1VJKG9wdHMpO3JldHVybiB0aGlzfQpyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7cmVtb3ZlKHRoaXMsb3B0cyl9KX07JC5ibG9ja1VJLnZlcnNpb249Mi43MDskLmJsb2NrVUkuZGVmYXVsdHM9e21lc3NhZ2U6JzxoMT5QbGVhc2Ugd2FpdC4uLjwvaDE+Jyx0aXRsZTpudWxsLGRyYWdnYWJsZTohMCx0aGVtZTohMSxjc3M6e3BhZGRpbmc6MCxtYXJnaW46MCx3aWR0aDonMzAlJyx0b3A6JzQwJScsbGVmdDonMzUlJyx0ZXh0QWxpZ246J2NlbnRlcicsY29sb3I6JyMwMDAnLGJvcmRlcjonM3B4IHNvbGlkICNhYWEnLGJhY2tncm91bmRDb2xvcjonI2ZmZicsY3Vyc29yOid3YWl0J30sdGhlbWVkQ1NTOnt3aWR0aDonMzAlJyx0b3A6JzQwJScsbGVmdDonMzUlJ30sb3ZlcmxheUNTUzp7YmFja2dyb3VuZENvbG9yOicjMDAwJyxvcGFjaXR5OjAuNixjdXJzb3I6J3dhaXQnfSxjdXJzb3JSZXNldDonZGVmYXVsdCcsZ3Jvd2xDU1M6e3dpZHRoOiczNTBweCcsdG9wOicxMHB4JyxsZWZ0OicnLHJpZ2h0OicxMHB4Jyxib3JkZXI6J25vbmUnLHBhZGRpbmc6JzVweCcsb3BhY2l0eTowLjYsY3Vyc29yOidkZWZhdWx0Jyxjb2xvcjonI2ZmZicsYmFja2dyb3VuZENvbG9yOicjMDAwJywnLXdlYmtpdC1ib3JkZXItcmFkaXVzJzonMTBweCcsJy1tb3otYm9yZGVyLXJhZGl1cyc6JzEwcHgnLCdib3JkZXItcmFkaXVzJzonMTBweCd9LGlmcmFtZVNyYzovXmh0dHBzL2kudGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZnx8JycpPydqYXZhc2NyaXB0OmZhbHNlJzonYWJvdXQ6YmxhbmsnLGZvcmNlSWZyYW1lOiExLGJhc2VaOjEwMDAsY2VudGVyWDohMCxjZW50ZXJZOiEwLGFsbG93Qm9keVN0cmV0Y2g6ITAsYmluZEV2ZW50czohMCxjb25zdHJhaW5UYWJLZXk6ITAsZmFkZUluOjIwMCxmYWRlT3V0OjQwMCx0aW1lb3V0OjAsc2hvd092ZXJsYXk6ITAsZm9jdXNJbnB1dDohMCxmb2N1c2FibGVFbGVtZW50czonOmlucHV0OmVuYWJsZWQ6dmlzaWJsZScsb25CbG9jazpudWxsLG9uVW5ibG9jazpudWxsLG9uT3ZlcmxheUNsaWNrOm51bGwscXVpcmtzbW9kZU9mZnNldEhhY2s6NCxibG9ja01zZ0NsYXNzOidibG9ja01zZycsaWdub3JlSWZCbG9ja2VkOiExfTt2YXIgcGFnZUJsb2NrPW51bGw7dmFyIHBhZ2VCbG9ja0Vscz1bXTtmdW5jdGlvbiBpbnN0YWxsKGVsLG9wdHMpe3ZhciBjc3MsdGhlbWVkQ1NTO3ZhciBmdWxsPShlbD09d2luZG93KTt2YXIgbXNnPShvcHRzJiZvcHRzLm1lc3NhZ2UhPT11bmRlZmluZWQ/b3B0cy5tZXNzYWdlOnVuZGVmaW5lZCk7b3B0cz0kLmV4dGVuZCh7fSwkLmJsb2NrVUkuZGVmYXVsdHMsb3B0c3x8e30pO2lmKG9wdHMuaWdub3JlSWZCbG9ja2VkJiYkKGVsKS5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcpKQpyZXR1cm47b3B0cy5vdmVybGF5Q1NTPSQuZXh0ZW5kKHt9LCQuYmxvY2tVSS5kZWZhdWx0cy5vdmVybGF5Q1NTLG9wdHMub3ZlcmxheUNTU3x8e30pO2Nzcz0kLmV4dGVuZCh7fSwkLmJsb2NrVUkuZGVmYXVsdHMuY3NzLG9wdHMuY3NzfHx7fSk7aWYob3B0cy5vbk92ZXJsYXlDbGljaykKb3B0cy5vdmVybGF5Q1NTLmN1cnNvcj0ncG9pbnRlcic7dGhlbWVkQ1NTPSQuZXh0ZW5kKHt9LCQuYmxvY2tVSS5kZWZhdWx0cy50aGVtZWRDU1Msb3B0cy50aGVtZWRDU1N8fHt9KTttc2c9bXNnPT09dW5kZWZpbmVkP29wdHMubWVzc2FnZTptc2c7aWYoZnVsbCYmcGFnZUJsb2NrKQpyZW1vdmUod2luZG93LHtmYWRlT3V0OjB9KTtpZihtc2cmJnR5cGVvZiBtc2chPSdzdHJpbmcnJiYobXNnLnBhcmVudE5vZGV8fG1zZy5qcXVlcnkpKXt2YXIgbm9kZT1tc2cuanF1ZXJ5P21zZ1swXTptc2c7dmFyIGRhdGE9e307JChlbCkuZGF0YSgnYmxvY2tVSS5oaXN0b3J5JyxkYXRhKTtkYXRhLmVsPW5vZGU7ZGF0YS5wYXJlbnQ9bm9kZS5wYXJlbnROb2RlO2RhdGEuZGlzcGxheT1ub2RlLnN0eWxlLmRpc3BsYXk7ZGF0YS5wb3NpdGlvbj1ub2RlLnN0eWxlLnBvc2l0aW9uO2lmKGRhdGEucGFyZW50KQpkYXRhLnBhcmVudC5yZW1vdmVDaGlsZChub2RlKX0KJChlbCkuZGF0YSgnYmxvY2tVSS5vblVuYmxvY2snLG9wdHMub25VbmJsb2NrKTt2YXIgej1vcHRzLmJhc2VaO3ZhciBseXIxLGx5cjIsbHlyMyxzO2lmKG1zaWV8fG9wdHMuZm9yY2VJZnJhbWUpCmx5cjE9JCgnPGlmcmFtZSBjbGFzcz0iYmxvY2tVSSIgc3R5bGU9InotaW5kZXg6JysoeisrKSsnO2Rpc3BsYXk6bm9uZTtib3JkZXI6bm9uZTttYXJnaW46MDtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0b3A6MDtsZWZ0OjAiIHNyYz0iJytvcHRzLmlmcmFtZVNyYysnIj48L2lmcmFtZT4nKTtlbHNlIGx5cjE9JCgnPGRpdiBjbGFzcz0iYmxvY2tVSSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9kaXY+Jyk7aWYob3B0cy50aGVtZSkKbHlyMj0kKCc8ZGl2IGNsYXNzPSJibG9ja1VJIGJsb2NrT3ZlcmxheSB1aS13aWRnZXQtb3ZlcmxheSIgc3R5bGU9InotaW5kZXg6JysoeisrKSsnO2Rpc3BsYXk6bm9uZSI+PC9kaXY+Jyk7ZWxzZSBseXIyPSQoJzxkaXYgY2xhc3M9ImJsb2NrVUkgYmxvY2tPdmVybGF5IiBzdHlsZT0iei1pbmRleDonKyh6KyspKyc7ZGlzcGxheTpub25lO2JvcmRlcjpub25lO21hcmdpbjowO3BhZGRpbmc6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RvcDowO2xlZnQ6MCI+PC9kaXY+Jyk7aWYob3B0cy50aGVtZSYmZnVsbCl7cz0nPGRpdiBjbGFzcz0iYmxvY2tVSSAnK29wdHMuYmxvY2tNc2dDbGFzcysnIGJsb2NrUGFnZSB1aS1kaWFsb2cgdWktd2lkZ2V0IHVpLWNvcm5lci1hbGwiIHN0eWxlPSJ6LWluZGV4OicrKHorMTApKyc7ZGlzcGxheTpub25lO3Bvc2l0aW9uOmZpeGVkIj4nO2lmKG9wdHMudGl0bGUpe3MrPSc8ZGl2IGNsYXNzPSJ1aS13aWRnZXQtaGVhZGVyIHVpLWRpYWxvZy10aXRsZWJhciB1aS1jb3JuZXItYWxsIGJsb2NrVGl0bGUiPicrKG9wdHMudGl0bGV8fCcmbmJzcDsnKSsnPC9kaXY+J30Kcys9JzxkaXYgY2xhc3M9InVpLXdpZGdldC1jb250ZW50IHVpLWRpYWxvZy1jb250ZW50Ij48L2Rpdj4nO3MrPSc8L2Rpdj4nfQplbHNlIGlmKG9wdHMudGhlbWUpe3M9JzxkaXYgY2xhc3M9ImJsb2NrVUkgJytvcHRzLmJsb2NrTXNnQ2xhc3MrJyBibG9ja0VsZW1lbnQgdWktZGlhbG9nIHVpLXdpZGdldCB1aS1jb3JuZXItYWxsIiBzdHlsZT0iei1pbmRleDonKyh6KzEwKSsnO2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZSI+JztpZihvcHRzLnRpdGxlKXtzKz0nPGRpdiBjbGFzcz0idWktd2lkZ2V0LWhlYWRlciB1aS1kaWFsb2ctdGl0bGViYXIgdWktY29ybmVyLWFsbCBibG9ja1RpdGxlIj4nKyhvcHRzLnRpdGxlfHwnJm5ic3A7JykrJzwvZGl2Pid9CnMrPSc8ZGl2IGNsYXNzPSJ1aS13aWRnZXQtY29udGVudCB1aS1kaWFsb2ctY29udGVudCI+PC9kaXY+JztzKz0nPC9kaXY+J30KZWxzZSBpZihmdWxsKXtzPSc8ZGl2IGNsYXNzPSJibG9ja1VJICcrb3B0cy5ibG9ja01zZ0NsYXNzKycgYmxvY2tQYWdlIiBzdHlsZT0iei1pbmRleDonKyh6KzEwKSsnO2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpmaXhlZCI+PC9kaXY+J30KZWxzZXtzPSc8ZGl2IGNsYXNzPSJibG9ja1VJICcrb3B0cy5ibG9ja01zZ0NsYXNzKycgYmxvY2tFbGVtZW50IiBzdHlsZT0iei1pbmRleDonKyh6KzEwKSsnO2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZSI+PC9kaXY+J30KbHlyMz0kKHMpO2lmKG1zZyl7aWYob3B0cy50aGVtZSl7bHlyMy5jc3ModGhlbWVkQ1NTKTtseXIzLmFkZENsYXNzKCd1aS13aWRnZXQtY29udGVudCcpfQplbHNlIGx5cjMuY3NzKGNzcyl9CmlmKCFvcHRzLnRoZW1lKQpseXIyLmNzcyhvcHRzLm92ZXJsYXlDU1MpO2x5cjIuY3NzKCdwb3NpdGlvbicsZnVsbD8nZml4ZWQnOidhYnNvbHV0ZScpO2lmKG1zaWV8fG9wdHMuZm9yY2VJZnJhbWUpCmx5cjEuY3NzKCdvcGFjaXR5JywwLjApO3ZhciBsYXllcnM9W2x5cjEsbHlyMixseXIzXSwkcGFyPWZ1bGw/JCgnYm9keScpOiQoZWwpOyQuZWFjaChsYXllcnMsZnVuY3Rpb24oKXt0aGlzLmFwcGVuZFRvKCRwYXIpfSk7aWYob3B0cy50aGVtZSYmb3B0cy5kcmFnZ2FibGUmJiQuZm4uZHJhZ2dhYmxlKXtseXIzLmRyYWdnYWJsZSh7aGFuZGxlOicudWktZGlhbG9nLXRpdGxlYmFyJyxjYW5jZWw6J2xpJ30pfQp2YXIgZXhwcj1zZXRFeHByJiYoISQuc3VwcG9ydC5ib3hNb2RlbHx8JCgnb2JqZWN0LGVtYmVkJyxmdWxsP251bGw6ZWwpLmxlbmd0aD4wKTtpZihpZTZ8fGV4cHIpe2lmKGZ1bGwmJm9wdHMuYWxsb3dCb2R5U3RyZXRjaCYmJC5zdXBwb3J0LmJveE1vZGVsKQokKCdodG1sLGJvZHknKS5jc3MoJ2hlaWdodCcsJzEwMCUnKTtpZigoaWU2fHwhJC5zdXBwb3J0LmJveE1vZGVsKSYmIWZ1bGwpe3ZhciB0PXN6KGVsLCdib3JkZXJUb3BXaWR0aCcpLGw9c3ooZWwsJ2JvcmRlckxlZnRXaWR0aCcpO3ZhciBmaXhUPXQ/JygwIC0gJyt0KycpJzowO3ZhciBmaXhMPWw/JygwIC0gJytsKycpJzowfQokLmVhY2gobGF5ZXJzLGZ1bmN0aW9uKGksbyl7dmFyIHM9b1swXS5zdHlsZTtzLnBvc2l0aW9uPSdhYnNvbHV0ZSc7aWYoaTwyKXtpZihmdWxsKQpzLnNldEV4cHJlc3Npb24oJ2hlaWdodCcsJ01hdGgubWF4KGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0LCBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCkgLSAoalF1ZXJ5LnN1cHBvcnQuYm94TW9kZWw/MDonK29wdHMucXVpcmtzbW9kZU9mZnNldEhhY2srJykgKyAicHgiJyk7ZWxzZSBzLnNldEV4cHJlc3Npb24oJ2hlaWdodCcsJ3RoaXMucGFyZW50Tm9kZS5vZmZzZXRIZWlnaHQgKyAicHgiJyk7aWYoZnVsbCkKcy5zZXRFeHByZXNzaW9uKCd3aWR0aCcsJ2pRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoICsgInB4IicpO2Vsc2Ugcy5zZXRFeHByZXNzaW9uKCd3aWR0aCcsJ3RoaXMucGFyZW50Tm9kZS5vZmZzZXRXaWR0aCArICJweCInKTtpZihmaXhMKXMuc2V0RXhwcmVzc2lvbignbGVmdCcsZml4TCk7aWYoZml4VClzLnNldEV4cHJlc3Npb24oJ3RvcCcsZml4VCl9CmVsc2UgaWYob3B0cy5jZW50ZXJZKXtpZihmdWxsKXMuc2V0RXhwcmVzc2lvbigndG9wJywnKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgfHwgZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQpIC8gMiAtICh0aGlzLm9mZnNldEhlaWdodCAvIDIpICsgKGJsYWggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA6IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSArICJweCInKTtzLm1hcmdpblRvcD0wfQplbHNlIGlmKCFvcHRzLmNlbnRlclkmJmZ1bGwpe3ZhciB0b3A9KG9wdHMuY3NzJiZvcHRzLmNzcy50b3ApP3BhcnNlSW50KG9wdHMuY3NzLnRvcCwxMCk6MDt2YXIgZXhwcmVzc2lvbj0nKChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA6IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSArICcrdG9wKycpICsgInB4Iic7cy5zZXRFeHByZXNzaW9uKCd0b3AnLGV4cHJlc3Npb24pfX0pfQppZihtc2cpe2lmKG9wdHMudGhlbWUpCmx5cjMuZmluZCgnLnVpLXdpZGdldC1jb250ZW50JykuYXBwZW5kKG1zZyk7ZWxzZSBseXIzLmFwcGVuZChtc2cpO2lmKG1zZy5qcXVlcnl8fG1zZy5ub2RlVHlwZSkKJChtc2cpLnNob3coKX0KaWYoKG1zaWV8fG9wdHMuZm9yY2VJZnJhbWUpJiZvcHRzLnNob3dPdmVybGF5KQpseXIxLnNob3coKTtpZihvcHRzLmZhZGVJbil7dmFyIGNiPW9wdHMub25CbG9jaz9vcHRzLm9uQmxvY2s6bm9PcDt2YXIgY2IxPShvcHRzLnNob3dPdmVybGF5JiYhbXNnKT9jYjpub09wO3ZhciBjYjI9bXNnP2NiOm5vT3A7aWYob3B0cy5zaG93T3ZlcmxheSkKbHlyMi5fZmFkZUluKG9wdHMuZmFkZUluLGNiMSk7aWYobXNnKQpseXIzLl9mYWRlSW4ob3B0cy5mYWRlSW4sY2IyKX0KZWxzZXtpZihvcHRzLnNob3dPdmVybGF5KQpseXIyLnNob3coKTtpZihtc2cpCmx5cjMuc2hvdygpO2lmKG9wdHMub25CbG9jaykKb3B0cy5vbkJsb2NrLmJpbmQobHlyMykoKX0KYmluZCgxLGVsLG9wdHMpO2lmKGZ1bGwpe3BhZ2VCbG9jaz1seXIzWzBdO3BhZ2VCbG9ja0Vscz0kKG9wdHMuZm9jdXNhYmxlRWxlbWVudHMscGFnZUJsb2NrKTtpZihvcHRzLmZvY3VzSW5wdXQpCnNldFRpbWVvdXQoZm9jdXMsMjApfQplbHNlIGNlbnRlcihseXIzWzBdLG9wdHMuY2VudGVyWCxvcHRzLmNlbnRlclkpO2lmKG9wdHMudGltZW91dCl7dmFyIHRvPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihmdWxsKQokLnVuYmxvY2tVSShvcHRzKTtlbHNlICQoZWwpLnVuYmxvY2sob3B0cyl9LG9wdHMudGltZW91dCk7JChlbCkuZGF0YSgnYmxvY2tVSS50aW1lb3V0Jyx0byl9fQpmdW5jdGlvbiByZW1vdmUoZWwsb3B0cyl7dmFyIGNvdW50O3ZhciBmdWxsPShlbD09d2luZG93KTt2YXIgJGVsPSQoZWwpO3ZhciBkYXRhPSRlbC5kYXRhKCdibG9ja1VJLmhpc3RvcnknKTt2YXIgdG89JGVsLmRhdGEoJ2Jsb2NrVUkudGltZW91dCcpO2lmKHRvKXtjbGVhclRpbWVvdXQodG8pOyRlbC5yZW1vdmVEYXRhKCdibG9ja1VJLnRpbWVvdXQnKX0Kb3B0cz0kLmV4dGVuZCh7fSwkLmJsb2NrVUkuZGVmYXVsdHMsb3B0c3x8e30pO2JpbmQoMCxlbCxvcHRzKTtpZihvcHRzLm9uVW5ibG9jaz09PW51bGwpe29wdHMub25VbmJsb2NrPSRlbC5kYXRhKCdibG9ja1VJLm9uVW5ibG9jaycpOyRlbC5yZW1vdmVEYXRhKCdibG9ja1VJLm9uVW5ibG9jaycpfQp2YXIgZWxzO2lmKGZ1bGwpCmVscz0kKCdib2R5JykuY2hpbGRyZW4oKS5maWx0ZXIoJy5ibG9ja1VJJykuYWRkKCdib2R5ID4gLmJsb2NrVUknKTtlbHNlIGVscz0kZWwuZmluZCgnPi5ibG9ja1VJJyk7aWYob3B0cy5jdXJzb3JSZXNldCl7aWYoZWxzLmxlbmd0aD4xKQplbHNbMV0uc3R5bGUuY3Vyc29yPW9wdHMuY3Vyc29yUmVzZXQ7aWYoZWxzLmxlbmd0aD4yKQplbHNbMl0uc3R5bGUuY3Vyc29yPW9wdHMuY3Vyc29yUmVzZXR9CmlmKGZ1bGwpCnBhZ2VCbG9jaz1wYWdlQmxvY2tFbHM9bnVsbDtpZihvcHRzLmZhZGVPdXQpe2NvdW50PWVscy5sZW5ndGg7ZWxzLnN0b3AoKS5mYWRlT3V0KG9wdHMuZmFkZU91dCxmdW5jdGlvbigpe2lmKC0tY291bnQ9PT0wKQpyZXNldChlbHMsZGF0YSxvcHRzLGVsKX0pfQplbHNlIHJlc2V0KGVscyxkYXRhLG9wdHMsZWwpfQpmdW5jdGlvbiByZXNldChlbHMsZGF0YSxvcHRzLGVsKXt2YXIgJGVsPSQoZWwpO2lmKCRlbC5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcpKQpyZXR1cm47ZWxzLmVhY2goZnVuY3Rpb24oaSxvKXtpZih0aGlzLnBhcmVudE5vZGUpCnRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX0pO2lmKGRhdGEmJmRhdGEuZWwpe2RhdGEuZWwuc3R5bGUuZGlzcGxheT1kYXRhLmRpc3BsYXk7ZGF0YS5lbC5zdHlsZS5wb3NpdGlvbj1kYXRhLnBvc2l0aW9uO2RhdGEuZWwuc3R5bGUuY3Vyc29yPSdkZWZhdWx0JztpZihkYXRhLnBhcmVudCkKZGF0YS5wYXJlbnQuYXBwZW5kQ2hpbGQoZGF0YS5lbCk7JGVsLnJlbW92ZURhdGEoJ2Jsb2NrVUkuaGlzdG9yeScpfQppZigkZWwuZGF0YSgnYmxvY2tVSS5zdGF0aWMnKSl7JGVsLmNzcygncG9zaXRpb24nLCdzdGF0aWMnKX0KaWYodHlwZW9mIG9wdHMub25VbmJsb2NrPT0nZnVuY3Rpb24nKQpvcHRzLm9uVW5ibG9jayhlbCxvcHRzKTt2YXIgYm9keT0kKGRvY3VtZW50LmJvZHkpLHc9Ym9keS53aWR0aCgpLGNzc1c9Ym9keVswXS5zdHlsZS53aWR0aDtib2R5LndpZHRoKHctMSkud2lkdGgodyk7Ym9keVswXS5zdHlsZS53aWR0aD1jc3NXfQpmdW5jdGlvbiBiaW5kKGIsZWwsb3B0cyl7dmFyIGZ1bGw9ZWw9PXdpbmRvdywkZWw9JChlbCk7aWYoIWImJihmdWxsJiYhcGFnZUJsb2NrfHwhZnVsbCYmISRlbC5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcpKSkKcmV0dXJuOyRlbC5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcsYik7aWYoIWZ1bGx8fCFvcHRzLmJpbmRFdmVudHN8fChiJiYhb3B0cy5zaG93T3ZlcmxheSkpCnJldHVybjt2YXIgZXZlbnRzPSdtb3VzZWRvd24gbW91c2V1cCBrZXlkb3duIGtleXByZXNzIGtleXVwIHRvdWNoc3RhcnQgdG91Y2hlbmQgdG91Y2htb3ZlJztpZihiKQokKGRvY3VtZW50KS5iaW5kKGV2ZW50cyxvcHRzLGhhbmRsZXIpO2Vsc2UgJChkb2N1bWVudCkudW5iaW5kKGV2ZW50cyxoYW5kbGVyKX0KZnVuY3Rpb24gaGFuZGxlcihlKXtpZihlLnR5cGU9PT0na2V5ZG93bicmJmUua2V5Q29kZSYmZS5rZXlDb2RlPT05KXtpZihwYWdlQmxvY2smJmUuZGF0YS5jb25zdHJhaW5UYWJLZXkpe3ZhciBlbHM9cGFnZUJsb2NrRWxzO3ZhciBmd2Q9IWUuc2hpZnRLZXkmJmUudGFyZ2V0PT09ZWxzW2Vscy5sZW5ndGgtMV07dmFyIGJhY2s9ZS5zaGlmdEtleSYmZS50YXJnZXQ9PT1lbHNbMF07aWYoZndkfHxiYWNrKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zm9jdXMoYmFjayl9LDEwKTtyZXR1cm4hMX19fQp2YXIgb3B0cz1lLmRhdGE7dmFyIHRhcmdldD0kKGUudGFyZ2V0KTtpZih0YXJnZXQuaGFzQ2xhc3MoJ2Jsb2NrT3ZlcmxheScpJiZvcHRzLm9uT3ZlcmxheUNsaWNrKQpvcHRzLm9uT3ZlcmxheUNsaWNrKGUpO2lmKHRhcmdldC5wYXJlbnRzKCdkaXYuJytvcHRzLmJsb2NrTXNnQ2xhc3MpLmxlbmd0aD4wKQpyZXR1cm4hMDtyZXR1cm4gdGFyZ2V0LnBhcmVudHMoKS5jaGlsZHJlbigpLmZpbHRlcignZGl2LmJsb2NrVUknKS5sZW5ndGg9PT0wfQpmdW5jdGlvbiBmb2N1cyhiYWNrKXtpZighcGFnZUJsb2NrRWxzKQpyZXR1cm47dmFyIGU9cGFnZUJsb2NrRWxzW2JhY2s9PT0hMD9wYWdlQmxvY2tFbHMubGVuZ3RoLTE6MF07aWYoZSkKZS5mb2N1cygpfQpmdW5jdGlvbiBjZW50ZXIoZWwseCx5KXt2YXIgcD1lbC5wYXJlbnROb2RlLHM9ZWwuc3R5bGU7dmFyIGw9KChwLm9mZnNldFdpZHRoLWVsLm9mZnNldFdpZHRoKS8yKS1zeihwLCdib3JkZXJMZWZ0V2lkdGgnKTt2YXIgdD0oKHAub2Zmc2V0SGVpZ2h0LWVsLm9mZnNldEhlaWdodCkvMiktc3oocCwnYm9yZGVyVG9wV2lkdGgnKTtpZih4KXMubGVmdD1sPjA/KGwrJ3B4Jyk6JzAnO2lmKHkpcy50b3A9dD4wPyh0KydweCcpOicwJ30KZnVuY3Rpb24gc3ooZWwscCl7cmV0dXJuIHBhcnNlSW50KCQuY3NzKGVsLHApLDEwKXx8MH19CmlmKHR5cGVvZiBkZWZpbmU9PT0nZnVuY3Rpb24nJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSl7ZGVmaW5lKFsnanF1ZXJ5J10sc2V0dXApfWVsc2V7c2V0dXAoalF1ZXJ5KX19KSgpOyhmdW5jdGlvbigkKXskLmFsZXJ0cz17dmVydGljYWxPZmZzZXQ6LTc1LGhvcml6b250YWxPZmZzZXQ6MCxyZXBvc2l0aW9uT25SZXNpemU6ITAsb3ZlcmxheU9wYWNpdHk6LjAxLG92ZXJsYXlDb2xvcjonI0ZGRicsZHJhZ2dhYmxlOiEwLG9rQnV0dG9uOicmbmJzcDtPSyZuYnNwOycsY2FuY2VsQnV0dG9uOicmbmJzcDtDYW5jZWwmbmJzcDsnLGRpYWxvZ0NsYXNzOm51bGwsYWxlcnQ6ZnVuY3Rpb24obWVzc2FnZSx0aXRsZSxjYWxsYmFjayl7aWYodGl0bGU9PW51bGwpdGl0bGU9J0FsZXJ0JzskLmFsZXJ0cy5fc2hvdyh0aXRsZSxtZXNzYWdlLG51bGwsJ2FsZXJ0JyxmdW5jdGlvbihyZXN1bHQpe2lmKGNhbGxiYWNrKWNhbGxiYWNrKHJlc3VsdCl9KX0sY29uZmlybTpmdW5jdGlvbihtZXNzYWdlLHRpdGxlLGNhbGxiYWNrKXtpZih0aXRsZT09bnVsbCl0aXRsZT0nQ29uZmlybSc7JC5hbGVydHMuX3Nob3codGl0bGUsbWVzc2FnZSxudWxsLCdjb25maXJtJyxmdW5jdGlvbihyZXN1bHQpe2lmKGNhbGxiYWNrKWNhbGxiYWNrKHJlc3VsdCl9KX0scHJvbXB0OmZ1bmN0aW9uKG1lc3NhZ2UsdmFsdWUsdGl0bGUsY2FsbGJhY2spe2lmKHRpdGxlPT1udWxsKXRpdGxlPSdQcm9tcHQnOyQuYWxlcnRzLl9zaG93KHRpdGxlLG1lc3NhZ2UsdmFsdWUsJ3Byb21wdCcsZnVuY3Rpb24ocmVzdWx0KXtpZihjYWxsYmFjayljYWxsYmFjayhyZXN1bHQpfSl9LF9zaG93OmZ1bmN0aW9uKHRpdGxlLG1zZyx2YWx1ZSx0eXBlLGNhbGxiYWNrKXskLmFsZXJ0cy5faGlkZSgpOyQuYWxlcnRzLl9vdmVybGF5KCdzaG93Jyk7JCgiQk9EWSIpLmFwcGVuZCgnPGRpdiBpZD0icG9wdXBfY29udGFpbmVyIj4nKyc8aDEgaWQ9InBvcHVwX3RpdGxlIj48L2gxPicrJzxkaXYgaWQ9InBvcHVwX2NvbnRlbnQiPicrJzxkaXYgaWQ9InBvcHVwX21lc3NhZ2UiPjwvZGl2PicrJzwvZGl2PicrJzwvZGl2PicpO2lmKCQuYWxlcnRzLmRpYWxvZ0NsYXNzKSQoIiNwb3B1cF9jb250YWluZXIiKS5hZGRDbGFzcygkLmFsZXJ0cy5kaWFsb2dDbGFzcyk7dmFyIHBvcz0oJC5icm93c2VyLm1zaWUmJnBhcnNlSW50KCQuYnJvd3Nlci52ZXJzaW9uKTw9Nik/J2Fic29sdXRlJzonZml4ZWQnOyQoIiNwb3B1cF9jb250YWluZXIiKS5jc3Moe3Bvc2l0aW9uOnBvcyx6SW5kZXg6OTk5OTkscGFkZGluZzowLG1hcmdpbjowfSk7JCgiI3BvcHVwX3RpdGxlIikudGV4dCh0aXRsZSk7JCgiI3BvcHVwX2NvbnRlbnQiKS5hZGRDbGFzcyh0eXBlKTskKCIjcG9wdXBfbWVzc2FnZSIpLnRleHQobXNnKTskKCIjcG9wdXBfbWVzc2FnZSIpLmh0bWwoJCgiI3BvcHVwX21lc3NhZ2UiKS50ZXh0KCkucmVwbGFjZSgvXG4vZywnPGJyIC8+JykpOyQoIiNwb3B1cF9jb250YWluZXIiKS5jc3Moe21pbldpZHRoOiQoIiNwb3B1cF9jb250YWluZXIiKS5vdXRlcldpZHRoKCksbWF4V2lkdGg6JCgiI3BvcHVwX2NvbnRhaW5lciIpLm91dGVyV2lkdGgoKX0pOyQuYWxlcnRzLl9yZXBvc2l0aW9uKCk7JC5hbGVydHMuX21haW50YWluUG9zaXRpb24oITApO3N3aXRjaCh0eXBlKXtjYXNlICdhbGVydCc6JCgiI3BvcHVwX21lc3NhZ2UiKS5hZnRlcignPGRpdiBpZD0icG9wdXBfcGFuZWwiPjxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSInKyQuYWxlcnRzLm9rQnV0dG9uKyciIGlkPSJwb3B1cF9vayIgLz48L2Rpdj4nKTskKCIjcG9wdXBfb2siKS5jbGljayhmdW5jdGlvbigpeyQuYWxlcnRzLl9oaWRlKCk7Y2FsbGJhY2soITApfSk7JCgiI3BvcHVwX29rIikuZm9jdXMoKS5rZXlwcmVzcyhmdW5jdGlvbihlKXtpZihlLmtleUNvZGU9PTEzfHxlLmtleUNvZGU9PTI3KSQoIiNwb3B1cF9vayIpLnRyaWdnZXIoJ2NsaWNrJyl9KTticmVhaztjYXNlICdjb25maXJtJzokKCIjcG9wdXBfbWVzc2FnZSIpLmFmdGVyKCc8ZGl2IGlkPSJwb3B1cF9wYW5lbCI+PGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IicrJC5hbGVydHMub2tCdXR0b24rJyIgaWQ9InBvcHVwX29rIiAvPiA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iJyskLmFsZXJ0cy5jYW5jZWxCdXR0b24rJyIgaWQ9InBvcHVwX2NhbmNlbCIgLz48L2Rpdj4nKTskKCIjcG9wdXBfb2siKS5jbGljayhmdW5jdGlvbigpeyQuYWxlcnRzLl9oaWRlKCk7aWYoY2FsbGJhY2spY2FsbGJhY2soITApfSk7JCgiI3BvcHVwX2NhbmNlbCIpLmNsaWNrKGZ1bmN0aW9uKCl7JC5hbGVydHMuX2hpZGUoKTtpZihjYWxsYmFjayljYWxsYmFjayghMSl9KTskKCIjcG9wdXBfb2siKS5mb2N1cygpOyQoIiNwb3B1cF9vaywgI3BvcHVwX2NhbmNlbCIpLmtleXByZXNzKGZ1bmN0aW9uKGUpe2lmKGUua2V5Q29kZT09MTMpJCgiI3BvcHVwX29rIikudHJpZ2dlcignY2xpY2snKTtpZihlLmtleUNvZGU9PTI3KSQoIiNwb3B1cF9jYW5jZWwiKS50cmlnZ2VyKCdjbGljaycpfSk7YnJlYWs7Y2FzZSAncHJvbXB0JzokKCIjcG9wdXBfbWVzc2FnZSIpLmFwcGVuZCgnPGJyIC8+PGlucHV0IHR5cGU9InRleHQiIHNpemU9IjMwIiBpZD0icG9wdXBfcHJvbXB0IiAvPicpLmFmdGVyKCc8ZGl2IGlkPSJwb3B1cF9wYW5lbCI+PGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IicrJC5hbGVydHMub2tCdXR0b24rJyIgaWQ9InBvcHVwX29rIiAvPiA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iJyskLmFsZXJ0cy5jYW5jZWxCdXR0b24rJyIgaWQ9InBvcHVwX2NhbmNlbCIgLz48L2Rpdj4nKTskKCIjcG9wdXBfcHJvbXB0Iikud2lkdGgoJCgiI3BvcHVwX21lc3NhZ2UiKS53aWR0aCgpKTskKCIjcG9wdXBfb2siKS5jbGljayhmdW5jdGlvbigpe3ZhciB2YWw9JCgiI3BvcHVwX3Byb21wdCIpLnZhbCgpOyQuYWxlcnRzLl9oaWRlKCk7aWYoY2FsbGJhY2spY2FsbGJhY2sodmFsKX0pOyQoIiNwb3B1cF9jYW5jZWwiKS5jbGljayhmdW5jdGlvbigpeyQuYWxlcnRzLl9oaWRlKCk7aWYoY2FsbGJhY2spY2FsbGJhY2sobnVsbCl9KTskKCIjcG9wdXBfcHJvbXB0LCAjcG9wdXBfb2ssICNwb3B1cF9jYW5jZWwiKS5rZXlwcmVzcyhmdW5jdGlvbihlKXtpZihlLmtleUNvZGU9PTEzKSQoIiNwb3B1cF9vayIpLnRyaWdnZXIoJ2NsaWNrJyk7aWYoZS5rZXlDb2RlPT0yNykkKCIjcG9wdXBfY2FuY2VsIikudHJpZ2dlcignY2xpY2snKX0pO2lmKHZhbHVlKSQoIiNwb3B1cF9wcm9tcHQiKS52YWwodmFsdWUpOyQoIiNwb3B1cF9wcm9tcHQiKS5mb2N1cygpLnNlbGVjdCgpO2JyZWFrfQppZigkLmFsZXJ0cy5kcmFnZ2FibGUpe3RyeXskKCIjcG9wdXBfY29udGFpbmVyIikuZHJhZ2dhYmxlKHtoYW5kbGU6JCgiI3BvcHVwX3RpdGxlIil9KTskKCIjcG9wdXBfdGl0bGUiKS5jc3Moe2N1cnNvcjonbW92ZSd9KX1jYXRjaChlKXt9fX0sX2hpZGU6ZnVuY3Rpb24oKXskKCIjcG9wdXBfY29udGFpbmVyIikucmVtb3ZlKCk7JC5hbGVydHMuX292ZXJsYXkoJ2hpZGUnKTskLmFsZXJ0cy5fbWFpbnRhaW5Qb3NpdGlvbighMSl9LF9vdmVybGF5OmZ1bmN0aW9uKHN0YXR1cyl7c3dpdGNoKHN0YXR1cyl7Y2FzZSAnc2hvdyc6JC5hbGVydHMuX292ZXJsYXkoJ2hpZGUnKTskKCJCT0RZIikuYXBwZW5kKCc8ZGl2IGlkPSJwb3B1cF9vdmVybGF5Ij48L2Rpdj4nKTskKCIjcG9wdXBfb3ZlcmxheSIpLmNzcyh7cG9zaXRpb246J2Fic29sdXRlJyx6SW5kZXg6OTk5OTgsdG9wOicwcHgnLGxlZnQ6JzBweCcsd2lkdGg6JzEwMCUnLGhlaWdodDokKGRvY3VtZW50KS5oZWlnaHQoKSxiYWNrZ3JvdW5kOiQuYWxlcnRzLm92ZXJsYXlDb2xvcixvcGFjaXR5OiQuYWxlcnRzLm92ZXJsYXlPcGFjaXR5fSk7YnJlYWs7Y2FzZSAnaGlkZSc6JCgiI3BvcHVwX292ZXJsYXkiKS5yZW1vdmUoKTticmVha319LF9yZXBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIHRvcD0oKCQod2luZG93KS5oZWlnaHQoKS8yKS0oJCgiI3BvcHVwX2NvbnRhaW5lciIpLm91dGVySGVpZ2h0KCkvMikpKyQuYWxlcnRzLnZlcnRpY2FsT2Zmc2V0O3ZhciBsZWZ0PSgoJCh3aW5kb3cpLndpZHRoKCkvMiktKCQoIiNwb3B1cF9jb250YWluZXIiKS5vdXRlcldpZHRoKCkvMikpKyQuYWxlcnRzLmhvcml6b250YWxPZmZzZXQ7aWYodG9wPDApdG9wPTA7aWYobGVmdDwwKWxlZnQ9MDtpZigkLmJyb3dzZXIubXNpZSYmcGFyc2VJbnQoJC5icm93c2VyLnZlcnNpb24pPD02KXRvcD10b3ArJCh3aW5kb3cpLnNjcm9sbFRvcCgpOyQoIiNwb3B1cF9jb250YWluZXIiKS5jc3Moe3RvcDp0b3ArJ3B4JyxsZWZ0OmxlZnQrJ3B4J30pOyQoIiNwb3B1cF9vdmVybGF5IikuaGVpZ2h0KCQoZG9jdW1lbnQpLmhlaWdodCgpKX0sX21haW50YWluUG9zaXRpb246ZnVuY3Rpb24oc3RhdHVzKXtpZigkLmFsZXJ0cy5yZXBvc2l0aW9uT25SZXNpemUpe3N3aXRjaChzdGF0dXMpe2Nhc2UgdHJ1ZTokKHdpbmRvdykuYmluZCgncmVzaXplJywkLmFsZXJ0cy5fcmVwb3NpdGlvbik7YnJlYWs7Y2FzZSBmYWxzZTokKHdpbmRvdykudW5iaW5kKCdyZXNpemUnLCQuYWxlcnRzLl9yZXBvc2l0aW9uKTticmVha319fX0KakFsZXJ0PWZ1bmN0aW9uKG1lc3NhZ2UsdGl0bGUsY2FsbGJhY2speyQuYWxlcnRzLmFsZXJ0KG1lc3NhZ2UsdGl0bGUsY2FsbGJhY2spfQpqQ29uZmlybT1mdW5jdGlvbihtZXNzYWdlLHRpdGxlLGNhbGxiYWNrKXskLmFsZXJ0cy5jb25maXJtKG1lc3NhZ2UsdGl0bGUsY2FsbGJhY2spfTtqUHJvbXB0PWZ1bmN0aW9uKG1lc3NhZ2UsdmFsdWUsdGl0bGUsY2FsbGJhY2speyQuYWxlcnRzLnByb21wdChtZXNzYWdlLHZhbHVlLHRpdGxlLGNhbGxiYWNrKX19KShqUXVlcnkpO3ZhciB0aGlzQ2FydElzUmVzcG9uc2l2ZT0hMTt2YXIgbWluV2lkdGg9MTMxMDt2YXIgcmZxQ2FydD0hMTtmdW5jdGlvbiBjaGVja0FuZFVwZGF0ZVN0YXRlRm9ybUZpZWxkKHRyaWdnZXIpe3ZhciBhamF4QWRkcmVzcz0iaW5jbHVkZXMvYWpheC9hamF4LmFkZHJlc3MucGhwIjt2YXIgY291bnRyeUlEPSQodHJpZ2dlcikudmFsKCk7JC5wb3N0KGFqYXhBZGRyZXNzLHtjb3VudHJ5SUQ6Y291bnRyeUlEfSxmdW5jdGlvbihkYXRhKXskKCcuc3RhdGVDb250YWluZXIgLmNvbC1zbS05JykuaHRtbChkYXRhKX0pfQokKGZ1bmN0aW9uKCl7c2V0dXBMYWJlbENsaWNrKCk7c2V0SGVhZGVyKCk7JCh3aW5kb3cpLnNjcm9sbChmdW5jdGlvbigpe3NldEhlYWRlcigpfSk7c2V0Q3VycmVudFllYXJJbkZvb3RlcigpO2hhbmRsZUNhdGVnb3J5TGlzdGluZ0l0ZW1Ib3ZlcigpO3JlbW92ZVBhZ2VTZWN0aW9uQnJlYWtzKCk7c2V0VXBIb3Zlck9uSGVhZGVySWNvbnMoKTtpZih0aGlzQ2FydElzUmVzcG9uc2l2ZT09PSEwKXtzZXROYXZpZ2F0aW9uKCk7JCh3aW5kb3cpLm9uKCdyZXNpemUnLGZ1bmN0aW9uKCl7c2V0TmF2aWdhdGlvbigpfSl9CnJlc3BvbnNpZnlUYWJsZXMoKTtyZXNwb25zaWZ5SWZyYW1lcygpOyQoIiNtYWduaWZ5IikuZXZlblpvb20oKTskKCcuZGF0ZXBpY2tlcicpLmRhdGVwaWNrZXIoKTskKCJhW2hyZWY9JyN0b3AnXSIpLmNsaWNrKGZ1bmN0aW9uKCl7JCgiaHRtbCwgYm9keSIpLmFuaW1hdGUoe3Njcm9sbFRvcDowfSwic2xvdyIpO3JldHVybiExfSk7c2V0VG90YWwoKTtpZihjYWxjUHJpY2UpeyQoIiNwUXR5Iikua2V5dXAoZnVuY3Rpb24oKXtzZXRUb3RhbCgpfSl9CiQoJyNjYXJ0X3F1YW50aXR5Jykub24oImtleXVwIGtleXByZXNzIixmdW5jdGlvbihlKXt2YXIgY29kZT1lLmtleUNvZGV8fGUud2hpY2g7aWYoY29kZT09MTMpe2UucHJldmVudERlZmF1bHQoKTtyZXR1cm4hMX19KTskKCIjY3JlYXRlX2FjY291bnQiKS5jaGFuZ2UoZnVuY3Rpb24oKXt0b2dnbGVQYXNzd29yZHMoKX0pOyQoIi5hZGRyZXNzLWZpZWxkIikub24oe2tleWRvd246ZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50LndoaWNoPT0xMyl7ZXZlbnQucHJldmVudERlZmF1bHQoKX19fSk7JCgiLmFkZHJlc3MtZmllbGQiKS5vbih7a2V5ZG93bjpmdW5jdGlvbihldmVudCl7aWYoZXZlbnQud2hpY2g9PTEzKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpfX19KTtvcmlnQ291bnRyeT0kKCIjY291bnRyeSIpLnZhbCgpO3RvZ2dsZV9vdGhlclN0YXRlKGFkZHIuc3RhdGVfb3RoZXIpO2luaXRfdmFsaWRhdGlvbigpO3RvZ2dsZVBhc3N3b3JkcygpOyQoIiNqcV9kaWFsb2ciKS5kaWFsb2coe2F1dG9PcGVuOiExLGNsb3NlOmZ1bmN0aW9uKGV2ZW50LHVpKXskKCIjanFfZGlhbG9nIikuaHRtbCgnJyl9fSk7JCgiYS5idXR0b24tY2hlY2tvdXQiKS5jbGljayhmdW5jdGlvbihldmVudCl7aWYobWluT3JkZXJfYW10PjAmJm1pbk9yZGVyX2FtdD5jYXJ0VG90YWxfYW10KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpOyQoIiNqcV9kaWFsb2ciKS5odG1sKG9yZGVyVW5kZXJUZXh0KS5kaWFsb2coIm9wZW4iKTtyZXR1cm4hMX1lbHNle3JldHVybiEwfX0pO2lmKHR5cGVvZiBkZWZhdWx0UGF5bWVudCE9J3VuZGVmaW5lZCcpe3ZhciBzZXRQYXk9ZGVmYXVsdFBheW1lbnQ7aWYoY3VyUGF5bWVudC5sZW5ndGg+MSl7c2V0UGF5PWN1clBheW1lbnR9CnNldFBheW1lbnRTZWxlY3RvcihzZXRQYXkpfQp3aW5XPXdpbmRvdy5vdXRlcldpZHRoO3dpbkg9d2luZG93Lm91dGVySGVpZ2h0O3dpblg9d2luZG93LnNjcmVlblg7d2luWT13aW5kb3cuc2NyZWVuWTskKHdpbmRvdykub24oJ3Jlc2l6ZScsZnVuY3Rpb24oKXt2YXIgaGVhZGVyU2VhcmNoPSQoJyNoZWFkZXJfc2VhcmNoJyk7aWYoaGVhZGVyU2VhcmNoLmxlbmd0aD4wKXtoZWFkZXJTZWFyY2gucmVtb3ZlQXR0cignc3R5bGUnKX19KTt1cGRhdGVMYXlvdXRPZlJGUUZvcm1JdGVtcygpfSk7ZnVuY3Rpb24gc2V0dXBMYWJlbENsaWNrKGUpeyQoJy5jbGlja2FibGUtbGFiZWwnKS51bmJpbmQoJ2NsaWNrJykuY2xpY2soZnVuY3Rpb24oKXt2YXIgbmFtZT0kKHRoaXMpLmF0dHIoJ2ZvcicpO3ZhciBzaWJsaW5nSW5wdXQ9JCh0aGlzKS5zaWJsaW5ncygiaW5wdXQiKTskKHNpYmxpbmdJbnB1dCkuZWFjaChmdW5jdGlvbigpe2lmKCQodGhpcykuYXR0cignbmFtZScpPT1uYW1lKXtpZigkKHRoaXMpLnByb3AoJ2NoZWNrZWQnKT09ITApeyQodGhpcykucHJvcCgnY2hlY2tlZCcsITEpfWVsc2V7JCh0aGlzKS5wcm9wKCdjaGVja2VkJywhMCl9fX0pfSkuaG92ZXIoZnVuY3Rpb24oKXskKHRoaXMpLmNzcygnY3Vyc29yJywncG9pbnRlcicpfSl9CmZ1bmN0aW9uIGhlbHAodGl0bGUsdGV4dCxjZW50ZXIpe2lmKCQoJyNoZWxwZGlhbG9nJykubGVuZ3RoPT0wKXt2YXIgc3R5bGU9Y2VudGVyPT0xPydzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyInOicnOyQoJ2JvZHknKS5hcHBlbmQoJzxkaXYgJytzdHlsZSsnIGlkPSJoZWxwZGlhbG9nIj4nK3RleHQrJzwvZGl2PicpfWVsc2V7aWYoY2VudGVyPT0xKXskKCcjaGVscGRpYWxvZycpLmNzcygndGV4dC1hbGlnbicsJ2NlbnRlcicpLmh0bWwodGV4dCl9ZWxzZXskKCcjaGVscGRpYWxvZycpLmNzcygndGV4dC1hbGlnbicsJ2xlZnQnKS5odG1sKHRleHQpfX0KJCgnI2hlbHBkaWFsb2cnKS5kaWFsb2coe21vZGFsOiEwLHdpZHRoOjQwMCxyZXNpemVhYmxlOiExLGRyYWdnYWJsZTohMSxkaWFsb2dDbGFzczonaGVscGRpYWxvZycsdGl0bGU6dGl0bGUsc2hvdzohMSxidXR0b25zOlt7dGV4dDoiT2siLGNsaWNrOmZ1bmN0aW9uKCl7JCh0aGlzKS5kaWFsb2coImNsb3NlIil9fV19KX0KZnVuY3Rpb24gaXNGcmFjdGlvbih2YWwpe3JldHVybiB2YWwubWF0Y2goL14oKFxkK1xzKT9cZCtcL1xkKykkL2cpIT1udWxsfQpmdW5jdGlvbiBjb252ZXJ0RnJhY3Rpb25Ub0RlY2ltYWwodmFsKXt2YXIgeT12YWwuc3BsaXQoJyAnKTtpZih5Lmxlbmd0aD4xKXt2YXIgej15WzFdLnNwbGl0KCcvJyk7cmV0dXJuIHBhcnNlRmxvYXQoKCt5WzBdKyh6WzBdL3pbMV0pKSl9ZWxzZXt2YXIgej15WzBdLnNwbGl0KCcvJyk7aWYoei5sZW5ndGg+MSl7cmV0dXJuIHBhcnNlRmxvYXQoKHpbMF0velsxXSkpfWVsc2V7cmV0dXJuIHBhcnNlRmxvYXQoelswXSl9fQpyZXR1cm4gMH0KZnVuY3Rpb24gcmVzcG9uc2lmeVRhYmxlcygpe3ZhciB0YWJsZXM9JCgndGFibGUnKTt0YWJsZXMuZWFjaChmdW5jdGlvbigpe2lmKCEkKHRoaXMpLnBhcmVudCgpLmhhc0NsYXNzKCd0YWJsZS1yZXNwb25zaXZlJykpeyQodGhpcykud3JhcCgnPGRpdiBjbGFzcz0idGFibGUtcmVzcG9uc2l2ZSI+PC9kaXY+Jyl9fSl9CmZ1bmN0aW9uIHNldE5hdmlnYXRpb24oKXt2YXIgd2luZG93V2lkdGg9JCh3aW5kb3cpLndpZHRoKCk7aWYodG91Y2hJc0VuYWJsZWQoKSYmKHdpbmRvd1dpZHRoPG1pbldpZHRoKSl7aGlkZU5hdmlnYXRpb24oKX1lbHNlIGlmKHRvdWNoSXNFbmFibGVkKCkmJihtaW5XaWR0aDx3aW5kb3dXaWR0aCkpe3Nob3dOYXZpZ2F0aW9uKCl9fQpmdW5jdGlvbiBoaWRlTmF2aWdhdGlvbigpeyQoJy51cHBlcl9uYXZfY29udGFpbmVyJykuY3NzKCdkaXNwbGF5Jywnbm9uZScpOyQoJy5tZWdhX25hdicpLmNzcygnZGlzcGxheScsJ25vbmUnKTskKCcudG9wX25hdicpLmNzcygnZGlzcGxheScsJ25vbmUnKTskKCcjcmVzcG9uc2l2ZU1lbnVCdXR0b24nKS5yZW1vdmVDbGFzcygnaGlkZGVuLW1kIGhpZGRlbi1sZycpfQpmdW5jdGlvbiBzaG93TmF2aWdhdGlvbigpeyQoJy51cHBlcl9uYXZfY29udGFpbmVyJykuY3NzKCdkaXNwbGF5JywnaW5saW5lLWJsb2NrJyk7JCgnLm1lZ2FfbmF2JykuY3NzKCdkaXNwbGF5JywnYmxvY2snKTskKCcudG9wX25hdicpLmNzcygnZGlzcGxheScsJ2lubGluZS1ibG9jaycpO2lmKCEkKCcjcmVzcG9uc2l2ZU1lbnVCdXR0b24nKS5oYXNDbGFzcygnaGlkZGVuLW1kIGhpZGRlbi1sZycpKXskKCcjcmVzcG9uc2l2ZU1lbnVCdXR0b24nKS5hZGRDbGFzcygnaGlkZGVuLW1kIGhpZGRlbi1sZycpfX0KZnVuY3Rpb24gdG91Y2hJc0VuYWJsZWQoKXt2YXIgcmV0dXJuVmFsdWU9ITE7aWYoJ29udG91Y2hzdGFydCcgaW4gd2luZG93fHxuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMpe3JldHVyblZhbHVlPSEwfQpyZXR1cm4gcmV0dXJuVmFsdWV9CmZ1bmN0aW9uIGR1bXBPYmplY3RUb0NvbnNvbGUob2JqKXskLmVhY2gob2JqLGZ1bmN0aW9uKGluZGV4LHZhbCl7Y29uc29sZS5sb2coaW5kZXgrJyAtLSAnK3ZhbCl9KX0KJC5mbi5hYnNvbHV0ZUNvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7dmFyIHNUb3A9JCh3aW5kb3cpLnNjcm9sbFRvcCgpO3ZhciBzTGVmdD0kKHdpbmRvdykuc2Nyb2xsTGVmdCgpO3ZhciB3PXRoaXMud2lkdGgoKTt2YXIgaD10aGlzLmhlaWdodCgpO3ZhciBvZmZzZXQ9dGhpcy5vZmZzZXQoKTt2YXIgJHA9dGhpczt2YXIgY291bnQ9MDt3aGlsZSh0eXBlb2YgJHA9PSdvYmplY3QnKXt2YXIgcE9mZnNldD0kcC5wYXJlbnQoKS5vZmZzZXQoKTtpZih0eXBlb2YgcE9mZnNldD09J3VuZGVmaW5lZCcpYnJlYWs7b2Zmc2V0LmxlZnQ9b2Zmc2V0LmxlZnQrKHBPZmZzZXQubGVmdCk7b2Zmc2V0LnRvcD1vZmZzZXQudG9wKyhwT2Zmc2V0LnRvcCk7JHA9JHAucGFyZW50KCl9CnZhciBwb3M9e2xlZnQ6b2Zmc2V0LmxlZnQrc0xlZnQscmlnaHQ6b2Zmc2V0LmxlZnQrdytzTGVmdCx0b3A6b2Zmc2V0LnRvcCtzVG9wLGJvdHRvbTpvZmZzZXQudG9wK2grc1RvcCx9CnBvcy50bD17eDpwb3MubGVmdCx5OnBvcy50b3B9O3Bvcy50cj17eDpwb3MucmlnaHQseTpwb3MudG9wfTtwb3MuYmw9e3g6cG9zLmxlZnQseTpwb3MuYm90dG9tfTtwb3MuYnI9e3g6cG9zLnJpZ2h0LHk6cG9zLmJvdHRvbX07Y29uc29sZS5sb2coJ2xlZnQ6ICcrcG9zLmxlZnQrJyAtIHJpZ2h0OiAnK3Bvcy5yaWdodCsnIC0gdG9wOiAnK3Bvcy50b3ArJyAtIGJvdHRvbTogJytwb3MuYm90dG9tKTtyZXR1cm4gcG9zfQpmdW5jdGlvbiBnZXRVcmxWYXJzKCl7dmFyIHZhcnM9e307dmFyIHBhcnRzPXdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1s/Jl0rKFtePSZdKyk9KFteJiNdKikvZ2ksZnVuY3Rpb24obSxrZXksdmFsdWUpe3ZhcnNba2V5XT12YWx1ZX0pO3JldHVybiB2YXJzfQpmdW5jdGlvbiBzdWJtaXRfcmZxKCl7dmFyIGZBY3Q9JCgiI2NhcnRfcXVhbnRpdHkiKS5hdHRyKCdhY3Rpb24nKTtpZihwcm9kdWN0SXNQYXJlbnQ9PSEwKXt2YXIgcmVwbEFjdD1mQWN0LnJlcGxhY2UoJ2FjdGlvbj11cGRhdGVfY2hpbGRfcHJvZHVjdCcsJ2FjdGlvbj11cGRhdGVfY2hpbGRfcmZxX3Byb2R1Y3QnKX1lbHNle3ZhciByZXBsQWN0PWZBY3QucmVwbGFjZSgnYWN0aW9uPXVwZGF0ZV9wcm9kdWN0JywnYWN0aW9uPXVwZGF0ZV9yZnFfcHJvZHVjdCcpfQokKCIjY2FydF9xdWFudGl0eSIpLmF0dHIoJ2FjdGlvbicscmVwbEFjdCkuc3VibWl0KCl9CmZ1bmN0aW9uIHNldFF0eSgpe2N1clF0eT0kKCIjcFF0eSIpLnZhbCgpO2lmKGN1clF0eTxxdHlQdHN8fGN1clF0eSVxdHlQdHMhPTApe25ld1F0eT1NYXRoLmNlaWwoY3VyUXR5L3F0eVB0cykqcXR5UHRzOyQoIiNwUXR5IikudmFsKG5ld1F0eSl9fQpmdW5jdGlvbiBzZXRUb3RhbCgpe2lmKHR5cGVvZiBwYlZhbHMhPSd1bmRlZmluZWQnKXtjdXJRdHk9JCgiI3BRdHkiKS52YWwoKTtpZihjdXJRdHk8MSl7Y3VyUXR5PTF9CnZhciBwYlZhbD0wO3ZhciBwYlNldD0hMTtmb3IodmFyIHggaW4gcGJWYWxzKXtwYlZhbD1wYlZhbHNbeF07cGJQdD1wYlZhbHMuaW5kZXhPZihwYlZhbCk7aWYoY3VyUXR5Pj1wYlB0KXtwYlNldD0hMDtjdXJQcmljZV9lYWNoPXBiVmFsLnRvRml4ZWQocHJpY2VEZWNpbWFscyk7Y3VyUHJpY2VfdG90YWw9KGN1clByaWNlX2VhY2gqY3VyUXR5KS50b0ZpeGVkKDIpO2lmKGN1clByaWNlX3RvdGFsPDApeyR0b3RhbFByaWNlPSQoIiNwcm9kdWN0c1ByaWNlX3RvdGFsIikudGV4dCgpLnJlcGxhY2UoIlRvdGFsIFByaWNlOiAiLCIiKTtyZXR1cm4gJCgiI3Byb2R1Y3RzUHJpY2VfZWFjaCIpLmh0bWwocHJpY2VFYWNoX2xhYmVsKyR0b3RhbFByaWNlKX1lbHNleyQoIiNwcm9kdWN0c1ByaWNlX2VhY2giKS5odG1sKHByaWNlRWFjaF9sYWJlbCsnJCcrY3VyUHJpY2VfZWFjaF9mb3JtYXR0ZWQpfX19CmlmKHBiU2V0IT0hMCl7Y3VyUHJpY2VfdG90YWw9KGJhc2VQcmljZSpjdXJRdHkpLnRvRml4ZWQoMil9CnZhciBwcmljZVRleHQ9Jyc7aWYoc3BlY2lhbFByaWNlX2VhY2g+MCl7cHJpY2VUZXh0PXByaWNlRWFjaF9sYWJlbCsnPHM+JCcrZnVsbFByaWNlKyc8L3M+PGJyIC8+JztwcmljZVRleHQrPSc8c3BhbiBjbGFzcz0icHJvZHVjdFNwZWNpYWxQcmljZSI+JytwcmljZVNwZWNpYWxfbGFiZWwrJyQnK3NwZWNpYWxQcmljZV9lYWNoKyc8L3NwYW4+J31lbHNle3ByaWNlVGV4dD1wcmljZUVhY2hfbGFiZWwrJyQnK2N1clByaWNlX2VhY2h9CiQoIiNwcm9kdWN0c1ByaWNlX2VhY2giKS5odG1sKHByaWNlVGV4dCk7aWYoYmFzZVByaWNlPT0wKXskKCIjcHJvZHVjdHNQcmljZV9lYWNoIikuY3NzKHsnZGlzcGxheSc6J25vbmUnfSl9CiQoIiNwcm9kdWN0c1ByaWNlX3RvdGFsIikuaHRtbChwcmljZVRvdGFsX2xhYmVsKyc8c3BhbiBpdGVtcHJvcD0icHJpY2VDdXJyZW5jeSIgY29udGVudD0iVVNEIj4kPC9zcGFuPjxzcGFuIGl0ZW1wcm9wPSJwcmljZSIgY29udGVudD0iJytjdXJQcmljZV90b3RhbCsnIj4nK2N1clByaWNlX3RvdGFsKyc8L3NwYW4+JytjdXJQcmljZV9lYWNoX2Zvcm1hdHRlZCk7JCgiI3Byb2R1Y3RfaW5mb19wcmljZV9ibG9jayIpLmNzcygndmlzaWJpbGl0eScsJ3Zpc2libGUnKX19CmZ1bmN0aW9uIHRleHRDb3VudGVyKGZpZWxkLGNvdW50ZXIsbWF4bGltaXQsbGluZWNvdW50ZXIpe3ZhciBmaWVsZFdpZHRoPXBhcnNlSW50KGZpZWxkLm9mZnNldFdpZHRoKTt2YXIgY2hhcmNudD1maWVsZC52YWx1ZS5sZW5ndGg7dmFyIHBlcmNlbnRhZ2U9cGFyc2VJbnQoMTAwLSgobWF4bGltaXQtY2hhcmNudCkqMTAwKS9tYXhsaW1pdCk7aWYocGVyY2VudGFnZT49NDApe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvdW50ZXIpLnN0eWxlLmNvbG9yPScjRkZGRkZGJ31lbHNle2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvdW50ZXIpLnN0eWxlLmNvbG9yPScjNEY0RjRGJ30KaWYobGluZWNvdW50ZXIpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvdW50ZXIpLnN0eWxlLndpZHRoPXBhcnNlSW50KChmaWVsZFdpZHRoKnBlcmNlbnRhZ2UpLzEwMCkrInB4Ijtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsaW5lY291bnRlcikuc3R5bGUud2lkdGg9cGFyc2VJbnQoZmllbGRXaWR0aCkrInB4Ijtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb3VudGVyKS5pbm5lckhUTUw9Ijxub2JyPk1heDogIitwZXJjZW50YWdlKyIlIC0gKCIrY2hhcmNudCsiLyIrbWF4bGltaXQrIik8L25vYnI+In1lbHNle2lmKGNoYXJjbnQ+bWF4bGltaXQpe2ZpZWxkLnZhbHVlPWZpZWxkLnZhbHVlLnN1YnN0cmluZygwLG1heGxpbWl0KX1lbHNle2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvdW50ZXIpLnN0eWxlLndpZHRoPXBhcnNlSW50KChmaWVsZFdpZHRoKnBlcmNlbnRhZ2UpLzEwMCkrInB4Ijtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb3VudGVyKS5pbm5lckhUTUw9Ijxub2JyPk1heDogIitwZXJjZW50YWdlKyIlIC0gKCIrY2hhcmNudCsiLyIrbWF4bGltaXQrIik8L25vYnI+Ijtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb3VudGVyKS5zdHlsZVsiYmFja2dyb3VuZC1jb2xvciJdPSJyZ2IoODAlLCIrKDEwMC1wZXJjZW50YWdlKSsiJSwiKygxMDAtcGVyY2VudGFnZSkrIiUpIn19fQpmdW5jdGlvbiBzdWJtaXRfY29udmVydF9jYXJ0KCl7aWYoJCgiI2NhcnRfYWN0aW9uIikubGVuZ3RoPjApe2lmKHJmcUNhcnQpeyQoIiNjYXJ0X2FjdGlvbiIpLnZhbCgncmZxMmJ1eScpOyQoIiNjYXJ0X3F1YW50aXR5Iikuc3VibWl0KCl9ZWxzZXskKCIjY2FydF9hY3Rpb24iKS52YWwoJ2J1eTJyZnEnKTskKCIjY2FydF9xdWFudGl0eSIpLnN1Ym1pdCgpfQpyZXR1cm4hMH19CmZ1bmN0aW9uIHByaW50UmVjZWlwdCgpe3dpblc9d2luZG93Lm91dGVyV2lkdGg7d2luSD13aW5kb3cub3V0ZXJIZWlnaHQ7d2luWD13aW5kb3cuc2NyZWVuWDt3aW5ZPXdpbmRvdy5zY3JlZW5ZO3hQb3M9d2luWCsoKHdpblctcmVjZWlwdFcpLzIpO3lQb3M9d2luWSsoKHdpbkgtcmVjZWlwdEgpLzIpO3dpbmRvdy5vcGVuKHByaW50UmVjZWlwdF91cmwsJ3JlY2VpcHRfd2luZG93Jywnd2lkdGg9JytyZWNlaXB0VysnLGhlaWdodD0nK3JlY2VpcHRIKycsbG9jYXRpb249bm8sbWVudWJhcj1ubyxzdGF0dXM9bm8sdG9vbGJhcj1ubycpLm1vdmVUbyh4UG9zLHlQb3MpfQpmdW5jdGlvbiB3cml0ZVNlc3Npb25Db29raWUoY29va2llTmFtZSxjb29raWVWYWx1ZSl7ZG9jdW1lbnQuY29va2llPWVzY2FwZShjb29raWVOYW1lKSsiPSIrZXNjYXBlKGNvb2tpZVZhbHVlKSsiOyBwYXRoPS8ifQpmdW5jdGlvbiBnZXRDb29raWVWYWx1ZShjb29raWVOYW1lKXt2YXIgZXhwPW5ldyBSZWdFeHAoZXNjYXBlKGNvb2tpZU5hbWUpKyI9KFteO10rKSIpO2lmKGV4cC50ZXN0KGRvY3VtZW50LmNvb2tpZSsiOyIpKXtleHAuZXhlYyhkb2N1bWVudC5jb29raWUrIjsiKTtyZXR1cm4gdW5lc2NhcGUoUmVnRXhwLiQxKX1lbHNle3JldHVybiExfX0KZnVuY3Rpb24gZGVsZXRlQ29va2llKGNvb2tpZU5hbWUpe3JldHVybiBkb2N1bWVudC5jb29raWU9Y29va2llTmFtZSsnPTsgTWF4LUFnZT0tOTk5OTk5OTk7J30KZnVuY3Rpb24gdG9nZ2xlU2VhcmNoKCl7dmFyIHdpbmRvd1dpZHRoPSQod2luZG93KS53aWR0aCgpO2lmKHdpbmRvd1dpZHRoPDc2OCl7dmFyIG1vYmlsZVNlYXJjaD0kKCcubW9iaWxlLXNlYXJjaCcpO2lmKG1vYmlsZVNlYXJjaC5sZW5ndGg+MCl7aWYobW9iaWxlU2VhcmNoLmNzcygnZGlzcGxheScpPT09J25vbmUnKXttb2JpbGVTZWFyY2guY3NzKCdkaXNwbGF5JywnYmxvY2snKTttb2JpbGVTZWFyY2guY3NzKCdvcGFjaXR5JywxKX1lbHNle21vYmlsZVNlYXJjaC5jc3MoJ29wYWNpdHknLDApO3NldFRpbWVvdXQoZnVuY3Rpb24oKXttb2JpbGVTZWFyY2guY3NzKCdkaXNwbGF5Jywnbm9uZScpfSw1MDApfX19ZWxzZXt2YXIgc2VhcmNoSW5wdXQ9JCgnI3F1aWNrc2VhcmNoX2tleXdvcmRzJyk7dmFyIHNlYXJjaEJ1dHRvbj0kKCcucXVpY2tzZWFyY2gtYnV0dG9uJyk7dmFyIGhlYWRlclNlYXJjaD0kKCcjaGVhZGVyX3NlYXJjaCcpO2lmKHNlYXJjaElucHV0LmNzcygndmlzaWJpbGl0eScpPT09J2hpZGRlbicpe2hlYWRlclNlYXJjaC5jc3MoJ3dpZHRoJywnMjkwcHgnKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VhcmNoQnV0dG9uLmNzcygnd2lkdGgnLCc3N3B4Jyk7c2VhcmNoSW5wdXQuY3NzKCd2aXNpYmlsaXR5JywndmlzaWJsZScpO3NlYXJjaEJ1dHRvbi5jc3MoJ3Zpc2liaWxpdHknLCd2aXNpYmxlJyk7c2VhcmNoSW5wdXQuY3NzKCdvcGFjaXR5JywnMScpO3NlYXJjaEJ1dHRvbi5jc3MoJ29wYWNpdHknLCcxJyl9LDUwMCl9ZWxzZXtoZWFkZXJTZWFyY2guY3NzKCd3aWR0aCcsJzc1cHgnKTtzZWFyY2hCdXR0b24uY3NzKCd3aWR0aCcsJzAnKTtzZWFyY2hJbnB1dC5jc3MoJ3Zpc2liaWxpdHknLCdoaWRkZW4nKTtzZWFyY2hCdXR0b24uY3NzKCd2aXNpYmlsaXR5JywnaGlkZGVuJyk7c2VhcmNoSW5wdXQuY3NzKCdvcGFjaXR5JywnMCcpO3NlYXJjaEJ1dHRvbi5jc3MoJ29wYWNpdHknLCcwJyl9CmxldCBxdWlja1NlYXJjaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVpY2tzZWFyY2gnKTtxdWlja1NlYXJjaC5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyl9fQpmdW5jdGlvbiB0b2dnbGVTZWFyY2hNb2JpbGUoKXt2YXIgbW9iaWxlU2VhcmNoPSQoJy5tb2JpbGUtc2VhcmNoLW1vYmlsZScpO2lmKG1vYmlsZVNlYXJjaC5sZW5ndGg+MCl7aWYobW9iaWxlU2VhcmNoLmNzcygnZGlzcGxheScpPT09J25vbmUnKXttb2JpbGVTZWFyY2guY3NzKCdkaXNwbGF5JywnYmxvY2snKTttb2JpbGVTZWFyY2guY3NzKCdvcGFjaXR5JywxKX1lbHNle21vYmlsZVNlYXJjaC5jc3MoJ29wYWNpdHknLDApO3NldFRpbWVvdXQoZnVuY3Rpb24oKXttb2JpbGVTZWFyY2guY3NzKCdkaXNwbGF5Jywnbm9uZScpfSw1MDApfX19CnZhciBtb2JpbGVIZWFkZXJJc1Nob3dpbmc9ITE7ZnVuY3Rpb24gc2V0SGVhZGVyKCl7dmFyIHNjcm9sbFRvcD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO3ZhciBoZWFkZXJXcmFwcGVyPSQoJyNoZWFkZXJXcmFwcGVyJyk7dmFyIHJlZ3VsYXJIZWFkZXI9JCgnI2hlYWRlcicpO3ZhciBtb2JpbGVIZWFkZXI9JCgnI2hlYWRlci1tb2JpbGUnKTt2YXIgd2luZG93V2lkdGg9JCh3aW5kb3cpLndpZHRoKCk7aWYod2luZG93V2lkdGg8OTkyKXtpZihtb2JpbGVIZWFkZXJJc1Nob3dpbmc9PT0hMSl7cmVndWxhckhlYWRlci5jc3Moe29wYWNpdHk6MCx2aXNpYmlsaXR5OiJoaWRkZW4ifSk7c2V0VGltZW91dChmdW5jdGlvbigpe2hlYWRlcldyYXBwZXIuY3NzKCdiYWNrZ3JvdW5kJywnI2ZmZmZmZicpO21vYmlsZUhlYWRlci5jc3MoJ2Rpc3BsYXknLCdibG9jaycpO3JlZ3VsYXJIZWFkZXIuY3NzKCdkaXNwbGF5Jywnbm9uZScpO21vYmlsZUhlYWRlci5jc3Moe29wYWNpdHk6MSx2aXNpYmlsaXR5OiJ2aXNpYmxlIixoZWlnaHQ6IjY2cHgifSk7JCgnI2hlYWRlckxlZnQtbW9iaWxlJykuY3NzKCdoZWlnaHQnLCdhdXRvJyk7JCgnI2hlYWRlclJpZ2h0LW1vYmlsZScpLmNzcygnaGVpZ2h0JywnYXV0bycpfSwzMDApO21vYmlsZUhlYWRlcklzU2hvd2luZz0hMH19ZWxzZXtpZihzY3JvbGxUb3AhPT0wKXtpZihtb2JpbGVIZWFkZXJJc1Nob3dpbmc9PT0hMSl7cmVndWxhckhlYWRlci5jc3Moe29wYWNpdHk6MCx2aXNpYmlsaXR5OiJoaWRkZW4ifSk7c2V0VGltZW91dChmdW5jdGlvbigpe2hlYWRlcldyYXBwZXIuY3NzKCdiYWNrZ3JvdW5kJywnI2ZmZmZmZicpO21vYmlsZUhlYWRlci5jc3MoJ2Rpc3BsYXknLCdibG9jaycpO3JlZ3VsYXJIZWFkZXIuY3NzKCdkaXNwbGF5Jywnbm9uZScpO21vYmlsZUhlYWRlci5jc3Moe29wYWNpdHk6MSx2aXNpYmlsaXR5OiJ2aXNpYmxlIixoZWlnaHQ6IjY2cHgifSk7JCgnI2hlYWRlckxlZnQtbW9iaWxlJykuY3NzKCdoZWlnaHQnLCdhdXRvJyk7JCgnI2hlYWRlclJpZ2h0LW1vYmlsZScpLmNzcygnaGVpZ2h0JywnYXV0bycpfSwzMDApO21vYmlsZUhlYWRlcklzU2hvd2luZz0hMH19ZWxzZXtpZihtb2JpbGVIZWFkZXJJc1Nob3dpbmc9PT0hMCl7bW9iaWxlSGVhZGVyLmNzcyh7b3BhY2l0eTowLHZpc2liaWxpdHk6ImhpZGRlbiJ9KTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aGVhZGVyV3JhcHBlci5jc3MoJ2JhY2tncm91bmQnLCd0cmFuc3BhcmVudCcpO3JlZ3VsYXJIZWFkZXIuY3NzKCdkaXNwbGF5JywnYmxvY2snKTttb2JpbGVIZWFkZXIuY3NzKCdkaXNwbGF5Jywnbm9uZScpO3JlZ3VsYXJIZWFkZXIuY3NzKHtvcGFjaXR5OjEsdmlzaWJpbGl0eToidmlzaWJsZSIsaGVpZ2h0OiI2NnB4In0pOyQoJyNoZWFkZXJMZWZ0LW1vYmlsZScpLmNzcygnaGVpZ2h0JywnMHB4Jyk7JCgnI2hlYWRlclJpZ2h0LW1vYmlsZScpLmNzcygnaGVpZ2h0JywnMHB4Jyl9LDEwMCk7bW9iaWxlSGVhZGVySXNTaG93aW5nPSExfX19fQpmdW5jdGlvbiBzZXRDdXJyZW50WWVhckluRm9vdGVyKCl7dmFyIGN1cnJlbnRZZWFyPSQoJyNmb290ZXItY3VycmVudC15ZWFyJyk7aWYoY3VycmVudFllYXIubGVuZ3RoPjApe2N1cnJlbnRZZWFyLnRleHQobmV3IERhdGUoKS5nZXRGdWxsWWVhcigpKX19CmZ1bmN0aW9uIGhhbmRsZUNhdGVnb3J5TGlzdGluZ0l0ZW1Ib3Zlcigpe3ZhciBjYXRlZ29yeUxpc3RpbmdJdGVtcz0kKCcuY2F0TGlzdGluZ0JveCcpO2lmKGNhdGVnb3J5TGlzdGluZ0l0ZW1zLmxlbmd0aD4wKXtjYXRlZ29yeUxpc3RpbmdJdGVtcy5lYWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS5ob3ZlcihmdW5jdGlvbigpe3ZhciBpY29uPSQodGhpcykuZmluZCgnaW1nLmltZy1yZXNwb25zaXZlJyk7dmFyIGN1cnJlbnRTcmM9aWNvbi5hdHRyKCdzcmMnKTtpZighY3VycmVudFNyYy5pbmNsdWRlcygnX2hvdmVyLnBuZycpKXt2YXIgbmV3U3JjPWN1cnJlbnRTcmMuc2xpY2UoMCwtNCkrIl9ob3Zlci5wbmciO2ljb24uYXR0cignc3JjJyxuZXdTcmMpfX0sZnVuY3Rpb24oKXt2YXIgaWNvbj0kKHRoaXMpLmZpbmQoJ2ltZy5pbWctcmVzcG9uc2l2ZScpO3ZhciBjdXJyZW50U3JjPWljb24uYXR0cignc3JjJyk7aWYoY3VycmVudFNyYy5pbmNsdWRlcygnX2hvdmVyLnBuZycpKXt2YXIgbmV3U3JjPWN1cnJlbnRTcmMuc2xpY2UoMCwtMTApKyIucG5nIjtpY29uLmF0dHIoJ3NyYycsbmV3U3JjKX19KX0pfX0KZnVuY3Rpb24gcmVtb3ZlUGFnZVNlY3Rpb25CcmVha3MoKXt2YXIgcGFnZVNlY3Rpb25Sb3dzPSQoJy5wYWdlLXNlY3Rpb24gLnJvdycpO2lmKHBhZ2VTZWN0aW9uUm93cy5sZW5ndGg+MCl7cGFnZVNlY3Rpb25Sb3dzLmVhY2goZnVuY3Rpb24oKXt2YXIgY2hpbGRyZW49JCh0aGlzKS5jaGlsZHJlbigpO2Zvcih2YXIgY2hpbGQgaW4gY2hpbGRyZW4pe2lmKGNoaWxkcmVuLmhhc093blByb3BlcnR5KGNoaWxkKSl7aWYoY2hpbGRyZW5bY2hpbGRdLm5vZGVOYW1lPT09IkJSIil7JChjaGlsZHJlbltjaGlsZF0pLnJlbW92ZSgpfX19fSl9fQpmdW5jdGlvbiBzZXRVcEhvdmVyT25IZWFkZXJJY29ucygpe3ZhciBwb3J0Zm9saW9JbWFnZT0kKCdpbWdbc3JjPSJpbWFnZXMvaWNvbnMvcG9ydGZvbGlvLWljb24ucG5nIl0nKTt2YXIgc2VhcmNoSW1hZ2U9JCgnaW1nW3NyYz0iaW1hZ2VzL2ljb25zL3NlYXJjaC1pY29uLnBuZyJdJyk7cG9ydGZvbGlvSW1hZ2UuaG92ZXIoZnVuY3Rpb24oKXtwb3J0Zm9saW9JbWFnZS5hdHRyKCdzcmMnLCdpbWFnZXMvaWNvbnMvcG9ydGZvbGlvLWljb25faG92ZXIucG5nJyl9LGZ1bmN0aW9uKCl7cG9ydGZvbGlvSW1hZ2UuYXR0cignc3JjJywnaW1hZ2VzL2ljb25zL3BvcnRmb2xpby1pY29uLnBuZycpfSk7c2VhcmNoSW1hZ2UuaG92ZXIoZnVuY3Rpb24oKXtzZWFyY2hJbWFnZS5hdHRyKCdzcmMnLCdpbWFnZXMvaWNvbnMvc2VhcmNoLWljb25faG92ZXIucG5nJyl9LGZ1bmN0aW9uKCl7c2VhcmNoSW1hZ2UuYXR0cignc3JjJywnaW1hZ2VzL2ljb25zL3NlYXJjaC1pY29uLnBuZycpfSl9CmZ1bmN0aW9uIG9wZW5TZWFyY2goKXtsZXQgcXVpY2tTZWFyY2g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1aWNrc2VhcmNoJyk7aWYoIXF1aWNrU2VhcmNoLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpKXt2YXIgc2VhcmNoSW5wdXQ9JCgnI3F1aWNrc2VhcmNoX2tleXdvcmRzJyk7dmFyIHNlYXJjaEJ1dHRvbj0kKCcucXVpY2tzZWFyY2gtYnV0dG9uJyk7dmFyIGhlYWRlclNlYXJjaD0kKCcjaGVhZGVyX3NlYXJjaCcpO2lmKHNlYXJjaElucHV0LmNzcygndmlzaWJpbGl0eScpPT09J2hpZGRlbicpe2hlYWRlclNlYXJjaC5jc3MoJ3dpZHRoJywnMjkwcHgnKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VhcmNoQnV0dG9uLmNzcygnd2lkdGgnLCc3N3B4Jyk7c2VhcmNoSW5wdXQuY3NzKCd2aXNpYmlsaXR5JywndmlzaWJsZScpO3NlYXJjaEJ1dHRvbi5jc3MoJ3Zpc2liaWxpdHknLCd2aXNpYmxlJyk7c2VhcmNoSW5wdXQuY3NzKCdvcGFjaXR5JywnMScpO3NlYXJjaEJ1dHRvbi5jc3MoJ29wYWNpdHknLCcxJyl9LDUwMCl9CnF1aWNrU2VhcmNoLmNsYXNzTGlzdC5hZGQoJ29wZW4nKX19CmZ1bmN0aW9uIHJlc3BvbnNpZnlJZnJhbWVzKCl7dmFyIGlmcmFtZXM9JCgnI2Jsb2ctbWFpbi1jb250ZW50LWNvbnRhaW5lciBpZnJhbWUnKTtpZihpZnJhbWVzLmxlbmd0aD4wKXtpZnJhbWVzLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLmFkZENsYXNzKCdlbWJlZC1yZXNwb25zaXZlLWl0ZW0nKTskKHRoaXMpLndyYXAoJzxkaXYgY2xhc3M9InJlc3BvbnNpdmUtaWZyYW1lIj48ZGl2IGNsYXNzPSJlbWJlZC1yZXNwb25zaXZlIGVtYmVkLXJlc3BvbnNpdmUtMTZieTkiPjwvZGl2PjwvZGl2PicpfSl9fQpmdW5jdGlvbiB1cGRhdGVMYXlvdXRPZlJGUUZvcm1JdGVtcygpe3ZhciBpbnRlcmVzdGVkSW49JCgnI3JmZl9kYmZvcm1zX3JmcSAjcmZpX2ludGVyZXN0ZWRfaW4nKTtpZihpbnRlcmVzdGVkSW4ubGVuZ3RoPjApe3ZhciBvcHRpb25EaXZzPWludGVyZXN0ZWRJbi5maW5kKCcucmZfdmFsdWUgPiBkaXYnKTtvcHRpb25EaXZzLndyYXBBbGwoJzxkaXYgY2xhc3M9InJvdyI+PC9kaXY+Jyk7b3B0aW9uRGl2cy5lYWNoKGZ1bmN0aW9uKGksZSl7JChlKS53cmFwKCc8ZGl2IGNsYXNzPSJjb2wtc20tMTIgY29sLW1kLTItNCI+PC9kaXY+Jyl9KX19O3ZhciBrZXlTdHI9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IjtmdW5jdGlvbiBlbmNvZGU2NChpbnB1dCl7aW5wdXQ9ZXNjYXBlKGlucHV0KTt2YXIgb3V0cHV0PSIiO3ZhciBjaHIxLGNocjIsY2hyMz0iIjt2YXIgZW5jMSxlbmMyLGVuYzMsZW5jND0iIjt2YXIgaT0wO2Rve2NocjE9aW5wdXQuY2hhckNvZGVBdChpKyspO2NocjI9aW5wdXQuY2hhckNvZGVBdChpKyspO2NocjM9aW5wdXQuY2hhckNvZGVBdChpKyspO2VuYzE9Y2hyMT4+MjtlbmMyPSgoY2hyMSYzKTw8NCl8KGNocjI+PjQpO2VuYzM9KChjaHIyJjE1KTw8Mil8KGNocjM+PjYpO2VuYzQ9Y2hyMyY2MztpZihpc05hTihjaHIyKSl7ZW5jMz1lbmM0PTY0fWVsc2UgaWYoaXNOYU4oY2hyMykpe2VuYzQ9NjR9Cm91dHB1dD1vdXRwdXQra2V5U3RyLmNoYXJBdChlbmMxKStrZXlTdHIuY2hhckF0KGVuYzIpK2tleVN0ci5jaGFyQXQoZW5jMykra2V5U3RyLmNoYXJBdChlbmM0KTtjaHIxPWNocjI9Y2hyMz0iIjtlbmMxPWVuYzI9ZW5jMz1lbmM0PSIifXdoaWxlKGk8aW5wdXQubGVuZ3RoKTtyZXR1cm4gb3V0cHV0fQpmdW5jdGlvbiBkZWNvZGU2NChpbnB1dCl7dmFyIG91dHB1dD0iIjt2YXIgY2hyMSxjaHIyLGNocjM9IiI7dmFyIGVuYzEsZW5jMixlbmMzLGVuYzQ9IiI7dmFyIGk9MDt2YXIgYmFzZTY0dGVzdD0vW15BLVphLXowLTlcK1wvXD1dL2c7aWYoYmFzZTY0dGVzdC5leGVjKGlucHV0KSl7YWxlcnQoIlRoZXJlIHdlcmUgaW52YWxpZCBiYXNlNjQgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgdGV4dC5cbiIrIlZhbGlkIGJhc2U2NCBjaGFyYWN0ZXJzIGFyZSBBLVosIGEteiwgMC05LCAnKycsICcvJyxhbmQgJz0nXG4iKyJFeHBlY3QgZXJyb3JzIGluIGRlY29kaW5nLiIpfQppbnB1dD1pbnB1dC5yZXBsYWNlKC9bXkEtWmEtejAtOVwrXC9cPV0vZywiIik7ZG97ZW5jMT1rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7ZW5jMj1rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7ZW5jMz1rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7ZW5jND1rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7Y2hyMT0oZW5jMTw8Mil8KGVuYzI+PjQpO2NocjI9KChlbmMyJjE1KTw8NCl8KGVuYzM+PjIpO2NocjM9KChlbmMzJjMpPDw2KXxlbmM0O291dHB1dD1vdXRwdXQrU3RyaW5nLmZyb21DaGFyQ29kZShjaHIxKTtpZihlbmMzIT02NCl7b3V0cHV0PW91dHB1dCtTdHJpbmcuZnJvbUNoYXJDb2RlKGNocjIpfQppZihlbmM0IT02NCl7b3V0cHV0PW91dHB1dCtTdHJpbmcuZnJvbUNoYXJDb2RlKGNocjMpfQpjaHIxPWNocjI9Y2hyMz0iIjtlbmMxPWVuYzI9ZW5jMz1lbmM0PSIifXdoaWxlKGk8aW5wdXQubGVuZ3RoKTtyZXR1cm4gdW5lc2NhcGUob3V0cHV0KX07ZnVuY3Rpb24gdW5zZXJpYWxpemUoZGF0YSl7dmFyICRnbG9iYWw9KHR5cGVvZiB3aW5kb3chPT0ndW5kZWZpbmVkJz93aW5kb3c6Z2xvYmFsKQp2YXIgdXRmOE92ZXJoZWFkPWZ1bmN0aW9uKHN0cil7dmFyIHM9c3RyLmxlbmd0aApmb3IodmFyIGk9c3RyLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgY29kZT1zdHIuY2hhckNvZGVBdChpKQppZihjb2RlPjB4N2YmJmNvZGU8PTB4N2ZmKXtzKyt9ZWxzZSBpZihjb2RlPjB4N2ZmJiZjb2RlPD0weGZmZmYpe3MrPTJ9CmlmKGNvZGU+PTB4REMwMCYmY29kZTw9MHhERkZGKXtpLS19fQpyZXR1cm4gcy0xfQp2YXIgZXJyb3I9ZnVuY3Rpb24odHlwZSxtc2csZmlsZW5hbWUsbGluZSl7dGhyb3cgbmV3ICRnbG9iYWxbdHlwZV0obXNnLGZpbGVuYW1lLGxpbmUpfQp2YXIgcmVhZFVudGlsPWZ1bmN0aW9uKGRhdGEsb2Zmc2V0LHN0b3BjaHIpe3ZhciBpPTIKdmFyIGJ1Zj1bXQp2YXIgY2hyPWRhdGEuc2xpY2Uob2Zmc2V0LG9mZnNldCsxKQp3aGlsZShjaHIhPT1zdG9wY2hyKXtpZigoaStvZmZzZXQpPmRhdGEubGVuZ3RoKXtlcnJvcignRXJyb3InLCdJbnZhbGlkJyl9CmJ1Zi5wdXNoKGNocikKY2hyPWRhdGEuc2xpY2Uob2Zmc2V0KyhpLTEpLG9mZnNldCtpKQppKz0xfQpyZXR1cm5bYnVmLmxlbmd0aCxidWYuam9pbignJyldfQp2YXIgcmVhZENocnM9ZnVuY3Rpb24oZGF0YSxvZmZzZXQsbGVuZ3RoKXt2YXIgaSxjaHIsYnVmCmJ1Zj1bXQpmb3IoaT0wO2k8bGVuZ3RoO2krKyl7Y2hyPWRhdGEuc2xpY2Uob2Zmc2V0KyhpLTEpLG9mZnNldCtpKQpidWYucHVzaChjaHIpCmxlbmd0aC09dXRmOE92ZXJoZWFkKGNocil9CnJldHVybltidWYubGVuZ3RoLGJ1Zi5qb2luKCcnKV19CmZ1bmN0aW9uIF91bnNlcmlhbGl6ZShkYXRhLG9mZnNldCl7dmFyIGR0eXBlCnZhciBkYXRhb2Zmc2V0CnZhciBrZXlhbmRjaHJzCnZhciBrZXlzCnZhciBjb250aWcKdmFyIGxlbmd0aAp2YXIgYXJyYXkKdmFyIHJlYWRkYXRhCnZhciByZWFkRGF0YQp2YXIgY2NvdW50CnZhciBzdHJpbmdsZW5ndGgKdmFyIGkKdmFyIGtleQp2YXIga3Byb3BzCnZhciBrY2hycwp2YXIgdnByb3BzCnZhciB2Y2hycwp2YXIgdmFsdWUKdmFyIGNocnM9MAp2YXIgdHlwZWNvbnZlcnQ9ZnVuY3Rpb24oeCl7cmV0dXJuIHh9CmlmKCFvZmZzZXQpe29mZnNldD0wfQpkdHlwZT0oZGF0YS5zbGljZShvZmZzZXQsb2Zmc2V0KzEpKS50b0xvd2VyQ2FzZSgpCmRhdGFvZmZzZXQ9b2Zmc2V0KzIKc3dpdGNoKGR0eXBlKXtjYXNlICdpJzp0eXBlY29udmVydD1mdW5jdGlvbih4KXtyZXR1cm4gcGFyc2VJbnQoeCwxMCl9CnJlYWREYXRhPXJlYWRVbnRpbChkYXRhLGRhdGFvZmZzZXQsJzsnKQpjaHJzPXJlYWREYXRhWzBdCnJlYWRkYXRhPXJlYWREYXRhWzFdCmRhdGFvZmZzZXQrPWNocnMrMQpicmVhawpjYXNlICdiJzp0eXBlY29udmVydD1mdW5jdGlvbih4KXtyZXR1cm4gcGFyc2VJbnQoeCwxMCkhPT0wfQpyZWFkRGF0YT1yZWFkVW50aWwoZGF0YSxkYXRhb2Zmc2V0LCc7JykKY2hycz1yZWFkRGF0YVswXQpyZWFkZGF0YT1yZWFkRGF0YVsxXQpkYXRhb2Zmc2V0Kz1jaHJzKzEKYnJlYWsKY2FzZSAnZCc6dHlwZWNvbnZlcnQ9ZnVuY3Rpb24oeCl7cmV0dXJuIHBhcnNlRmxvYXQoeCl9CnJlYWREYXRhPXJlYWRVbnRpbChkYXRhLGRhdGFvZmZzZXQsJzsnKQpjaHJzPXJlYWREYXRhWzBdCnJlYWRkYXRhPXJlYWREYXRhWzFdCmRhdGFvZmZzZXQrPWNocnMrMQpicmVhawpjYXNlICduJzpyZWFkZGF0YT1udWxsCmJyZWFrCmNhc2UgJ3MnOmNjb3VudD1yZWFkVW50aWwoZGF0YSxkYXRhb2Zmc2V0LCc6JykKY2hycz1jY291bnRbMF0Kc3RyaW5nbGVuZ3RoPWNjb3VudFsxXQpkYXRhb2Zmc2V0Kz1jaHJzKzIKcmVhZERhdGE9cmVhZENocnMoZGF0YSxkYXRhb2Zmc2V0KzEscGFyc2VJbnQoc3RyaW5nbGVuZ3RoLDEwKSkKY2hycz1yZWFkRGF0YVswXQpyZWFkZGF0YT1yZWFkRGF0YVsxXQpkYXRhb2Zmc2V0Kz1jaHJzKzIKaWYoY2hycyE9PXBhcnNlSW50KHN0cmluZ2xlbmd0aCwxMCkmJmNocnMhPT1yZWFkZGF0YS5sZW5ndGgpe2Vycm9yKCdTeW50YXhFcnJvcicsJ1N0cmluZyBsZW5ndGggbWlzbWF0Y2gnKX0KYnJlYWsKY2FzZSAnYSc6cmVhZGRhdGE9e30Ka2V5YW5kY2hycz1yZWFkVW50aWwoZGF0YSxkYXRhb2Zmc2V0LCc6JykKY2hycz1rZXlhbmRjaHJzWzBdCmtleXM9a2V5YW5kY2hyc1sxXQpkYXRhb2Zmc2V0Kz1jaHJzKzIKbGVuZ3RoPXBhcnNlSW50KGtleXMsMTApCmNvbnRpZz0hMApmb3IoaT0wO2k8bGVuZ3RoO2krKyl7a3Byb3BzPV91bnNlcmlhbGl6ZShkYXRhLGRhdGFvZmZzZXQpCmtjaHJzPWtwcm9wc1sxXQprZXk9a3Byb3BzWzJdCmRhdGFvZmZzZXQrPWtjaHJzCnZwcm9wcz1fdW5zZXJpYWxpemUoZGF0YSxkYXRhb2Zmc2V0KQp2Y2hycz12cHJvcHNbMV0KdmFsdWU9dnByb3BzWzJdCmRhdGFvZmZzZXQrPXZjaHJzCmlmKGtleSE9PWkpe2NvbnRpZz0hMX0KcmVhZGRhdGFba2V5XT12YWx1ZX0KaWYoY29udGlnKXthcnJheT1uZXcgQXJyYXkobGVuZ3RoKQpmb3IoaT0wO2k8bGVuZ3RoO2krKyl7YXJyYXlbaV09cmVhZGRhdGFbaV19CnJlYWRkYXRhPWFycmF5fQpkYXRhb2Zmc2V0Kz0xCmJyZWFrCmRlZmF1bHQ6ZXJyb3IoJ1N5bnRheEVycm9yJywnVW5rbm93biAvIFVuaGFuZGxlZCBkYXRhIHR5cGUocyk6ICcrZHR5cGUpCmJyZWFrfQpyZXR1cm5bZHR5cGUsZGF0YW9mZnNldC1vZmZzZXQsdHlwZWNvbnZlcnQocmVhZGRhdGEpXX0KcmV0dXJuIF91bnNlcmlhbGl6ZSgoZGF0YSsnJyksMClbMl19CmZ1bmN0aW9uIHNlcmlhbGl6ZShtaXhlZFZhbHVlKXt2YXIgdmFsLGtleSxva2V5CnZhciBrdHlwZT0nJwp2YXIgdmFscz0nJwp2YXIgY291bnQ9MAp2YXIgX3V0ZjhTaXplPWZ1bmN0aW9uKHN0cil7dmFyIHNpemU9MAp2YXIgaT0wCnZhciBsPXN0ci5sZW5ndGgKdmFyIGNvZGU9JycKZm9yKGk9MDtpPGw7aSsrKXtjb2RlPXN0ci5jaGFyQ29kZUF0KGkpCmlmKGNvZGU8MHgwMDgwKXtzaXplKz0xfWVsc2UgaWYoY29kZTwweDA4MDApe3NpemUrPTJ9ZWxzZXtzaXplKz0zfX0KcmV0dXJuIHNpemV9CnZhciBfZ2V0VHlwZT1mdW5jdGlvbihpbnApe3ZhciBtYXRjaAp2YXIga2V5CnZhciBjb25zCnZhciB0eXBlcwp2YXIgdHlwZT10eXBlb2YgaW5wCmlmKHR5cGU9PT0nb2JqZWN0JyYmIWlucCl7cmV0dXJuJ251bGwnfQppZih0eXBlPT09J29iamVjdCcpe2lmKCFpbnAuY29uc3RydWN0b3Ipe3JldHVybidvYmplY3QnfQpjb25zPWlucC5jb25zdHJ1Y3Rvci50b1N0cmluZygpCm1hdGNoPWNvbnMubWF0Y2goLyhcdyspXCgvKQppZihtYXRjaCl7Y29ucz1tYXRjaFsxXS50b0xvd2VyQ2FzZSgpfQp0eXBlcz1bJ2Jvb2xlYW4nLCdudW1iZXInLCdzdHJpbmcnLCdhcnJheSddCmZvcihrZXkgaW4gdHlwZXMpe2lmKGNvbnM9PT10eXBlc1trZXldKXt0eXBlPXR5cGVzW2tleV0KYnJlYWt9fX0KcmV0dXJuIHR5cGV9CnZhciB0eXBlPV9nZXRUeXBlKG1peGVkVmFsdWUpCnN3aXRjaCh0eXBlKXtjYXNlICdmdW5jdGlvbic6dmFsPScnCmJyZWFrCmNhc2UgJ2Jvb2xlYW4nOnZhbD0nYjonKyhtaXhlZFZhbHVlPycxJzonMCcpCmJyZWFrCmNhc2UgJ251bWJlcic6dmFsPShNYXRoLnJvdW5kKG1peGVkVmFsdWUpPT09bWl4ZWRWYWx1ZT8naSc6J2QnKSsnOicrbWl4ZWRWYWx1ZQpicmVhawpjYXNlICdzdHJpbmcnOnZhbD0nczonK191dGY4U2l6ZShtaXhlZFZhbHVlKSsnOiInK21peGVkVmFsdWUrJyInCmJyZWFrCmNhc2UgJ2FycmF5JzpjYXNlICdvYmplY3QnOnZhbD0nYScKZm9yKGtleSBpbiBtaXhlZFZhbHVlKXtpZihtaXhlZFZhbHVlLmhhc093blByb3BlcnR5KGtleSkpe2t0eXBlPV9nZXRUeXBlKG1peGVkVmFsdWVba2V5XSkKaWYoa3R5cGU9PT0nZnVuY3Rpb24nKXtjb250aW51ZX0Kb2tleT0oa2V5Lm1hdGNoKC9eWzAtOV0rJC8pP3BhcnNlSW50KGtleSwxMCk6a2V5KQp2YWxzKz1zZXJpYWxpemUob2tleSkrc2VyaWFsaXplKG1peGVkVmFsdWVba2V5XSkKY291bnQrK319CnZhbCs9JzonK2NvdW50Kyc6eycrdmFscysnfScKYnJlYWsKY2FzZSAndW5kZWZpbmVkJzpkZWZhdWx0OnZhbD0nTicKYnJlYWt9CmlmKHR5cGUhPT0nb2JqZWN0JyYmdHlwZSE9PSdhcnJheScpe3ZhbCs9JzsnfQpyZXR1cm4gdmFsfTt2YXIgcmVzZXRQYWdlPSEwO3ZhciBhZGFwdGl2ZT0hMTt2YXIgY291bnQ9MTt2YXIgcHJldkNvdW50PTA7dmFyIGJhY2s9ITE7dmFyIGN1c3RvbVRhYnNFbmFibGVkPSExO3ZhciByZXNwb25zaXZlUGFyYW1ldGVycz0nJzt2YXIgZ3JpZFBhcmFtZXRlcnM9Jyc7dmFyIGJyZWFrUG9pbnQ9Jyc7dmFyIGJveGVzPScnO3ZhciBjaGFuZ2VkPSExO3ZhciBtb3ZlZD0hMTt2YXIgbXVsdGlwbGVGYWNldGVkU2VhcmNoPSExO3ZhciBwYWdlSGlzdG9yeT1uZXcgQXJyYXk7dmFyIGluZGV4PS0xO3ZhciBmYWNldGVkU2VhcmNoTXVsdGlwbGVDb3VudD0xMDt2YXIgdW53cmFwcGVkUGFyYW1ldGVyczt2YXIgcmVkaXJlY3RJZk9uZVByb2R1Y3Q9ITE7ZnVuY3Rpb24gY2hlY2tQcm9kdWN0TGlzdGluZ1N0YXRlKGhhc0NvbnRlbnQpe3ZhciAkd2lkdGg9JCh3aW5kb3cpLndpZHRoKCk7aWYoJHdpZHRoPDEyOTMpe2lmKG1vdmVkKXskKCcjcHJvZHVjdF9ib3hlc19tb3ZlZCcpLnNob3coKTskKCcjcHJvZHVjdF90YWJsZV9tb3ZlZCcpLmhpZGUoKTskKCcjcHJvZHVjdGJveGVzJykuaGlkZSgpOyQoJyNwcm9kdWN0dGFibGUnKS5oaWRlKCk7aWYoaGFzQ29udGVudCl7JCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe30sMjApfX1lbHNleyQoJyNwcm9kdWN0X2JveGVzX21vdmVkJykuaGlkZSgpOyQoJyNwcm9kdWN0X3RhYmxlX21vdmVkJykuaGlkZSgpOyQoJyNwcm9kdWN0Ym94ZXMnKS5zaG93KCk7JCgnI3Byb2R1Y3R0YWJsZScpLmhpZGUoKTtpZihoYXNDb250ZW50KXskKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7fSwyMCl9fX1lbHNle2lmKG1vdmVkKXskKCcjcHJvZHVjdF9ib3hlc19tb3ZlZCcpLmhpZGUoKTskKCcjcHJvZHVjdF90YWJsZV9tb3ZlZCcpLnNob3coKTskKCcjcHJvZHVjdGJveGVzJykuaGlkZSgpOyQoJyNwcm9kdWN0dGFibGUnKS5oaWRlKCk7aWYoaGFzQ29udGVudCl7JCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe30sMjApfX1lbHNleyQoJyNwcm9kdWN0X2JveGVzX21vdmVkJykuaGlkZSgpOyQoJyNwcm9kdWN0X3RhYmxlX21vdmVkJykuaGlkZSgpOyQoJyNwcm9kdWN0Ym94ZXMnKS5oaWRlKCk7JCgnI3Byb2R1Y3R0YWJsZScpLnNob3coKTtpZihoYXNDb250ZW50KXskKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7fSwyMCl9fX0KaWYoJHdpZHRoPjc2OCl7dmFyIG9iaj0kKCIubXVsdGlwbGUtZmFjZXRlZC1saW5rIikubGVuZ3RoPjE/JCgiLm11bHRpcGxlLWZhY2V0ZWQtbGluayIpOiQoIi5mYWNldGVkLWxpbmsiKTt2YXIgdmFyaWFibGVIZWlnaHQ9KChvYmouaGVpZ2h0KCkpKmZhY2V0ZWRTZWFyY2hNdWx0aXBsZUNvdW50KSsncHgnO29iai5jc3MoeydtYXgtaGVpZ2h0Jzp2YXJpYWJsZUhlaWdodH0pO3ZhciBoZWlnaHQsdmFsdWVIZWlnaHQ7aWYoJCgnLmZpbHRlcmNvbHVtbicpLmxlbmd0aD4wKXt2YWx1ZUhlaWdodD0kKCJhLmZhY2V0ZWQtbGluayIpLmhlaWdodCgpKzM7JCgnLmZpbHRlcmNvbHVtbicpLmVhY2goZnVuY3Rpb24oKXtpZihmYWNldGVkU2VhcmNoTXVsdGlwbGVDb3VudDwkKHRoaXMpLmNoaWxkcmVuKCkuY2hpbGRyZW4oKS5sZW5ndGgpe2hlaWdodD1mYWNldGVkU2VhcmNoTXVsdGlwbGVDb3VudCp2YWx1ZUhlaWdodH1lbHNle2hlaWdodD0kKHRoaXMpLmNoaWxkcmVuKCkuY2hpbGRyZW4oKS5sZW5ndGgqdmFsdWVIZWlnaHR9CmlmKCQodGhpcykuY2hpbGRyZW4oKS5oYXNDbGFzcygnZmFjZXRlZC1jb2x1bW5zJykpeyQodGhpcykuY3NzKHsnaGVpZ2h0JzpoZWlnaHQqMisncHgnLCdtYXgtaGVpZ2h0JzpoZWlnaHQqMisncHgnfSl9ZWxzZXskKHRoaXMpLmNzcyh7J2hlaWdodCc6aGVpZ2h0KydweCcsJ21heC1oZWlnaHQnOmhlaWdodCsncHgnfSl9fSl9ZWxzZSBpZigkKCcubXVsdGlwbGUtZmFjZXRlZC1saW5rJykubGVuZ3RoPjApe3ZhbHVlSGVpZ2h0PSQoImEubXVsdGlwbGUtZmFjZXRlZC1saW5rIikuaGVpZ2h0KCkrMzskKCcubXVsdGlwbGVfZmFjZXRlZF92YXJpYWJsZScpLmVhY2goZnVuY3Rpb24oKXtoZWlnaHQ9MDtpZihmYWNldGVkU2VhcmNoTXVsdGlwbGVDb3VudDwkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoKXtoZWlnaHQ9ZmFjZXRlZFNlYXJjaE11bHRpcGxlQ291bnQqdmFsdWVIZWlnaHQ7aGVpZ2h0Kz0xMDskKHRoaXMpLmNzcyh7J2hlaWdodCc6aGVpZ2h0KydweCcsJ21heC1oZWlnaHQnOmhlaWdodCsncHgnfSl9ZWxzZXtoZWlnaHQ9JCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCp2YWx1ZUhlaWdodC8yO2hlaWdodCs9MTA7JCh0aGlzKS5jc3MoeydoZWlnaHQnOmhlaWdodCsncHgnLCdtYXgtaGVpZ2h0JzpoZWlnaHQrJ3B4J30pLmNvbHVtbml6ZSh7Y29sdW1uczoyLGxhc3ROZXZlclRhbGxlc3Q6ITB9KX19KX19CiQoIi5mYWNldGVkX2ltYWdlX3ZpZXdlciIpLmJ4U2xpZGVyKHttb2RlOiJmYWRlIixzcGVlZDozMDAsY29udHJvbHM6ITEsYXV0bzohMSxhZGFwdGl2ZUhlaWdodDohMCx0b3VjaEVuYWJsZWQ6ITEsb25TbGlkZXJMb2FkOmZ1bmN0aW9uKCl7JCgiLmZhY2V0ZWRfaW1hZ2Vfdmlld2VyIikuY3NzKCJ2aXNpYmlsaXR5IiwidmlzaWJsZSIpO3ZhciBzY3JpcHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7c2NyaXB0LnNyYz0iZXh0L2xpZ2h0Ym94Mi9kaXN0L2pzL2xpZ2h0Ym94Lm1pbi5qcyI7ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpfX0pfQokKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCl7Y2hlY2tQcm9kdWN0TGlzdGluZ1N0YXRlKCExKX0pOyQoZnVuY3Rpb24oKXskKHdpbmRvdykub24oJ2JlZm9yZXVubG9hZCAnLGZ1bmN0aW9uKCl7dmFyIHNjcm9sbFBvc2l0aW9uPSQod2luZG93KS5zY3JvbGxUb3AoKTtpZihzY3JvbGxQb3NpdGlvbj4wKXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgic2Nyb2xsUG9zaXRpb24iLHNjcm9sbFBvc2l0aW9uKX19KX0pO2Z1bmN0aW9uIHVwZGF0ZUZpbHRlcnMocGFyYW1ldGVycyxuZXdTZWxlY3RWYWx1ZSxuZXdTZWxlY3RJRCl7dmFyIHJlZmVycmVyPWdldFVybFZhcnMoKVsncmVmZXJyZXInXTtpZih0eXBlb2YgcmVmZXJyZXI9PSd1bmRlZmluZWQnKXtyZWZlcnJlcj0wfQppZihwYXJhbWV0ZXJzPT11bmRlZmluZWQpe3JldHVybiExfQp2YXIgcGFybXM9dW53cmFwUGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtpZih0eXBlb2YgbmV3U2VsZWN0SUQhPSd1bmRlZmluZWQnKXt2YXIgdmFya2V5PW5ld1NlbGVjdElELm1hdGNoKC8oXGQrKS8pWzFdO3Bhcm1zLmN1cnJlbnR2YXI9dmFya2V5O3Bhcm1zLmN1cnJlbnR2YWw9bmV3U2VsZWN0VmFsdWU7aWYodHlwZW9mIHBhcm1zLnNldHZhcmlhYmxlc1t2YXJrZXldPT0ndW5kZWZpbmVkJyl7cGFybXMuc2V0dmFyaWFibGVzW3ZhcmtleV09W119CnBhcm1zLnNldHZhcmlhYmxlc1t2YXJrZXldW25ld1NlbGVjdFZhbHVlXT0nIicrbmV3U2VsZWN0VmFsdWUrJyInfQpwYXJtcy5yZWZlcnJlcj1yZWZlcnJlcjtwYXJhbWV0ZXJzPXdyYXBQYXJhbWV0ZXJzKHBhcm1zKTskLmJsb2NrVUkoe21lc3NhZ2U6JzxpbWcgc3JjPSInK0JBU0VfSFJFRisnaW1hZ2VzL3NpdGUvbG9hZGluZy5naWYiIC8+Jyxjc3M6e2JhY2tncm91bmRDb2xvcjondHJhbnNwYXJlbnQnLGNvbG9yOicjMDAwJyxib3JkZXI6J25vbmUnfSxvdmVybGF5Q1NTOntiYWNrZ3JvdW5kQ29sb3I6JyMwMDAnLG9wYWNpdHk6MC4xLGN1cnNvcjond2FpdCd9LGZhZGVJbjowLGZhZGVPdXQ6MCxiYXNlWjoxMDAwfSk7JC5wb3N0KCdpbmNsdWRlcy9hamF4L2FqYXgudmFyaWFibGVzLnBocCcse3BhcmFtZXRlcnM6cGFyYW1ldGVycyxuZXdzZWxlY3R2YWw6bmV3U2VsZWN0VmFsdWV9LGZ1bmN0aW9uKGRhdGEpeyQudW5ibG9ja1VJKCk7Y291bnQ9ZGF0YS5wYWdlIT09bnVsbD9kYXRhLnBhZ2U6MTtpZigkKCcjZmFjZXRlZHNlYXJjaCcpLmxlbmd0aD4wKXtpZihkYXRhLmZhY2V0ZWRzZWFyY2ghPW51bGwmJmRhdGEuZmFjZXRlZHNlYXJjaCE9JycpeyQoJyNyZXNwb25zaXZlRmFjdGVkU2VhcmNoQnV0dG9uJykuY3NzKCdkaXNwbGF5JywnaW5saW5lLWJsb2NrJyk7JCgnI3Jlc3BvbnNpdmVfZmFjZXRlZF9zZWFyY2gnKS5yZW1vdmUoKTskKCcjcmVzcG9uc2l2ZV9mYWNldGVkX3NlYXJjaF9jb250YWluZXInKS5odG1sKGRhdGEucmVzcG9uc2l2ZV9mYWNldGVkX3NlYXJjaCk7JCgnI2ZhY2V0ZWRzZWFyY2gnKS5wYXJlbnQoKS5wYXJlbnQoKS5zaG93KCk7JCgnI2ZhY2V0ZWRzZWFyY2gnKS5odG1sKGRhdGEuZmFjZXRlZHNlYXJjaCk7JCgnI2ZhY2V0ZWRzZWFyY2ggYScpLmhvdmVyKGZ1bmN0aW9uKCl7JCh0aGlzKS5hZGRDbGFzcygndWktc3RhdGUtaG92ZXInKX0sZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCd1aS1zdGF0ZS1ob3ZlcicpfSl9ZWxzZXskKCcjcmVzcG9uc2l2ZUZhY3RlZFNlYXJjaEJ1dHRvbicpLmhpZGUoKTskKCdkaXYuZmFjZXRlZHNlYXJjaCcpLnJlbW92ZSgpfX0KcmVzZXRQYWdlPSExO2lmKChkYXRhLmZhY2V0ZWRzZWFyY2ghPW51bGx8fGRhdGEuc2VsZWN0cyE9JycpJiZkYXRhLnByb2R1Y3R0YWJsZSE9Jycpe2lmKG5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9NU0lFIDkvKSl7d2luZG93LmxvY2F0aW9uLmhhc2g9Y291bnR9ZWxzZXt2YXIgc3RhdGVPYmo9e3RpdGxlOiJQYWdlIix1cmw6bG9jYXRpb24uaHJlZn07aWYoIWxvY2F0aW9uLmhyZWYubWF0Y2goLyMvKSl7aGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGVPYmosImhhc2gtdXJsIixzdGF0ZU9iai51cmwrJyMnK2NvdW50KX1lbHNle3ZhciB1cmw9c3RhdGVPYmoudXJsLm1hdGNoKC9eKC4qPykoXCMoXGQrKSkuKj8kLyk7aWYoZGF0YS5yZXNldD09MCl7aGlzdG9yeS5wdXNoU3RhdGUoc3RhdGVPYmosImhhc2gtdXJsIix1cmxbMV0rJyMnK2NvdW50KX1lbHNle2hpc3RvcnkucHVzaFN0YXRlKHN0YXRlT2JqLCJoYXNoLXVybCIsdXJsWzFdKX19fQpwYWdlSGlzdG9yeS5wdXNoKGRhdGEucGFyYW1ldGVycyl9CnVud3JhcHBlZFBhcmFtZXRlcnM9dW53cmFwUGFyYW1ldGVycyhkYXRhLnBhcmFtZXRlcnMpO2lmKGRhdGEucmVzZXR8fCFsaXN0aW5nQWJvdmVDb250ZW50KXtpZigkKCcjc2VsZWN0bGlzdCcpLmxlbmd0aD4wKXskKCcjc2VsZWN0bGlzdCcpLmh0bWwoZGF0YS5zZWxlY3RzKX0KJCgnI3NlbGVjdF9saXN0X21vdmVkJykuaHRtbCgnJyk7JCgnI3Byb2R1Y3R0YWJsZScpLmh0bWwoZGF0YS5wcm9kdWN0dGFibGUpLmhpZGUoKTskKCcjcHJvZHVjdF90YWJsZV9tb3ZlZCcpLmh0bWwoJycpLmhpZGUoKTskKCcjcHJvZHVjdGJveGVzJykuaHRtbChkYXRhLnByb2R1Y3Rib3hlcykuaGlkZSgpOyQoJyNwcm9kdWN0X2JveGVzX21vdmVkJykuaHRtbCgnJykuaGlkZSgpO21vdmVkPSExO2lmKGZsb2F0SGVhZCl7dmFyIHRhYmxlPSQoJ3RhYmxlLnByb2R1Y3RMaXN0aW5nJyk7dGFibGUuZmxvYXRUaGVhZCgnZGVzdHJveScpO3RhYmxlLmZsb2F0VGhlYWQoe3pJbmRleDo1MDF9KX19ZWxzZXtpZigkKCcjc2VsZWN0X2xpc3RfbW92ZWQnKS5sZW5ndGg+MCl7JCgnI3NlbGVjdF9saXN0X21vdmVkJykuaHRtbChkYXRhLnNlbGVjdHMpfQokKCcjc2VsZWN0bGlzdCcpLmh0bWwoJycpOyQoJyNwcm9kdWN0X3RhYmxlX21vdmVkJykuaHRtbChkYXRhLnByb2R1Y3R0YWJsZSkuaGlkZSgpOyQoJyNwcm9kdWN0dGFibGUnKS5odG1sKCcnKS5oaWRlKCk7JCgnI3Byb2R1Y3RfYm94ZXNfbW92ZWQnKS5odG1sKGRhdGEucHJvZHVjdGJveGVzKS5oaWRlKCk7JCgnI3Byb2R1Y3Rib3hlcycpLmh0bWwoJycpLmhpZGUoKTttb3ZlZD0hMH0Kc2V0VGltZW91dChmdW5jdGlvbigpe2NoZWNrUHJvZHVjdExpc3RpbmdTdGF0ZSgoZGF0YS5wcm9kdWN0dGFibGUhPScnfHxkYXRhLnByb2R1Y3Rib3hlcyE9JycpKTt2YXIgbWVudT0kKCIjcmVzcG9uc2l2ZV9mYWNldGVkX3NlYXJjaCIpLm1tZW51KHtuYXZiYXI6e3RpdGxlOidGaWx0ZXInfSxvZmZDYW52YXM6e3Bvc2l0aW9uOiJsZWZ0Iix6cG9zaXRpb246ImZyb250In0sZXh0ZW5zaW9uczpbInBhZ2VkaW0tYmxhY2siLCJtdWx0aWxpbmUiXSxvbkNsaWNrOntjbG9zZTohMX19KTskKCd1bC5tdWx0aXBsZV9mYWNldGVkX3ZhcmlhYmxlJykub24oJ21vdXNld2hlZWwgRE9NTW91c2VTY3JvbGwnLGZ1bmN0aW9uKGUpe3ZhciBlMD1lLm9yaWdpbmFsRXZlbnQ7dmFyIGRlbHRhPWUwLndoZWVsRGVsdGF8fC1lMC5kZXRhaWw7dGhpcy5zY3JvbGxUb3ArPShkZWx0YTwwPzE6LTEpKjMwO2UucHJldmVudERlZmF1bHQoKX0pO2lmKGZsb2F0SGVhZCl7dmFyIHRhYmxlPSQoJ3RhYmxlLnByb2R1Y3RMaXN0aW5nJyk7dGFibGUuZmxvYXRUaGVhZCgnZGVzdHJveScpO3RhYmxlLmZsb2F0VGhlYWQoe3pJbmRleDo1MDF9KX19LDUwMCk7aWYoZGF0YS5yZXNldCl7JCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe3Njcm9sbFRvcDooMCl9LDApfWVsc2V7aWYoJCgnI3Byb2R1Y3R0YWJsZScpLmh0bWwoKT09JycpeyQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHtzY3JvbGxUb3A6KCQoJyNwcm9kdWN0X3RhYmxlX21vdmVkJykub2Zmc2V0KCkudG9wKX0sMCl9ZWxzZXskKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7c2Nyb2xsVG9wOigkKCcjcHJvZHVjdHRhYmxlJykub2Zmc2V0KCkudG9wKX0sMCl9fQppZihERUJVR19MVkw+MCl7Y29uc29sZS5sb2coZGF0YS5kZWJ1Zyl9CmlmKGRhdGEuY291bnRzPT0xJiYkKCd0ZC5jYWxsX3RvX2FjdGlvbiBhJykuYXR0cignaHJlZicpLm1hdGNoKC9qYXZhc2NyaXB0Lyk9PW51bGwmJnJlZGlyZWN0SWZPbmVQcm9kdWN0KXt3aW5kb3cubG9jYXRpb249JCgndGQuY2FsbF90b19hY3Rpb24gYScpLmF0dHIoJ2hyZWYnKX0KJCgnLmZhY2V0ZWQtY29sdW1ucycpLmNvbHVtbnMoMik7cmV0dXJuITF9LCdqc29uJykuZmFpbChmdW5jdGlvbihlcnIpeyQudW5ibG9ja1VJKCk7Y29uc29sZS5sb2coZXJyLnJlc3BvbnNlVGV4dCl9KX0KaWYobmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL01TSUUgOS8pfHwobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3NhZmFyaS8nKT4tMSYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2Nocm9tZS8nKT09LTEpKXskKHdpbmRvdykuYmluZCgnaGFzaGNoYW5nZScsZnVuY3Rpb24oKXtiYWNrPSEwO3VwZGF0ZUZpbHRlcnMocGFnZUhpc3RvcnkucG9wKCkpfSl9ZWxzZXt3aW5kb3cub25wb3BzdGF0ZT1mdW5jdGlvbihlKXtpZihwYWdlSGlzdG9yeS5sZW5ndGg9PTF8fCFsb2NhdGlvbi5ocmVmLm1hdGNoKC8jLykpe31lbHNle3BhZ2VIaXN0b3J5LnBvcCgpO3ZhciBwYXJhbXM9cGFnZUhpc3RvcnkucG9wKCk7dXBkYXRlRmlsdGVycyhwYXJhbXMpfX19CmZ1bmN0aW9uIGVkaXRWYXJpYWJsZShpZCl7aWYoJCgnI2VkaXR2YXJpYWJsZWRpYWxvZycpLmxlbmd0aD09MCl7JCgnYm9keScpLmFwcGVuZCgnPGRpdiBpZD0iZWRpdHZhcmlhYmxlZGlhbG9nIiAvPicpfQp2YXIgdGV4dD0ndGV4dCc7JCgnI2VkaXR2YXJpYWJsZWRpYWxvZycpLmRpYWxvZyh7bW9kYWw6ITAsb3BlbjpmdW5jdGlvbigpeyQoJyN2YXJpYWJsZW5hbWUnKS52YWwoJCgnc2VsZWN0W25hbWU9dmFyaWFibGVfdmFyaWFibGVcXFsnK2lkKydcXF1dIDpzZWxlY3RlZCcpLnRleHQoKSl9LGJ1dHRvbnM6e3VwZGF0ZTpmdW5jdGlvbigpe2lmKCQoJyN2YXJpYWJsZW5hbWUnKS52YWwoKSE9PScnKXskLnBvc3QoJy4uL2luY2x1ZGVzL2FqYXgvYWpheC52YXJpYWJsZXMucGhwJyx7dmFyaWFibGVpZDppZCx2YXJpYWJsZXRleHQ6JCgnI3ZhcmlhYmxlbmFtZScpLnZhbCgpfSxmdW5jdGlvbihkYXRhKXskKCdzZWxlY3RbbmFtZT12YXJpYWJsZV92YXJpYWJsZVxcWzFcXF1cXFsnK2lkKydcXF1dIDpzZWxlY3RlZCcpLnRleHQoJCgnI3ZhcmlhYmxlbmFtZScpLnZhbCgpKX0pLmZhaWwoZnVuY3Rpb24oZXJyKXthbGVydChlcnIucmVzcG9uc2VUZXh0KX0pOyQodGhpcykuZGlhbG9nKCdjbG9zZScpfWVsc2V7YWxlcnQoJ1ZhcmlhYmxlIE5hbWUgQ2Fubm90IEJlIEJsYW5rJywnRW50cnkgRXJyb3InKX19LGNsb3NlOmZ1bmN0aW9uKCl7JCh0aGlzKS5kaWFsb2coJ2Nsb3NlJyl9fX0pfQpmdW5jdGlvbiBjaGVja0NhcnRRdWFudGl0aWVzKHR5cGUsaWQpe3ZhciBxdHk9MDtpZih0eXBlb2YgdHlwZSE9J3VuZGVmaW5lZCcpe2lmKHR5cGU9PSdyZnEnKXskKCcjYWN0aW9uXFxbJytpZCsnXFxdJykudmFsKCdib3hfcmZxJyl9ZWxzZSBpZih0eXBlPT0nYnV5Jyl7JCgnI2FjdGlvblxcWycraWQrJ1xcXScpLnZhbCgnYm94X2J1eScpfQppZigkKCcjcHJvZHVjdGJveGVzJykuaXMoJzp2aXNpYmxlJykmJiQoJyNjYXJ0X3F1YW50aXR5X2JveGVzXFxbJytpZCsnXFxdJykubGVuZ3RoPjApeyQoJyNjYXJ0X3F1YW50aXR5X2JveGVzXFxbJytpZCsnXFxdJykuc3VibWl0KCl9ZWxzZSBpZigkKCcjcHJvZHVjdGJveGVzJykuaXMoJzp2aXNpYmxlJykmJiQoJyNjYXJ0X3F1YW50aXR5X3Jlc3BvbnNpdmUnKS5sZW5ndGg+MCl7JCgnI2NhcnRfcXVhbnRpdHlfcmVzcG9uc2l2ZScpLnN1Ym1pdCgpO3JldHVybiExfWVsc2V7JCgnI2NhcnRfcXVhbnRpdHlcXFsnK2lkKydcXF0nKS5zdWJtaXQoKX19CmlmKCQoJ2lucHV0LmNhcnRxdHknKS5sZW5ndGg+MCl7JCgnaW5wdXQuY2FydHF0eScpLmVhY2goZnVuY3Rpb24oKXtxdHkrPXBhcnNlSW50KCQodGhpcykudmFsKCkpO2lmKHR5cGU9PSdyZnEnKXskKHRoaXMpLmF0dHIoJ25hbWUnLCQodGhpcykuYXR0cignbmFtZScpLnJlcGxhY2UoJ3F0eV9jaGlsZElkJywncXR5X2NoaWxkUkZRSWQnKSl9fSl9CmlmKHF0eT4wKXskKCcjY2FydF9xdWFudGl0eScpLnN1Ym1pdCgpfWVsc2V7JCgnaW5wdXQuY2FydHF0eScpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsJ1RvbWF0bycpLnZhbCgwKX19CmZ1bmN0aW9uIGhpZGVDb2x1bW5zKGZpbHRlcmNsYXNzKXskKCdkaXYuJytmaWx0ZXJjbGFzcykuZWFjaChmdW5jdGlvbigpe3ZhciBlbGVtPSQodGhpcykuZmluZCgnYScpfSl9CmZ1bmN0aW9uIHNldEZpbHRlckhlaWdodChkZXB0aCl7JCgnZGl2LmZpbHRlcmNvbHVtbicpLmNzcygnaGVpZ2h0JywoMjAqZGVwdGgpKzcpOyQoJ2Rpdi5yZXNwb25zaXZlZmlsdGVyY29sdW1uJykuY3NzKCdoZWlnaHQnLCgyMCpkZXB0aCkrNyl9CmZ1bmN0aW9uIHRyaWdnZXJQQih0aWQpeyQoIiNwYl8iK3RpZCsiIC5wcmljZWJyZWFrc0xpc3RpbmdTZXQiKS50b2dnbGVDbGFzcygiaGlkZS1wYiIpfQpmdW5jdGlvbiB1cGRhdGVQcmljaW5nKGJiaWFycmF5KXskLnBvc3QoJ2luY2x1ZGVzL2FqYXgvYWpheC50YmUucGhwJyx7bW9kZWxzOmJiaWFycmF5fSxmdW5jdGlvbihkYXRhKXtmb3IodmFyIGtleSBpbiBkYXRhLm1vZGVscyl7dmFyIHByaWNlT2JqPSQoJyNyb3ctJytrZXkrIiB0ZC5wcm9kdWN0c19wcmljZSIpO3ZhciBwa2dTaXplT2JqPSQoJyNyb3ctJytrZXkrIiB0ZC5wcm9kdWN0X3F1YW50aXR5Iik7dmFyIGJ1eU9iaj0kKCcjcm93LScra2V5KyIgdGQuY2FsbF90b19hY3Rpb24iKTtwcmljZU9iai5odG1sKGRhdGEubW9kZWxzW2tleV0uaHRtbCk7cGtnU2l6ZU9iai5odG1sKGRhdGEubW9kZWxzW2tleV0ucGtnX3F0eSk7aWYoZGF0YS5tb2RlbHNba2V5XS5odG1sPT0nUkZRJyl7JCgnI2J1eV9waWQtJytkYXRhLm1vZGVsc1trZXldLnBpZCkucmVtb3ZlKCl9fQpyZXR1cm4hMX0sJ2pzb24nKS5mYWlsKGZ1bmN0aW9uKGVycil7Y29uc29sZS5sb2coZXJyLnJlc3BvbnNlVGV4dCl9KX0KZnVuY3Rpb24gcGxhY2VGYWNldGVkU2VhcmNoKCl7dmFyIHdpbmRvd1dpZHRoO2lmKCQoJy51aS13aWRnZXQuaW5mb0JveENvbnRhaW5lci5mYWNldGVkX3NlYXJjaCcpLmxlbmd0aD4wKXt3aW5kb3dXaWR0aD0kKHdpbmRvdykud2lkdGgoKTtpZih3aW5kb3dXaWR0aDw3NjgpeyQoJy51aS13aWRnZXQuaW5mb0JveENvbnRhaW5lci5mYWNldGVkX3NlYXJjaCcpLmFwcGVuZFRvKCcjZmFjZXRlZFNlYXJjaFBsYWNlaG9sZGVyJyl9ZWxzZXtpZigkKCcjZmFjZXRlZFNlYXJjaFBsYWNlaG9sZGVyIC51aS13aWRnZXQuaW5mb0JveENvbnRhaW5lci5mYWNldGVkX3NlYXJjaCcpLmxlbmd0aD4wKXskKCcudWktd2lkZ2V0LmluZm9Cb3hDb250YWluZXIuZmFjZXRlZF9zZWFyY2gnKS5hcHBlbmRUbygnI2NvbHVtbkxlZnQgI2xlZnRDb2x1bW5GYWNldGVkU2VhcmNoUGxhY2Vob2xkZXInKX19fX0KZnVuY3Rpb24gY2xvc2VSZXNwb25zaXZlRmFjZXRlZFNlYXJjaCgpe3ZhciBBUEk9JCgiI3Jlc3BvbnNpdmVfZmFjZXRlZF9zZWFyY2giKS5kYXRhKCJtbWVudSIpO0FQSS5jbG9zZSgpfQpmdW5jdGlvbiBjaGFuZ2VDaGVja2JveCh2YXJrZXksdmFsa2V5KXt2YXIgYm94PSQoJyN2YWx1ZVxcWycrdmFya2V5KydcXF1cXFsnK3ZhbGtleSsnXFxdJyk7Ym94LmNsaWNrKCk7dmFyIGJveD0kKCcjdmFsdWVfcmVzcG9uc2l2ZVxcWycrdmFya2V5KydcXF1cXFsnK3ZhbGtleSsnXFxdJyk7Ym94LmNsaWNrKCl9CmZ1bmN0aW9uIHVud3JhcFBhcmFtZXRlcnMoc3RyaW5nKXt2YXIgcGFyYW1zPXVuc2VyaWFsaXplKGRlY29kZTY0KHN0cmluZykpO3ZhciB2YXJzPVtdO2lmKHR5cGVvZiBwYXJhbXMuc2V0dmFyaWFibGVzIT0ndW5kZWZpbmVkJyl7Zm9yKHZhciBrZXkgaW4gcGFyYW1zLnNldHZhcmlhYmxlcyl7a2V5PWtleS5yZXBsYWNlKC9cIisvZywnIicpO3ZhcnNba2V5XT1bXTtmb3IodmFyIHZhbCBpbiBwYXJhbXMuc2V0dmFyaWFibGVzW2tleV0pe3ZhbD12YWwucmVwbGFjZSgvXCIrL2csJyInKTt2YXJzW2tleV1bdmFsXT12YWx9fTtwYXJhbXMuc2V0dmFyaWFibGVzPXZhcnN9CnJldHVybiBwYXJhbXN9CmZ1bmN0aW9uIHdyYXBQYXJhbWV0ZXJzKHN0cmluZyl7cmV0dXJuIGVuY29kZTY0KHNlcmlhbGl6ZShzdHJpbmcpKX0KZnVuY3Rpb24gbG9hZFBhcmFtZXRlcnModmFya2V5LHZhbGtleSl7aWYodHlwZW9mIHZhcmtleT09J3VuZGVmaW5lZCd8fHR5cGVvZiB2YWxrZXk9PSd1bmRlZmluZWQnKXtyZXR1cm4hMX0KaWYodHlwZW9mIHVud3JhcHBlZFBhcmFtZXRlcnMuc2V0dmFyaWFibGVzW3ZhcmtleV0hPSd1bmRlZmluZWQnJiZ0eXBlb2YgdW53cmFwcGVkUGFyYW1ldGVycy5zZXR2YXJpYWJsZXNbdmFya2V5XVt2YWxrZXldIT0ndW5kZWZpbmVkJyl7ZGVsZXRlIHVud3JhcHBlZFBhcmFtZXRlcnMuc2V0dmFyaWFibGVzW3ZhcmtleV1bdmFsa2V5XX0KaWYodHlwZW9mIHVud3JhcHBlZFBhcmFtZXRlcnMuc2V0dmFyaWFibGVzW3ZhcmtleV09PSd1bmRlZmluZWQnKXt1bndyYXBwZWRQYXJhbWV0ZXJzLnNldHZhcmlhYmxlc1t2YXJrZXldPVtdfQp1bndyYXBwZWRQYXJhbWV0ZXJzLnNldHZhcmlhYmxlc1t2YXJrZXldW3ZhbGtleV09dmFsa2V5O3Vud3JhcHBlZFBhcmFtZXRlcnMucmVzZXQ9MH0KZnVuY3Rpb24gc3VibWl0RmlsdGVycyh2YXJrZXkpeyQuZWFjaCgkKCcubXVsdGlwbGUtZmFjZXRlZC1jaGVja2JveCcpLGZ1bmN0aW9uKGtleSx2YWx1ZSl7aWYoJCh0aGlzKS5wcm9wKCdjaGVja2VkJyk9PSEwJiYkKHRoaXMpLmRhdGEoJ2tleScpPT12YXJrZXkpe2xvYWRQYXJhbWV0ZXJzKHZhcmtleSwkKHRoaXMpLmRhdGEoJ3ZhbCcpKX1lbHNlIGlmKCQodGhpcykuZGF0YSgna2V5Jyk9PXZhcmtleSl7aWYodHlwZW9mIHVud3JhcHBlZFBhcmFtZXRlcnMuc2V0dmFyaWFibGVzW3ZhcmtleV0hPSd1bmRlZmluZWQnJiZ0eXBlb2YgdW53cmFwcGVkUGFyYW1ldGVycy5zZXR2YXJpYWJsZXNbdmFya2V5XVskKHRoaXMpLmRhdGEoJ3ZhbCcpXSE9J3VuZGVmaW5lZCcpe2RlbGV0ZSB1bndyYXBwZWRQYXJhbWV0ZXJzLnNldHZhcmlhYmxlc1t2YXJrZXldWyQodGhpcykuZGF0YSgndmFsJyldfX19KTt1bndyYXBwZWRQYXJhbWV0ZXJzLmN1cnJlbnR2YXI9dmFya2V5O3VwZGF0ZUZpbHRlcnMod3JhcFBhcmFtZXRlcnModW53cmFwcGVkUGFyYW1ldGVycykpfQpmdW5jdGlvbiBjbGVhck1pbk1heCh2YXJpYWJsZSx2YWx1ZSl7JCgnI21pblxcWycrdmFyaWFibGUrJ1xcXScpLnZhbCgnJyk7JCgnI21heFxcWycrdmFyaWFibGUrJ1xcXScpLnZhbCgnJyk7JCgnI21pbnJlc3BcXFsnK3ZhcmlhYmxlKydcXF0nKS52YWwoJycpOyQoJyNtYXhyZXNwXFxbJyt2YXJpYWJsZSsnXFxdJykudmFsKCcnKTt1bndyYXBwZWRQYXJhbWV0ZXJzLm1pbj0wO3Vud3JhcHBlZFBhcmFtZXRlcnMubWF4PTB9CmZ1bmN0aW9uIGNoZWNrTWluTWF4KHZhcmtleSl7aWYoJCgnI21pblxcWycrdmFya2V5KydcXF0nKS52YWwoKT09Jycpe3Vud3JhcHBlZFBhcmFtZXRlcnMubWluPTB9ZWxzZXt1bndyYXBwZWRQYXJhbWV0ZXJzLnJlc2V0PTA7dW53cmFwcGVkUGFyYW1ldGVycy5taW49W107dW53cmFwcGVkUGFyYW1ldGVycy5taW5bdmFya2V5XT0kKCcjbWluXFxbJyt2YXJrZXkrJ1xcXScpLnZhbCgpfQppZigkKCcjbWF4XFxbJyt2YXJrZXkrJ1xcXScpLnZhbCgpPT0nJyl7dW53cmFwcGVkUGFyYW1ldGVycy5tYXg9MH1lbHNle3Vud3JhcHBlZFBhcmFtZXRlcnMucmVzZXQ9MDt1bndyYXBwZWRQYXJhbWV0ZXJzLm1heD1bXTt1bndyYXBwZWRQYXJhbWV0ZXJzLm1heFt2YXJrZXldPSQoJyNtYXhcXFsnK3ZhcmtleSsnXFxdJykudmFsKCl9fQpmdW5jdGlvbiBjbGVhckNoZWNrYm94ZXModmFyaWFibGUpeyQuZWFjaCgkKCcubXVsdGlwbGUtZmFjZXRlZC1jaGVja2JveCcpLGZ1bmN0aW9uKGtleSx2YWx1ZSl7aWYoJCh0aGlzKS5wcm9wKCdjaGVja2VkJyk9PSEwJiYkKHRoaXMpLmRhdGEoJ2tleScpPT12YXJpYWJsZSl7JCh0aGlzKS5wcm9wKCdjaGVja2VkJywhMSl9fSl9CmZ1bmN0aW9uIGNsZWFyVXBkYXRlKHBhcmFtZXRlcnMpeyQoJ2lucHV0Lm1pbicpLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLnZhbCgnJyl9KTskKCdpbnB1dC5tYXgnKS5lYWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS52YWwoJycpfSk7dXBkYXRlRmlsdGVycyhwYXJhbWV0ZXJzKX0KZnVuY3Rpb24gc2VsZWN0QWxsRmlsdGVycyh2YXJrZXkpeyQuZWFjaCgkKCcubXVsdGlwbGUtZmFjZXRlZC1jaGVja2JveCcpLGZ1bmN0aW9uKGtleSx2YWx1ZSl7aWYoJCh0aGlzKS5kYXRhKCdrZXknKT09dmFya2V5KXskKHRoaXMpLnByb3AoJ2NoZWNrZWQnLCEwKX19KX0KZnVuY3Rpb24gdXBkYXRlTWluKHZhcmtleSl7dmFyIG1pbj0kKCcjbWluXFxbJyt2YXJrZXkrJ1xcXScpO3ZhciBtaW5yZXNwPSQoJyNtaW5yZXNwXFxbJyt2YXJrZXkrJ1xcXScpO2lmKG1pbi52YWwoKT09JycmJm1pbnJlc3AudmFsKCkhPScnKXttaW4udmFsKG1pbnJlc3AudmFsKCkpfX0KZnVuY3Rpb24gdXBkYXRlTWF4KHZhcmtleSl7dmFyIG1heD0kKCcjbWF4XFxbJyt2YXJrZXkrJ1xcXScpO3ZhciBtYXhyZXNwPSQoJyNtYXhyZXNwXFxbJyt2YXJrZXkrJ1xcXScpO2lmKG1heC52YWwoKT09JycmJm1heHJlc3AudmFsKCkhPScnKXttYXgudmFsKG1heHJlc3AudmFsKCkpfX0KJC5mbi5jb2x1bW5zPWZ1bmN0aW9uKG51bV9jb2xzKXt2YXIgY29udGFpbmVyPXRoaXMsbGlzdEl0ZW09J2xpJyxsaXN0Q2xhc3M9J3N1Yi1saXN0Jztjb250YWluZXIuZWFjaChmdW5jdGlvbigpe3ZhciBpdGVtc19wZXJfY29sPW5ldyBBcnJheSgpLGl0ZW1zPSQodGhpcykuZmluZChsaXN0SXRlbSksbWluX2l0ZW1zX3Blcl9jb2w9TWF0aC5mbG9vcihpdGVtcy5sZW5ndGgvbnVtX2NvbHMpLGRpZmZlcmVuY2U9aXRlbXMubGVuZ3RoLShtaW5faXRlbXNfcGVyX2NvbCpudW1fY29scyk7Zm9yKHZhciBpPTA7aTxudW1fY29scztpKyspe2lmKGk8ZGlmZmVyZW5jZSl7aXRlbXNfcGVyX2NvbFtpXT1taW5faXRlbXNfcGVyX2NvbCsxfWVsc2V7aXRlbXNfcGVyX2NvbFtpXT1taW5faXRlbXNfcGVyX2NvbH19CmZvcih2YXIgaT0wO2k8bnVtX2NvbHM7aSsrKXskKHRoaXMpLmFwcGVuZCgkKCc8dWw+PC91bD4nKS5hZGRDbGFzcyhsaXN0Q2xhc3MpKTtmb3IodmFyIGo9MDtqPGl0ZW1zX3Blcl9jb2xbaV07aisrKXt2YXIgcG9pbnRlcj0wO2Zvcih2YXIgaz0wO2s8aTtrKyspe3BvaW50ZXIrPWl0ZW1zX3Blcl9jb2xba119CiQodGhpcykuZmluZCgnLicrbGlzdENsYXNzKS5sYXN0KCkuYXBwZW5kKGl0ZW1zW2orcG9pbnRlcl0pfX19KTskKCcuc3ViLWxpc3QnKS53cmFwKCc8bGkgY2xhc3M9InN1Yi1saXN0LWxpIj48L2xpPicpO2NvbnRhaW5lci5hZGRDbGFzcygndWktY29ybmVyLWFsbCcpfTshZnVuY3Rpb24oZmFjdG9yeSl7InVzZSBzdHJpY3QiOyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5Il0sZmFjdG9yeSk6alF1ZXJ5JiYhalF1ZXJ5LmZuLmhvdmVySW50ZW50JiZmYWN0b3J5KGpRdWVyeSl9KGZ1bmN0aW9uKCQpeyJ1c2Ugc3RyaWN0Ijt2YXIgY1gsY1ksX2NmZz17aW50ZXJ2YWw6MTAwLHNlbnNpdGl2aXR5OjYsdGltZW91dDowfSxJTlNUQU5DRV9DT1VOVD0wLHRyYWNrPWZ1bmN0aW9uKGV2KXtjWD1ldi5wYWdlWCxjWT1ldi5wYWdlWX0sY29tcGFyZT1mdW5jdGlvbihldiwkZWwscyxjZmcpe2lmKE1hdGguc3FydCgocy5wWC1jWCkqKHMucFgtY1gpKyhzLnBZLWNZKSoocy5wWS1jWSkpPGNmZy5zZW5zaXRpdml0eSlyZXR1cm4gJGVsLm9mZihzLmV2ZW50LHRyYWNrKSxkZWxldGUgcy50aW1lb3V0SWQscy5pc0FjdGl2ZT0hMCxldi5wYWdlWD1jWCxldi5wYWdlWT1jWSxkZWxldGUgcy5wWCxkZWxldGUgcy5wWSxjZmcub3Zlci5hcHBseSgkZWxbMF0sW2V2XSk7cy5wWD1jWCxzLnBZPWNZLHMudGltZW91dElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtjb21wYXJlKGV2LCRlbCxzLGNmZyl9LGNmZy5pbnRlcnZhbCl9LGRlbGF5PWZ1bmN0aW9uKGV2LCRlbCxzLG91dCl7cmV0dXJuIGRlbGV0ZSAkZWwuZGF0YSgiaG92ZXJJbnRlbnQiKVtzLmlkXSxvdXQuYXBwbHkoJGVsWzBdLFtldl0pfTskLmZuLmhvdmVySW50ZW50PWZ1bmN0aW9uKGhhbmRsZXJJbixoYW5kbGVyT3V0LHNlbGVjdG9yKXt2YXIgaW5zdGFuY2VJZD1JTlNUQU5DRV9DT1VOVCsrLGNmZz0kLmV4dGVuZCh7fSxfY2ZnKTskLmlzUGxhaW5PYmplY3QoaGFuZGxlckluKT8oY2ZnPSQuZXh0ZW5kKGNmZyxoYW5kbGVySW4pLCQuaXNGdW5jdGlvbihjZmcub3V0KXx8KGNmZy5vdXQ9Y2ZnLm92ZXIpKTpjZmc9JC5pc0Z1bmN0aW9uKGhhbmRsZXJPdXQpPyQuZXh0ZW5kKGNmZyx7b3ZlcjpoYW5kbGVySW4sb3V0OmhhbmRsZXJPdXQsc2VsZWN0b3I6c2VsZWN0b3J9KTokLmV4dGVuZChjZmcse292ZXI6aGFuZGxlckluLG91dDpoYW5kbGVySW4sc2VsZWN0b3I6aGFuZGxlck91dH0pO3ZhciBoYW5kbGVIb3Zlcj1mdW5jdGlvbihlKXt2YXIgZXY9JC5leHRlbmQoe30sZSksJGVsPSQodGhpcyksaG92ZXJJbnRlbnREYXRhPSRlbC5kYXRhKCJob3ZlckludGVudCIpO2hvdmVySW50ZW50RGF0YXx8JGVsLmRhdGEoImhvdmVySW50ZW50Iixob3ZlckludGVudERhdGE9e30pO3ZhciBzdGF0ZT1ob3ZlckludGVudERhdGFbaW5zdGFuY2VJZF07c3RhdGV8fChob3ZlckludGVudERhdGFbaW5zdGFuY2VJZF09c3RhdGU9e2lkOmluc3RhbmNlSWR9KSxzdGF0ZS50aW1lb3V0SWQmJihzdGF0ZS50aW1lb3V0SWQ9Y2xlYXJUaW1lb3V0KHN0YXRlLnRpbWVvdXRJZCkpO3ZhciBtb3VzZW1vdmU9c3RhdGUuZXZlbnQ9Im1vdXNlbW92ZS5ob3ZlckludGVudC5ob3ZlckludGVudCIraW5zdGFuY2VJZDtpZigibW91c2VlbnRlciI9PT1lLnR5cGUpe2lmKHN0YXRlLmlzQWN0aXZlKXJldHVybjtzdGF0ZS5wWD1ldi5wYWdlWCxzdGF0ZS5wWT1ldi5wYWdlWSwkZWwub2ZmKG1vdXNlbW92ZSx0cmFjaykub24obW91c2Vtb3ZlLHRyYWNrKSxzdGF0ZS50aW1lb3V0SWQ9c2V0VGltZW91dChmdW5jdGlvbigpe2NvbXBhcmUoZXYsJGVsLHN0YXRlLGNmZyl9LGNmZy5pbnRlcnZhbCl9ZWxzZXtpZighc3RhdGUuaXNBY3RpdmUpcmV0dXJuOyRlbC5vZmYobW91c2Vtb3ZlLHRyYWNrKSxzdGF0ZS50aW1lb3V0SWQ9c2V0VGltZW91dChmdW5jdGlvbigpe2RlbGF5KGV2LCRlbCxzdGF0ZSxjZmcub3V0KX0sY2ZnLnRpbWVvdXQpfX07cmV0dXJuIHRoaXMub24oeyJtb3VzZWVudGVyLmhvdmVySW50ZW50IjpoYW5kbGVIb3ZlciwibW91c2VsZWF2ZS5ob3ZlckludGVudCI6aGFuZGxlSG92ZXJ9LGNmZy5zZWxlY3Rvcil9fSk7ZnVuY3Rpb24gc2F2ZVBERigpe3ZhciBkb2NodG1sPSQoImh0bWwiKS5odG1sKCk7dmFyIGZvcm09JCgnPGZvcm0vPicseyJhY3Rpb24iOiJzYXZlUERGLnBocCIsIm1ldGhvZCI6IlBPU1QiLCJhY2NlcHQtY2hhcnNldCI6IlVURi04In0pO3ZhciBjb250ZW50PSQoJzxpbnB1dC8+Jyx7InR5cGUiOiJ0ZXh0IiwibmFtZSI6ImNvbnRlbnQifSkuYXBwZW5kVG8oZm9ybSk7Y29udGVudC52YWwoZG9jaHRtbC5yZXBsYWNlKC9ccysvZywnICcpKTtmb3JtLmhpZGUoKS5hcHBlbmRUbygiYm9keSIpLnN1Ym1pdCgpfTtmdW5jdGlvbiBzYXZlTVBERigpe3ZhciBodG1sPSQoImh0bWwiKS5odG1sKCk7JC5ibG9ja1VJKHttZXNzYWdlOic8aDE+PGltZyBzcmM9ImFkbWluL2ltYWdlcy9pY29ucy9zcGlubmVyLmdpZiIgLz4gUGxlYXNlIHdhaXQgd2hpbGUgeW91ciBmaWxlIGlzIGdlbmVyYXRlZC4uLjwvaDE+Jyxjc3M6e2JhY2tncm91bmRDb2xvcjonI2ZmZicsY29sb3I6JyMwMDAnfX0pOyQucG9zdCgnbXBkZi5waHAnLHtodG1sOmh0bWwsdGl0bGU6JCgnI3N0b3JlTG9nbyBpbWcnKS5hdHRyKCJ0aXRsZSIpfSxmdW5jdGlvbihkYXRhKXskLnVuYmxvY2tVSSgpO2lmKHR5cGVvZiBkYXRhLmRlYnVnIT0ndW5kZWZpbmVkJyl7aWYoJCgnI2RlYnVnJykubGVuZ3RoPT0wKXskKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPSJkZWJ1ZyIgLz4nKX0KJCgnI2RlYnVnJykuaHRtbChkYXRhLmRlYnVnKTtyZXR1cm4hMX0KaWYoJCgnI2Rvd25sb2FkLXBkZicpLmxlbmd0aD09MCl7dmFyIGlmcmFtZT0kKCc8aWZyYW1lIGlkPSJkb3dubG9hZC1wZGYiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48L2lmcmFtZT4nKQppZnJhbWUuYXR0cignc3JjJywnbXBkZi5waHA/ZG93bmxvYWQ9JytkYXRhLnVybCk7JCgnYm9keScpLmFwcGVuZChpZnJhbWUpfWVsc2V7JCgnI2Rvd25sb2FkLXBkZicpLmF0dHIoJ3NyYycsJ21wZGYucGhwP2Rvd25sb2FkPScrZGF0YS51cmwpfQpyZXR1cm4hMX0sJ2pzb24nKS5lcnJvcihmdW5jdGlvbihlcnIpeyQudW5ibG9ja1VJKCk7aWYoJCgnI2RlYnVnJykubGVuZ3RoPT0wKXskKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPSJkZWJ1ZyIgLz4nKX0KJCgnI2RlYnVnJykuaHRtbCgnRXJyb3IgJytlcnIucmVzcG9uc2VUZXh0KX0pfTsoZnVuY3Rpb24oJCx1bmRlZmluZWQpeyJ1c2Ugc3RyaWN0Ijt2YXIgdmVyPSczLjAuMyc7ZnVuY3Rpb24gZGVidWcocyl7aWYoJC5mbi5jeWNsZS5kZWJ1ZykKbG9nKHMpfQpmdW5jdGlvbiBsb2coKXtpZih3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cpCmNvbnNvbGUubG9nKCdbY3ljbGVdICcrQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMsJyAnKSl9CiQuZXhwclsnOiddLnBhdXNlZD1mdW5jdGlvbihlbCl7cmV0dXJuIGVsLmN5Y2xlUGF1c2V9OyQuZm4uY3ljbGU9ZnVuY3Rpb24ob3B0aW9ucyxhcmcyKXt2YXIgbz17czp0aGlzLnNlbGVjdG9yLGM6dGhpcy5jb250ZXh0fTtpZih0aGlzLmxlbmd0aD09PTAmJm9wdGlvbnMhPSdzdG9wJyl7aWYoISQuaXNSZWFkeSYmby5zKXtsb2coJ0RPTSBub3QgcmVhZHksIHF1ZXVpbmcgc2xpZGVzaG93Jyk7JChmdW5jdGlvbigpeyQoby5zLG8uYykuY3ljbGUob3B0aW9ucyxhcmcyKX0pO3JldHVybiB0aGlzfQpsb2coJ3Rlcm1pbmF0aW5nOyB6ZXJvIGVsZW1lbnRzIGZvdW5kIGJ5IHNlbGVjdG9yJysoJC5pc1JlYWR5PycnOicgKERPTSBub3QgcmVhZHkpJykpO3JldHVybiB0aGlzfQpyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG9wdHM9aGFuZGxlQXJndW1lbnRzKHRoaXMsb3B0aW9ucyxhcmcyKTtpZihvcHRzPT09ITEpCnJldHVybjtvcHRzLnVwZGF0ZUFjdGl2ZVBhZ2VyTGluaz1vcHRzLnVwZGF0ZUFjdGl2ZVBhZ2VyTGlua3x8JC5mbi5jeWNsZS51cGRhdGVBY3RpdmVQYWdlckxpbms7aWYodGhpcy5jeWNsZVRpbWVvdXQpCmNsZWFyVGltZW91dCh0aGlzLmN5Y2xlVGltZW91dCk7dGhpcy5jeWNsZVRpbWVvdXQ9dGhpcy5jeWNsZVBhdXNlPTA7dGhpcy5jeWNsZVN0b3A9MDt2YXIgJGNvbnQ9JCh0aGlzKTt2YXIgJHNsaWRlcz1vcHRzLnNsaWRlRXhwcj8kKG9wdHMuc2xpZGVFeHByLHRoaXMpOiRjb250LmNoaWxkcmVuKCk7dmFyIGVscz0kc2xpZGVzLmdldCgpO2lmKGVscy5sZW5ndGg8Mil7bG9nKCd0ZXJtaW5hdGluZzsgdG9vIGZldyBzbGlkZXM6ICcrZWxzLmxlbmd0aCk7cmV0dXJufQp2YXIgb3B0czI9YnVpbGRPcHRpb25zKCRjb250LCRzbGlkZXMsZWxzLG9wdHMsbyk7aWYob3B0czI9PT0hMSkKcmV0dXJuO3ZhciBzdGFydFRpbWU9b3B0czIuY29udGludW91cz8xMDpnZXRUaW1lb3V0KGVsc1tvcHRzMi5jdXJyU2xpZGVdLGVsc1tvcHRzMi5uZXh0U2xpZGVdLG9wdHMyLCFvcHRzMi5iYWNrd2FyZHMpO2lmKHN0YXJ0VGltZSl7c3RhcnRUaW1lKz0ob3B0czIuZGVsYXl8fDApO2lmKHN0YXJ0VGltZTwxMCkKc3RhcnRUaW1lPTEwO2RlYnVnKCdmaXJzdCB0aW1lb3V0OiAnK3N0YXJ0VGltZSk7dGhpcy5jeWNsZVRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe2dvKGVscyxvcHRzMiwwLCFvcHRzLmJhY2t3YXJkcyl9LHN0YXJ0VGltZSl9fSl9O2Z1bmN0aW9uIHRyaWdnZXJQYXVzZShjb250LGJ5SG92ZXIsb25QYWdlcil7dmFyIG9wdHM9JChjb250KS5kYXRhKCdjeWNsZS5vcHRzJyk7aWYoIW9wdHMpCnJldHVybjt2YXIgcGF1c2VkPSEhY29udC5jeWNsZVBhdXNlO2lmKHBhdXNlZCYmb3B0cy5wYXVzZWQpCm9wdHMucGF1c2VkKGNvbnQsb3B0cyxieUhvdmVyLG9uUGFnZXIpO2Vsc2UgaWYoIXBhdXNlZCYmb3B0cy5yZXN1bWVkKQpvcHRzLnJlc3VtZWQoY29udCxvcHRzLGJ5SG92ZXIsb25QYWdlcil9CmZ1bmN0aW9uIGhhbmRsZUFyZ3VtZW50cyhjb250LG9wdGlvbnMsYXJnMil7aWYoY29udC5jeWNsZVN0b3A9PT11bmRlZmluZWQpCmNvbnQuY3ljbGVTdG9wPTA7aWYob3B0aW9ucz09PXVuZGVmaW5lZHx8b3B0aW9ucz09PW51bGwpCm9wdGlvbnM9e307aWYob3B0aW9ucy5jb25zdHJ1Y3Rvcj09U3RyaW5nKXtzd2l0Y2gob3B0aW9ucyl7Y2FzZSAnZGVzdHJveSc6Y2FzZSAnc3RvcCc6dmFyIG9wdHM9JChjb250KS5kYXRhKCdjeWNsZS5vcHRzJyk7aWYoIW9wdHMpCnJldHVybiExO2NvbnQuY3ljbGVTdG9wKys7aWYoY29udC5jeWNsZVRpbWVvdXQpCmNsZWFyVGltZW91dChjb250LmN5Y2xlVGltZW91dCk7Y29udC5jeWNsZVRpbWVvdXQ9MDtpZihvcHRzLmVsZW1lbnRzKQokKG9wdHMuZWxlbWVudHMpLnN0b3AoKTskKGNvbnQpLnJlbW92ZURhdGEoJ2N5Y2xlLm9wdHMnKTtpZihvcHRpb25zPT0nZGVzdHJveScpCmRlc3Ryb3koY29udCxvcHRzKTtyZXR1cm4hMTtjYXNlICd0b2dnbGUnOmNvbnQuY3ljbGVQYXVzZT0oY29udC5jeWNsZVBhdXNlPT09MSk/MDoxO2NoZWNrSW5zdGFudFJlc3VtZShjb250LmN5Y2xlUGF1c2UsYXJnMixjb250KTt0cmlnZ2VyUGF1c2UoY29udCk7cmV0dXJuITE7Y2FzZSAncGF1c2UnOmNvbnQuY3ljbGVQYXVzZT0xO3RyaWdnZXJQYXVzZShjb250KTtyZXR1cm4hMTtjYXNlICdyZXN1bWUnOmNvbnQuY3ljbGVQYXVzZT0wO2NoZWNrSW5zdGFudFJlc3VtZSghMSxhcmcyLGNvbnQpO3RyaWdnZXJQYXVzZShjb250KTtyZXR1cm4hMTtjYXNlICdwcmV2JzpjYXNlICduZXh0JzpvcHRzPSQoY29udCkuZGF0YSgnY3ljbGUub3B0cycpO2lmKCFvcHRzKXtsb2coJ29wdGlvbnMgbm90IGZvdW5kLCAicHJldi9uZXh0IiBpZ25vcmVkJyk7cmV0dXJuITF9CmlmKHR5cGVvZiBhcmcyPT0nc3RyaW5nJykKb3B0cy5vbmVUaW1lRng9YXJnMjskLmZuLmN5Y2xlW29wdGlvbnNdKG9wdHMpO3JldHVybiExO2RlZmF1bHQ6b3B0aW9ucz17Zng6b3B0aW9uc319CnJldHVybiBvcHRpb25zfQplbHNlIGlmKG9wdGlvbnMuY29uc3RydWN0b3I9PU51bWJlcil7dmFyIG51bT1vcHRpb25zO29wdGlvbnM9JChjb250KS5kYXRhKCdjeWNsZS5vcHRzJyk7aWYoIW9wdGlvbnMpe2xvZygnb3B0aW9ucyBub3QgZm91bmQsIGNhbiBub3QgYWR2YW5jZSBzbGlkZScpO3JldHVybiExfQppZihudW08MHx8bnVtPj1vcHRpb25zLmVsZW1lbnRzLmxlbmd0aCl7bG9nKCdpbnZhbGlkIHNsaWRlIGluZGV4OiAnK251bSk7cmV0dXJuITF9Cm9wdGlvbnMubmV4dFNsaWRlPW51bTtpZihjb250LmN5Y2xlVGltZW91dCl7Y2xlYXJUaW1lb3V0KGNvbnQuY3ljbGVUaW1lb3V0KTtjb250LmN5Y2xlVGltZW91dD0wfQppZih0eXBlb2YgYXJnMj09J3N0cmluZycpCm9wdGlvbnMub25lVGltZUZ4PWFyZzI7Z28ob3B0aW9ucy5lbGVtZW50cyxvcHRpb25zLDEsbnVtPj1vcHRpb25zLmN1cnJTbGlkZSk7cmV0dXJuITF9CnJldHVybiBvcHRpb25zO2Z1bmN0aW9uIGNoZWNrSW5zdGFudFJlc3VtZShpc1BhdXNlZCxhcmcyLGNvbnQpe2lmKCFpc1BhdXNlZCYmYXJnMj09PSEwKXt2YXIgb3B0aW9ucz0kKGNvbnQpLmRhdGEoJ2N5Y2xlLm9wdHMnKTtpZighb3B0aW9ucyl7bG9nKCdvcHRpb25zIG5vdCBmb3VuZCwgY2FuIG5vdCByZXN1bWUnKTtyZXR1cm4hMX0KaWYoY29udC5jeWNsZVRpbWVvdXQpe2NsZWFyVGltZW91dChjb250LmN5Y2xlVGltZW91dCk7Y29udC5jeWNsZVRpbWVvdXQ9MH0KZ28ob3B0aW9ucy5lbGVtZW50cyxvcHRpb25zLDEsIW9wdGlvbnMuYmFja3dhcmRzKX19fQpmdW5jdGlvbiByZW1vdmVGaWx0ZXIoZWwsb3B0cyl7aWYoISQuc3VwcG9ydC5vcGFjaXR5JiZvcHRzLmNsZWFydHlwZSYmZWwuc3R5bGUuZmlsdGVyKXt0cnl7ZWwuc3R5bGUucmVtb3ZlQXR0cmlidXRlKCdmaWx0ZXInKX0KY2F0Y2goc21vdGhlcil7fX19CmZ1bmN0aW9uIGRlc3Ryb3koY29udCxvcHRzKXtpZihvcHRzLm5leHQpCiQob3B0cy5uZXh0KS51bmJpbmQob3B0cy5wcmV2TmV4dEV2ZW50KTtpZihvcHRzLnByZXYpCiQob3B0cy5wcmV2KS51bmJpbmQob3B0cy5wcmV2TmV4dEV2ZW50KTtpZihvcHRzLnBhZ2VyfHxvcHRzLnBhZ2VyQW5jaG9yQnVpbGRlcikKJC5lYWNoKG9wdHMucGFnZXJBbmNob3JzfHxbXSxmdW5jdGlvbigpe3RoaXMudW5iaW5kKCkucmVtb3ZlKCl9KTtvcHRzLnBhZ2VyQW5jaG9ycz1udWxsOyQoY29udCkudW5iaW5kKCdtb3VzZWVudGVyLmN5Y2xlIG1vdXNlbGVhdmUuY3ljbGUnKTtpZihvcHRzLmRlc3Ryb3kpCm9wdHMuZGVzdHJveShvcHRzKX0KZnVuY3Rpb24gYnVpbGRPcHRpb25zKCRjb250LCRzbGlkZXMsZWxzLG9wdGlvbnMsbyl7dmFyIHN0YXJ0aW5nU2xpZGVTcGVjaWZpZWQ7dmFyIG9wdHM9JC5leHRlbmQoe30sJC5mbi5jeWNsZS5kZWZhdWx0cyxvcHRpb25zfHx7fSwkLm1ldGFkYXRhPyRjb250Lm1ldGFkYXRhKCk6JC5tZXRhPyRjb250LmRhdGEoKTp7fSk7dmFyIG1ldGE9JC5pc0Z1bmN0aW9uKCRjb250LmRhdGEpPyRjb250LmRhdGEob3B0cy5tZXRhQXR0cik6bnVsbDtpZihtZXRhKQpvcHRzPSQuZXh0ZW5kKG9wdHMsbWV0YSk7aWYob3B0cy5hdXRvc3RvcCkKb3B0cy5jb3VudGRvd249b3B0cy5hdXRvc3RvcENvdW50fHxlbHMubGVuZ3RoO3ZhciBjb250PSRjb250WzBdOyRjb250LmRhdGEoJ2N5Y2xlLm9wdHMnLG9wdHMpO29wdHMuJGNvbnQ9JGNvbnQ7b3B0cy5zdG9wQ291bnQ9Y29udC5jeWNsZVN0b3A7b3B0cy5lbGVtZW50cz1lbHM7b3B0cy5iZWZvcmU9b3B0cy5iZWZvcmU/W29wdHMuYmVmb3JlXTpbXTtvcHRzLmFmdGVyPW9wdHMuYWZ0ZXI/W29wdHMuYWZ0ZXJdOltdO2lmKCEkLnN1cHBvcnQub3BhY2l0eSYmb3B0cy5jbGVhcnR5cGUpCm9wdHMuYWZ0ZXIucHVzaChmdW5jdGlvbigpe3JlbW92ZUZpbHRlcih0aGlzLG9wdHMpfSk7aWYob3B0cy5jb250aW51b3VzKQpvcHRzLmFmdGVyLnB1c2goZnVuY3Rpb24oKXtnbyhlbHMsb3B0cywwLCFvcHRzLmJhY2t3YXJkcyl9KTtzYXZlT3JpZ2luYWxPcHRzKG9wdHMpO2lmKCEkLnN1cHBvcnQub3BhY2l0eSYmb3B0cy5jbGVhcnR5cGUmJiFvcHRzLmNsZWFydHlwZU5vQmcpCmNsZWFyVHlwZUZpeCgkc2xpZGVzKTtpZigkY29udC5jc3MoJ3Bvc2l0aW9uJyk9PSdzdGF0aWMnKQokY29udC5jc3MoJ3Bvc2l0aW9uJywncmVsYXRpdmUnKTtpZihvcHRzLndpZHRoKQokY29udC53aWR0aChvcHRzLndpZHRoKTtpZihvcHRzLmhlaWdodCYmb3B0cy5oZWlnaHQhPSdhdXRvJykKJGNvbnQuaGVpZ2h0KG9wdHMuaGVpZ2h0KTtpZihvcHRzLnN0YXJ0aW5nU2xpZGUhPT11bmRlZmluZWQpe29wdHMuc3RhcnRpbmdTbGlkZT1wYXJzZUludChvcHRzLnN0YXJ0aW5nU2xpZGUsMTApO2lmKG9wdHMuc3RhcnRpbmdTbGlkZT49ZWxzLmxlbmd0aHx8b3B0cy5zdGFydFNsaWRlPDApCm9wdHMuc3RhcnRpbmdTbGlkZT0wO2Vsc2Ugc3RhcnRpbmdTbGlkZVNwZWNpZmllZD0hMH0KZWxzZSBpZihvcHRzLmJhY2t3YXJkcykKb3B0cy5zdGFydGluZ1NsaWRlPWVscy5sZW5ndGgtMTtlbHNlIG9wdHMuc3RhcnRpbmdTbGlkZT0wO2lmKG9wdHMucmFuZG9tKXtvcHRzLnJhbmRvbU1hcD1bXTtmb3IodmFyIGk9MDtpPGVscy5sZW5ndGg7aSsrKQpvcHRzLnJhbmRvbU1hcC5wdXNoKGkpO29wdHMucmFuZG9tTWFwLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5yYW5kb20oKS0wLjV9KTtpZihzdGFydGluZ1NsaWRlU3BlY2lmaWVkKXtmb3IodmFyIGNudD0wO2NudDxlbHMubGVuZ3RoO2NudCsrKXtpZihvcHRzLnN0YXJ0aW5nU2xpZGU9PW9wdHMucmFuZG9tTWFwW2NudF0pe29wdHMucmFuZG9tSW5kZXg9Y250fX19CmVsc2V7b3B0cy5yYW5kb21JbmRleD0xO29wdHMuc3RhcnRpbmdTbGlkZT1vcHRzLnJhbmRvbU1hcFsxXX19CmVsc2UgaWYob3B0cy5zdGFydGluZ1NsaWRlPj1lbHMubGVuZ3RoKQpvcHRzLnN0YXJ0aW5nU2xpZGU9MDtvcHRzLmN1cnJTbGlkZT1vcHRzLnN0YXJ0aW5nU2xpZGV8fDA7dmFyIGZpcnN0PW9wdHMuc3RhcnRpbmdTbGlkZTskc2xpZGVzLmNzcyh7cG9zaXRpb246J2Fic29sdXRlJyx0b3A6MCxsZWZ0OjB9KS5oaWRlKCkuZWFjaChmdW5jdGlvbihpKXt2YXIgejtpZihvcHRzLmJhY2t3YXJkcykKej1maXJzdD9pPD1maXJzdD9lbHMubGVuZ3RoKyhpLWZpcnN0KTpmaXJzdC1pOmVscy5sZW5ndGgtaTtlbHNlIHo9Zmlyc3Q/aT49Zmlyc3Q/ZWxzLmxlbmd0aC0oaS1maXJzdCk6Zmlyc3QtaTplbHMubGVuZ3RoLWk7JCh0aGlzKS5jc3MoJ3otaW5kZXgnLHopfSk7JChlbHNbZmlyc3RdKS5jc3MoJ29wYWNpdHknLDEpLnNob3coKTtyZW1vdmVGaWx0ZXIoZWxzW2ZpcnN0XSxvcHRzKTtpZihvcHRzLmZpdCl7aWYoIW9wdHMuYXNwZWN0KXtpZihvcHRzLndpZHRoKQokc2xpZGVzLndpZHRoKG9wdHMud2lkdGgpO2lmKG9wdHMuaGVpZ2h0JiZvcHRzLmhlaWdodCE9J2F1dG8nKQokc2xpZGVzLmhlaWdodChvcHRzLmhlaWdodCl9ZWxzZXskc2xpZGVzLmVhY2goZnVuY3Rpb24oKXt2YXIgJHNsaWRlPSQodGhpcyk7dmFyIHJhdGlvPShvcHRzLmFzcGVjdD09PSEwKT8kc2xpZGUud2lkdGgoKS8kc2xpZGUuaGVpZ2h0KCk6b3B0cy5hc3BlY3Q7aWYob3B0cy53aWR0aCYmJHNsaWRlLndpZHRoKCkhPW9wdHMud2lkdGgpeyRzbGlkZS53aWR0aChvcHRzLndpZHRoKTskc2xpZGUuaGVpZ2h0KG9wdHMud2lkdGgvcmF0aW8pfQppZihvcHRzLmhlaWdodCYmJHNsaWRlLmhlaWdodCgpPG9wdHMuaGVpZ2h0KXskc2xpZGUuaGVpZ2h0KG9wdHMuaGVpZ2h0KTskc2xpZGUud2lkdGgob3B0cy5oZWlnaHQqcmF0aW8pfX0pfX0KaWYob3B0cy5jZW50ZXImJigoIW9wdHMuZml0KXx8b3B0cy5hc3BlY3QpKXskc2xpZGVzLmVhY2goZnVuY3Rpb24oKXt2YXIgJHNsaWRlPSQodGhpcyk7JHNsaWRlLmNzcyh7Im1hcmdpbi1sZWZ0IjpvcHRzLndpZHRoPygob3B0cy53aWR0aC0kc2xpZGUud2lkdGgoKSkvMikrInB4IjowLCJtYXJnaW4tdG9wIjpvcHRzLmhlaWdodD8oKG9wdHMuaGVpZ2h0LSRzbGlkZS5oZWlnaHQoKSkvMikrInB4IjowfSl9KX0KaWYob3B0cy5jZW50ZXImJiFvcHRzLmZpdCYmIW9wdHMuc2xpZGVSZXNpemUpeyRzbGlkZXMuZWFjaChmdW5jdGlvbigpe3ZhciAkc2xpZGU9JCh0aGlzKTskc2xpZGUuY3NzKHsibWFyZ2luLWxlZnQiOm9wdHMud2lkdGg/KChvcHRzLndpZHRoLSRzbGlkZS53aWR0aCgpKS8yKSsicHgiOjAsIm1hcmdpbi10b3AiOm9wdHMuaGVpZ2h0Pygob3B0cy5oZWlnaHQtJHNsaWRlLmhlaWdodCgpKS8yKSsicHgiOjB9KX0pfQp2YXIgcmVzaGFwZT0ob3B0cy5jb250YWluZXJSZXNpemV8fG9wdHMuY29udGFpbmVyUmVzaXplSGVpZ2h0KSYmJGNvbnQuaW5uZXJIZWlnaHQoKTwxO2lmKHJlc2hhcGUpe3ZhciBtYXh3PTAsbWF4aD0wO2Zvcih2YXIgaj0wO2o8ZWxzLmxlbmd0aDtqKyspe3ZhciAkZT0kKGVsc1tqXSksZT0kZVswXSx3PSRlLm91dGVyV2lkdGgoKSxoPSRlLm91dGVySGVpZ2h0KCk7aWYoIXcpdz1lLm9mZnNldFdpZHRofHxlLndpZHRofHwkZS5hdHRyKCd3aWR0aCcpO2lmKCFoKWg9ZS5vZmZzZXRIZWlnaHR8fGUuaGVpZ2h0fHwkZS5hdHRyKCdoZWlnaHQnKTttYXh3PXc+bWF4dz93Om1heHc7bWF4aD1oPm1heGg/aDptYXhofQppZihvcHRzLmNvbnRhaW5lclJlc2l6ZSYmbWF4dz4wJiZtYXhoPjApCiRjb250LmNzcyh7d2lkdGg6bWF4dysncHgnLGhlaWdodDptYXhoKydweCd9KTtpZihvcHRzLmNvbnRhaW5lclJlc2l6ZUhlaWdodCYmbWF4aD4wKQokY29udC5jc3Moe2hlaWdodDptYXhoKydweCd9KX0KdmFyIHBhdXNlRmxhZz0hMTtpZihvcHRzLnBhdXNlKQokY29udC5iaW5kKCdtb3VzZWVudGVyLmN5Y2xlJyxmdW5jdGlvbigpe3BhdXNlRmxhZz0hMDt0aGlzLmN5Y2xlUGF1c2UrKzt0cmlnZ2VyUGF1c2UoY29udCwhMCl9KS5iaW5kKCdtb3VzZWxlYXZlLmN5Y2xlJyxmdW5jdGlvbigpe2lmKHBhdXNlRmxhZykKdGhpcy5jeWNsZVBhdXNlLS07dHJpZ2dlclBhdXNlKGNvbnQsITApfSk7aWYoc3VwcG9ydE11bHRpVHJhbnNpdGlvbnMob3B0cyk9PT0hMSkKcmV0dXJuITE7dmFyIHJlcXVldWU9ITE7b3B0aW9ucy5yZXF1ZXVlQXR0ZW1wdHM9b3B0aW9ucy5yZXF1ZXVlQXR0ZW1wdHN8fDA7JHNsaWRlcy5lYWNoKGZ1bmN0aW9uKCl7dmFyICRlbD0kKHRoaXMpO3RoaXMuY3ljbGVIPShvcHRzLmZpdCYmb3B0cy5oZWlnaHQpP29wdHMuaGVpZ2h0OigkZWwuaGVpZ2h0KCl8fHRoaXMub2Zmc2V0SGVpZ2h0fHx0aGlzLmhlaWdodHx8JGVsLmF0dHIoJ2hlaWdodCcpfHwwKTt0aGlzLmN5Y2xlVz0ob3B0cy5maXQmJm9wdHMud2lkdGgpP29wdHMud2lkdGg6KCRlbC53aWR0aCgpfHx0aGlzLm9mZnNldFdpZHRofHx0aGlzLndpZHRofHwkZWwuYXR0cignd2lkdGgnKXx8MCk7aWYoJGVsLmlzKCdpbWcnKSl7dmFyIGxvYWRpbmc9KHRoaXMuY3ljbGVIPT09MCYmdGhpcy5jeWNsZVc9PT0wJiYhdGhpcy5jb21wbGV0ZSk7aWYobG9hZGluZyl7aWYoby5zJiZvcHRzLnJlcXVldWVPbkltYWdlTm90TG9hZGVkJiYrK29wdGlvbnMucmVxdWV1ZUF0dGVtcHRzPDEwMCl7bG9nKG9wdGlvbnMucmVxdWV1ZUF0dGVtcHRzLCcgLSBpbWcgc2xpZGUgbm90IGxvYWRlZCwgcmVxdWV1aW5nIHNsaWRlc2hvdzogJyx0aGlzLnNyYyx0aGlzLmN5Y2xlVyx0aGlzLmN5Y2xlSCk7c2V0VGltZW91dChmdW5jdGlvbigpeyQoby5zLG8uYykuY3ljbGUob3B0aW9ucyl9LG9wdHMucmVxdWV1ZVRpbWVvdXQpO3JlcXVldWU9ITA7cmV0dXJuITF9CmVsc2V7bG9nKCdjb3VsZCBub3QgZGV0ZXJtaW5lIHNpemUgb2YgaW1hZ2U6ICcrdGhpcy5zcmMsdGhpcy5jeWNsZVcsdGhpcy5jeWNsZUgpfX19CnJldHVybiEwfSk7aWYocmVxdWV1ZSkKcmV0dXJuITE7b3B0cy5jc3NCZWZvcmU9b3B0cy5jc3NCZWZvcmV8fHt9O29wdHMuY3NzQWZ0ZXI9b3B0cy5jc3NBZnRlcnx8e307b3B0cy5jc3NGaXJzdD1vcHRzLmNzc0ZpcnN0fHx7fTtvcHRzLmFuaW1Jbj1vcHRzLmFuaW1Jbnx8e307b3B0cy5hbmltT3V0PW9wdHMuYW5pbU91dHx8e307JHNsaWRlcy5ub3QoJzplcSgnK2ZpcnN0KycpJykuY3NzKG9wdHMuY3NzQmVmb3JlKTskKCRzbGlkZXNbZmlyc3RdKS5jc3Mob3B0cy5jc3NGaXJzdCk7aWYob3B0cy50aW1lb3V0KXtvcHRzLnRpbWVvdXQ9cGFyc2VJbnQob3B0cy50aW1lb3V0LDEwKTtpZihvcHRzLnNwZWVkLmNvbnN0cnVjdG9yPT1TdHJpbmcpCm9wdHMuc3BlZWQ9JC5meC5zcGVlZHNbb3B0cy5zcGVlZF18fHBhcnNlSW50KG9wdHMuc3BlZWQsMTApO2lmKCFvcHRzLnN5bmMpCm9wdHMuc3BlZWQ9b3B0cy5zcGVlZC8yO3ZhciBidWZmZXI9b3B0cy5meD09J25vbmUnPzA6b3B0cy5meD09J3NodWZmbGUnPzUwMDoyNTA7d2hpbGUoKG9wdHMudGltZW91dC1vcHRzLnNwZWVkKTxidWZmZXIpCm9wdHMudGltZW91dCs9b3B0cy5zcGVlZH0KaWYob3B0cy5lYXNpbmcpCm9wdHMuZWFzZUluPW9wdHMuZWFzZU91dD1vcHRzLmVhc2luZztpZighb3B0cy5zcGVlZEluKQpvcHRzLnNwZWVkSW49b3B0cy5zcGVlZDtpZighb3B0cy5zcGVlZE91dCkKb3B0cy5zcGVlZE91dD1vcHRzLnNwZWVkO29wdHMuc2xpZGVDb3VudD1lbHMubGVuZ3RoO29wdHMuY3VyclNsaWRlPW9wdHMubGFzdFNsaWRlPWZpcnN0O2lmKG9wdHMucmFuZG9tKXtpZigrK29wdHMucmFuZG9tSW5kZXg9PWVscy5sZW5ndGgpCm9wdHMucmFuZG9tSW5kZXg9MDtvcHRzLm5leHRTbGlkZT1vcHRzLnJhbmRvbU1hcFtvcHRzLnJhbmRvbUluZGV4XX0KZWxzZSBpZihvcHRzLmJhY2t3YXJkcykKb3B0cy5uZXh0U2xpZGU9b3B0cy5zdGFydGluZ1NsaWRlPT09MD8oZWxzLmxlbmd0aC0xKTpvcHRzLnN0YXJ0aW5nU2xpZGUtMTtlbHNlIG9wdHMubmV4dFNsaWRlPW9wdHMuc3RhcnRpbmdTbGlkZT49KGVscy5sZW5ndGgtMSk/MDpvcHRzLnN0YXJ0aW5nU2xpZGUrMTtpZighb3B0cy5tdWx0aUZ4KXt2YXIgaW5pdD0kLmZuLmN5Y2xlLnRyYW5zaXRpb25zW29wdHMuZnhdO2lmKCQuaXNGdW5jdGlvbihpbml0KSkKaW5pdCgkY29udCwkc2xpZGVzLG9wdHMpO2Vsc2UgaWYob3B0cy5meCE9J2N1c3RvbScmJiFvcHRzLm11bHRpRngpe2xvZygndW5rbm93biB0cmFuc2l0aW9uOiAnK29wdHMuZngsJzsgc2xpZGVzaG93IHRlcm1pbmF0aW5nJyk7cmV0dXJuITF9fQp2YXIgZTA9JHNsaWRlc1tmaXJzdF07aWYoIW9wdHMuc2tpcEluaXRpYWxpemF0aW9uQ2FsbGJhY2tzKXtpZihvcHRzLmJlZm9yZS5sZW5ndGgpCm9wdHMuYmVmb3JlWzBdLmFwcGx5KGUwLFtlMCxlMCxvcHRzLCEwXSk7aWYob3B0cy5hZnRlci5sZW5ndGgpCm9wdHMuYWZ0ZXJbMF0uYXBwbHkoZTAsW2UwLGUwLG9wdHMsITBdKX0KaWYob3B0cy5uZXh0KQokKG9wdHMubmV4dCkuYmluZChvcHRzLnByZXZOZXh0RXZlbnQsZnVuY3Rpb24oKXtyZXR1cm4gYWR2YW5jZShvcHRzLDEpfSk7aWYob3B0cy5wcmV2KQokKG9wdHMucHJldikuYmluZChvcHRzLnByZXZOZXh0RXZlbnQsZnVuY3Rpb24oKXtyZXR1cm4gYWR2YW5jZShvcHRzLDApfSk7aWYob3B0cy5wYWdlcnx8b3B0cy5wYWdlckFuY2hvckJ1aWxkZXIpCmJ1aWxkUGFnZXIoZWxzLG9wdHMpO2V4cG9zZUFkZFNsaWRlKG9wdHMsZWxzKTtyZXR1cm4gb3B0c30KZnVuY3Rpb24gc2F2ZU9yaWdpbmFsT3B0cyhvcHRzKXtvcHRzLm9yaWdpbmFsPXtiZWZvcmU6W10sYWZ0ZXI6W119O29wdHMub3JpZ2luYWwuY3NzQmVmb3JlPSQuZXh0ZW5kKHt9LG9wdHMuY3NzQmVmb3JlKTtvcHRzLm9yaWdpbmFsLmNzc0FmdGVyPSQuZXh0ZW5kKHt9LG9wdHMuY3NzQWZ0ZXIpO29wdHMub3JpZ2luYWwuYW5pbUluPSQuZXh0ZW5kKHt9LG9wdHMuYW5pbUluKTtvcHRzLm9yaWdpbmFsLmFuaW1PdXQ9JC5leHRlbmQoe30sb3B0cy5hbmltT3V0KTskLmVhY2gob3B0cy5iZWZvcmUsZnVuY3Rpb24oKXtvcHRzLm9yaWdpbmFsLmJlZm9yZS5wdXNoKHRoaXMpfSk7JC5lYWNoKG9wdHMuYWZ0ZXIsZnVuY3Rpb24oKXtvcHRzLm9yaWdpbmFsLmFmdGVyLnB1c2godGhpcyl9KX0KZnVuY3Rpb24gc3VwcG9ydE11bHRpVHJhbnNpdGlvbnMob3B0cyl7dmFyIGksdHgsdHhzPSQuZm4uY3ljbGUudHJhbnNpdGlvbnM7aWYob3B0cy5meC5pbmRleE9mKCcsJyk+MCl7b3B0cy5tdWx0aUZ4PSEwO29wdHMuZnhzPW9wdHMuZngucmVwbGFjZSgvXHMqL2csJycpLnNwbGl0KCcsJyk7Zm9yKGk9MDtpPG9wdHMuZnhzLmxlbmd0aDtpKyspe3ZhciBmeD1vcHRzLmZ4c1tpXTt0eD10eHNbZnhdO2lmKCF0eHx8IXR4cy5oYXNPd25Qcm9wZXJ0eShmeCl8fCEkLmlzRnVuY3Rpb24odHgpKXtsb2coJ2Rpc2NhcmRpbmcgdW5rbm93biB0cmFuc2l0aW9uOiAnLGZ4KTtvcHRzLmZ4cy5zcGxpY2UoaSwxKTtpLS19fQppZighb3B0cy5meHMubGVuZ3RoKXtsb2coJ05vIHZhbGlkIHRyYW5zaXRpb25zIG5hbWVkOyBzbGlkZXNob3cgdGVybWluYXRpbmcuJyk7cmV0dXJuITF9fQplbHNlIGlmKG9wdHMuZng9PSdhbGwnKXtvcHRzLm11bHRpRng9ITA7b3B0cy5meHM9W107Zm9yKHZhciBwIGluIHR4cyl7aWYodHhzLmhhc093blByb3BlcnR5KHApKXt0eD10eHNbcF07aWYodHhzLmhhc093blByb3BlcnR5KHApJiYkLmlzRnVuY3Rpb24odHgpKQpvcHRzLmZ4cy5wdXNoKHApfX19CmlmKG9wdHMubXVsdGlGeCYmb3B0cy5yYW5kb21pemVFZmZlY3RzKXt2YXIgcjE9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjIwKSszMDtmb3IoaT0wO2k8cjE7aSsrKXt2YXIgcjI9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm9wdHMuZnhzLmxlbmd0aCk7b3B0cy5meHMucHVzaChvcHRzLmZ4cy5zcGxpY2UocjIsMSlbMF0pfQpkZWJ1ZygncmFuZG9taXplZCBmeCBzZXF1ZW5jZTogJyxvcHRzLmZ4cyl9CnJldHVybiEwfQpmdW5jdGlvbiBleHBvc2VBZGRTbGlkZShvcHRzLGVscyl7b3B0cy5hZGRTbGlkZT1mdW5jdGlvbihuZXdTbGlkZSxwcmVwZW5kKXt2YXIgJHM9JChuZXdTbGlkZSkscz0kc1swXTtpZighb3B0cy5hdXRvc3RvcENvdW50KQpvcHRzLmNvdW50ZG93bisrO2Vsc1twcmVwZW5kPyd1bnNoaWZ0JzoncHVzaCddKHMpO2lmKG9wdHMuZWxzKQpvcHRzLmVsc1twcmVwZW5kPyd1bnNoaWZ0JzoncHVzaCddKHMpO29wdHMuc2xpZGVDb3VudD1lbHMubGVuZ3RoO2lmKG9wdHMucmFuZG9tKXtvcHRzLnJhbmRvbU1hcC5wdXNoKG9wdHMuc2xpZGVDb3VudC0xKTtvcHRzLnJhbmRvbU1hcC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGgucmFuZG9tKCktMC41fSl9CiRzLmNzcygncG9zaXRpb24nLCdhYnNvbHV0ZScpOyRzW3ByZXBlbmQ/J3ByZXBlbmRUbyc6J2FwcGVuZFRvJ10ob3B0cy4kY29udCk7aWYocHJlcGVuZCl7b3B0cy5jdXJyU2xpZGUrKztvcHRzLm5leHRTbGlkZSsrfQppZighJC5zdXBwb3J0Lm9wYWNpdHkmJm9wdHMuY2xlYXJ0eXBlJiYhb3B0cy5jbGVhcnR5cGVOb0JnKQpjbGVhclR5cGVGaXgoJHMpO2lmKG9wdHMuZml0JiZvcHRzLndpZHRoKQokcy53aWR0aChvcHRzLndpZHRoKTtpZihvcHRzLmZpdCYmb3B0cy5oZWlnaHQmJm9wdHMuaGVpZ2h0IT0nYXV0bycpCiRzLmhlaWdodChvcHRzLmhlaWdodCk7cy5jeWNsZUg9KG9wdHMuZml0JiZvcHRzLmhlaWdodCk/b3B0cy5oZWlnaHQ6JHMuaGVpZ2h0KCk7cy5jeWNsZVc9KG9wdHMuZml0JiZvcHRzLndpZHRoKT9vcHRzLndpZHRoOiRzLndpZHRoKCk7JHMuY3NzKG9wdHMuY3NzQmVmb3JlKTtpZihvcHRzLnBhZ2VyfHxvcHRzLnBhZ2VyQW5jaG9yQnVpbGRlcikKJC5mbi5jeWNsZS5jcmVhdGVQYWdlckFuY2hvcihlbHMubGVuZ3RoLTEscywkKG9wdHMucGFnZXIpLGVscyxvcHRzKTtpZigkLmlzRnVuY3Rpb24ob3B0cy5vbkFkZFNsaWRlKSkKb3B0cy5vbkFkZFNsaWRlKCRzKTtlbHNlICRzLmhpZGUoKX19CiQuZm4uY3ljbGUucmVzZXRTdGF0ZT1mdW5jdGlvbihvcHRzLGZ4KXtmeD1meHx8b3B0cy5meDtvcHRzLmJlZm9yZT1bXTtvcHRzLmFmdGVyPVtdO29wdHMuY3NzQmVmb3JlPSQuZXh0ZW5kKHt9LG9wdHMub3JpZ2luYWwuY3NzQmVmb3JlKTtvcHRzLmNzc0FmdGVyPSQuZXh0ZW5kKHt9LG9wdHMub3JpZ2luYWwuY3NzQWZ0ZXIpO29wdHMuYW5pbUluPSQuZXh0ZW5kKHt9LG9wdHMub3JpZ2luYWwuYW5pbUluKTtvcHRzLmFuaW1PdXQ9JC5leHRlbmQoe30sb3B0cy5vcmlnaW5hbC5hbmltT3V0KTtvcHRzLmZ4Rm49bnVsbDskLmVhY2gob3B0cy5vcmlnaW5hbC5iZWZvcmUsZnVuY3Rpb24oKXtvcHRzLmJlZm9yZS5wdXNoKHRoaXMpfSk7JC5lYWNoKG9wdHMub3JpZ2luYWwuYWZ0ZXIsZnVuY3Rpb24oKXtvcHRzLmFmdGVyLnB1c2godGhpcyl9KTt2YXIgaW5pdD0kLmZuLmN5Y2xlLnRyYW5zaXRpb25zW2Z4XTtpZigkLmlzRnVuY3Rpb24oaW5pdCkpCmluaXQob3B0cy4kY29udCwkKG9wdHMuZWxlbWVudHMpLG9wdHMpfTtmdW5jdGlvbiBnbyhlbHMsb3B0cyxtYW51YWwsZndkKXt2YXIgcD1vcHRzLiRjb250WzBdLGN1cnI9ZWxzW29wdHMuY3VyclNsaWRlXSxuZXh0PWVsc1tvcHRzLm5leHRTbGlkZV07aWYobWFudWFsJiZvcHRzLmJ1c3kmJm9wdHMubWFudWFsVHJ1bXApe2RlYnVnKCdtYW51YWxUcnVtcCBpbiBnbygpLCBzdG9wcGluZyBhY3RpdmUgdHJhbnNpdGlvbicpOyQoZWxzKS5zdG9wKCEwLCEwKTtvcHRzLmJ1c3k9MDtjbGVhclRpbWVvdXQocC5jeWNsZVRpbWVvdXQpfQppZihvcHRzLmJ1c3kpe2RlYnVnKCd0cmFuc2l0aW9uIGFjdGl2ZSwgaWdub3JpbmcgbmV3IHR4IHJlcXVlc3QnKTtyZXR1cm59CmlmKHAuY3ljbGVTdG9wIT1vcHRzLnN0b3BDb3VudHx8cC5jeWNsZVRpbWVvdXQ9PT0wJiYhbWFudWFsKQpyZXR1cm47aWYoIW1hbnVhbCYmIXAuY3ljbGVQYXVzZSYmIW9wdHMuYm91bmNlJiYoKG9wdHMuYXV0b3N0b3AmJigtLW9wdHMuY291bnRkb3duPD0wKSl8fChvcHRzLm5vd3JhcCYmIW9wdHMucmFuZG9tJiZvcHRzLm5leHRTbGlkZTxvcHRzLmN1cnJTbGlkZSkpKXtpZihvcHRzLmVuZCkKb3B0cy5lbmQob3B0cyk7cmV0dXJufQp2YXIgY2hhbmdlZD0hMTtpZigobWFudWFsfHwhcC5jeWNsZVBhdXNlKSYmKG9wdHMubmV4dFNsaWRlIT1vcHRzLmN1cnJTbGlkZSkpe2NoYW5nZWQ9ITA7dmFyIGZ4PW9wdHMuZng7Y3Vyci5jeWNsZUg9Y3Vyci5jeWNsZUh8fCQoY3VycikuaGVpZ2h0KCk7Y3Vyci5jeWNsZVc9Y3Vyci5jeWNsZVd8fCQoY3Vycikud2lkdGgoKTtuZXh0LmN5Y2xlSD1uZXh0LmN5Y2xlSHx8JChuZXh0KS5oZWlnaHQoKTtuZXh0LmN5Y2xlVz1uZXh0LmN5Y2xlV3x8JChuZXh0KS53aWR0aCgpO2lmKG9wdHMubXVsdGlGeCl7aWYoZndkJiYob3B0cy5sYXN0Rng9PT11bmRlZmluZWR8fCsrb3B0cy5sYXN0Rng+PW9wdHMuZnhzLmxlbmd0aCkpCm9wdHMubGFzdEZ4PTA7ZWxzZSBpZighZndkJiYob3B0cy5sYXN0Rng9PT11bmRlZmluZWR8fC0tb3B0cy5sYXN0Rng8MCkpCm9wdHMubGFzdEZ4PW9wdHMuZnhzLmxlbmd0aC0xO2Z4PW9wdHMuZnhzW29wdHMubGFzdEZ4XX0KaWYob3B0cy5vbmVUaW1lRngpe2Z4PW9wdHMub25lVGltZUZ4O29wdHMub25lVGltZUZ4PW51bGx9CiQuZm4uY3ljbGUucmVzZXRTdGF0ZShvcHRzLGZ4KTtpZihvcHRzLmJlZm9yZS5sZW5ndGgpCiQuZWFjaChvcHRzLmJlZm9yZSxmdW5jdGlvbihpLG8pe2lmKHAuY3ljbGVTdG9wIT1vcHRzLnN0b3BDb3VudClyZXR1cm47by5hcHBseShuZXh0LFtjdXJyLG5leHQsb3B0cyxmd2RdKX0pO3ZhciBhZnRlcj1mdW5jdGlvbigpe29wdHMuYnVzeT0wOyQuZWFjaChvcHRzLmFmdGVyLGZ1bmN0aW9uKGksbyl7aWYocC5jeWNsZVN0b3AhPW9wdHMuc3RvcENvdW50KXJldHVybjtvLmFwcGx5KG5leHQsW2N1cnIsbmV4dCxvcHRzLGZ3ZF0pfSk7aWYoIXAuY3ljbGVTdG9wKXtxdWV1ZU5leHQoKX19O2RlYnVnKCd0eCBmaXJpbmcoJytmeCsnKTsgY3VyclNsaWRlOiAnK29wdHMuY3VyclNsaWRlKyc7IG5leHRTbGlkZTogJytvcHRzLm5leHRTbGlkZSk7b3B0cy5idXN5PTE7aWYob3B0cy5meEZuKQpvcHRzLmZ4Rm4oY3VycixuZXh0LG9wdHMsYWZ0ZXIsZndkLG1hbnVhbCYmb3B0cy5mYXN0T25FdmVudCk7ZWxzZSBpZigkLmlzRnVuY3Rpb24oJC5mbi5jeWNsZVtvcHRzLmZ4XSkpCiQuZm4uY3ljbGVbb3B0cy5meF0oY3VycixuZXh0LG9wdHMsYWZ0ZXIsZndkLG1hbnVhbCYmb3B0cy5mYXN0T25FdmVudCk7ZWxzZSAkLmZuLmN5Y2xlLmN1c3RvbShjdXJyLG5leHQsb3B0cyxhZnRlcixmd2QsbWFudWFsJiZvcHRzLmZhc3RPbkV2ZW50KX0KZWxzZXtxdWV1ZU5leHQoKX0KaWYoY2hhbmdlZHx8b3B0cy5uZXh0U2xpZGU9PW9wdHMuY3VyclNsaWRlKXt2YXIgcm9sbDtvcHRzLmxhc3RTbGlkZT1vcHRzLmN1cnJTbGlkZTtpZihvcHRzLnJhbmRvbSl7b3B0cy5jdXJyU2xpZGU9b3B0cy5uZXh0U2xpZGU7aWYoKytvcHRzLnJhbmRvbUluZGV4PT1lbHMubGVuZ3RoKXtvcHRzLnJhbmRvbUluZGV4PTA7b3B0cy5yYW5kb21NYXAuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLnJhbmRvbSgpLTAuNX0pfQpvcHRzLm5leHRTbGlkZT1vcHRzLnJhbmRvbU1hcFtvcHRzLnJhbmRvbUluZGV4XTtpZihvcHRzLm5leHRTbGlkZT09b3B0cy5jdXJyU2xpZGUpCm9wdHMubmV4dFNsaWRlPShvcHRzLmN1cnJTbGlkZT09b3B0cy5zbGlkZUNvdW50LTEpPzA6b3B0cy5jdXJyU2xpZGUrMX0KZWxzZSBpZihvcHRzLmJhY2t3YXJkcyl7cm9sbD0ob3B0cy5uZXh0U2xpZGUtMSk8MDtpZihyb2xsJiZvcHRzLmJvdW5jZSl7b3B0cy5iYWNrd2FyZHM9IW9wdHMuYmFja3dhcmRzO29wdHMubmV4dFNsaWRlPTE7b3B0cy5jdXJyU2xpZGU9MH0KZWxzZXtvcHRzLm5leHRTbGlkZT1yb2xsPyhlbHMubGVuZ3RoLTEpOm9wdHMubmV4dFNsaWRlLTE7b3B0cy5jdXJyU2xpZGU9cm9sbD8wOm9wdHMubmV4dFNsaWRlKzF9fQplbHNle3JvbGw9KG9wdHMubmV4dFNsaWRlKzEpPT1lbHMubGVuZ3RoO2lmKHJvbGwmJm9wdHMuYm91bmNlKXtvcHRzLmJhY2t3YXJkcz0hb3B0cy5iYWNrd2FyZHM7b3B0cy5uZXh0U2xpZGU9ZWxzLmxlbmd0aC0yO29wdHMuY3VyclNsaWRlPWVscy5sZW5ndGgtMX0KZWxzZXtvcHRzLm5leHRTbGlkZT1yb2xsPzA6b3B0cy5uZXh0U2xpZGUrMTtvcHRzLmN1cnJTbGlkZT1yb2xsP2Vscy5sZW5ndGgtMTpvcHRzLm5leHRTbGlkZS0xfX19CmlmKGNoYW5nZWQmJm9wdHMucGFnZXIpCm9wdHMudXBkYXRlQWN0aXZlUGFnZXJMaW5rKG9wdHMucGFnZXIsb3B0cy5jdXJyU2xpZGUsb3B0cy5hY3RpdmVQYWdlckNsYXNzKTtmdW5jdGlvbiBxdWV1ZU5leHQoKXt2YXIgbXM9MCx0aW1lb3V0PW9wdHMudGltZW91dDtpZihvcHRzLnRpbWVvdXQmJiFvcHRzLmNvbnRpbnVvdXMpe21zPWdldFRpbWVvdXQoZWxzW29wdHMuY3VyclNsaWRlXSxlbHNbb3B0cy5uZXh0U2xpZGVdLG9wdHMsZndkKTtpZihvcHRzLmZ4PT0nc2h1ZmZsZScpCm1zLT1vcHRzLnNwZWVkT3V0fQplbHNlIGlmKG9wdHMuY29udGludW91cyYmcC5jeWNsZVBhdXNlKQptcz0xMDtpZihtcz4wKQpwLmN5Y2xlVGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Z28oZWxzLG9wdHMsMCwhb3B0cy5iYWNrd2FyZHMpfSxtcyl9fQokLmZuLmN5Y2xlLnVwZGF0ZUFjdGl2ZVBhZ2VyTGluaz1mdW5jdGlvbihwYWdlcixjdXJyU2xpZGUsY2xzTmFtZSl7JChwYWdlcikuZWFjaChmdW5jdGlvbigpeyQodGhpcykuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcyhjbHNOYW1lKS5lcShjdXJyU2xpZGUpLmFkZENsYXNzKGNsc05hbWUpfSl9O2Z1bmN0aW9uIGdldFRpbWVvdXQoY3VycixuZXh0LG9wdHMsZndkKXtpZihvcHRzLnRpbWVvdXRGbil7dmFyIHQ9b3B0cy50aW1lb3V0Rm4uY2FsbChjdXJyLGN1cnIsbmV4dCxvcHRzLGZ3ZCk7d2hpbGUob3B0cy5meCE9J25vbmUnJiYodC1vcHRzLnNwZWVkKTwyNTApCnQrPW9wdHMuc3BlZWQ7ZGVidWcoJ2NhbGN1bGF0ZWQgdGltZW91dDogJyt0Kyc7IHNwZWVkOiAnK29wdHMuc3BlZWQpO2lmKHQhPT0hMSkKcmV0dXJuIHR9CnJldHVybiBvcHRzLnRpbWVvdXR9CiQuZm4uY3ljbGUubmV4dD1mdW5jdGlvbihvcHRzKXthZHZhbmNlKG9wdHMsMSl9OyQuZm4uY3ljbGUucHJldj1mdW5jdGlvbihvcHRzKXthZHZhbmNlKG9wdHMsMCl9O2Z1bmN0aW9uIGFkdmFuY2Uob3B0cyxtb3ZlRm9yd2FyZCl7dmFyIHZhbD1tb3ZlRm9yd2FyZD8xOi0xO3ZhciBlbHM9b3B0cy5lbGVtZW50czt2YXIgcD1vcHRzLiRjb250WzBdLHRpbWVvdXQ9cC5jeWNsZVRpbWVvdXQ7aWYodGltZW91dCl7Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO3AuY3ljbGVUaW1lb3V0PTB9CmlmKG9wdHMucmFuZG9tJiZ2YWw8MCl7b3B0cy5yYW5kb21JbmRleC0tO2lmKC0tb3B0cy5yYW5kb21JbmRleD09LTIpCm9wdHMucmFuZG9tSW5kZXg9ZWxzLmxlbmd0aC0yO2Vsc2UgaWYob3B0cy5yYW5kb21JbmRleD09LTEpCm9wdHMucmFuZG9tSW5kZXg9ZWxzLmxlbmd0aC0xO29wdHMubmV4dFNsaWRlPW9wdHMucmFuZG9tTWFwW29wdHMucmFuZG9tSW5kZXhdfQplbHNlIGlmKG9wdHMucmFuZG9tKXtvcHRzLm5leHRTbGlkZT1vcHRzLnJhbmRvbU1hcFtvcHRzLnJhbmRvbUluZGV4XX0KZWxzZXtvcHRzLm5leHRTbGlkZT1vcHRzLmN1cnJTbGlkZSt2YWw7aWYob3B0cy5uZXh0U2xpZGU8MCl7aWYob3B0cy5ub3dyYXApcmV0dXJuITE7b3B0cy5uZXh0U2xpZGU9ZWxzLmxlbmd0aC0xfQplbHNlIGlmKG9wdHMubmV4dFNsaWRlPj1lbHMubGVuZ3RoKXtpZihvcHRzLm5vd3JhcClyZXR1cm4hMTtvcHRzLm5leHRTbGlkZT0wfX0KdmFyIGNiPW9wdHMub25QcmV2TmV4dEV2ZW50fHxvcHRzLnByZXZOZXh0Q2xpY2s7aWYoJC5pc0Z1bmN0aW9uKGNiKSkKY2IodmFsPjAsb3B0cy5uZXh0U2xpZGUsZWxzW29wdHMubmV4dFNsaWRlXSk7Z28oZWxzLG9wdHMsMSxtb3ZlRm9yd2FyZCk7cmV0dXJuITF9CmZ1bmN0aW9uIGJ1aWxkUGFnZXIoZWxzLG9wdHMpe3ZhciAkcD0kKG9wdHMucGFnZXIpOyQuZWFjaChlbHMsZnVuY3Rpb24oaSxvKXskLmZuLmN5Y2xlLmNyZWF0ZVBhZ2VyQW5jaG9yKGksbywkcCxlbHMsb3B0cyl9KTtvcHRzLnVwZGF0ZUFjdGl2ZVBhZ2VyTGluayhvcHRzLnBhZ2VyLG9wdHMuc3RhcnRpbmdTbGlkZSxvcHRzLmFjdGl2ZVBhZ2VyQ2xhc3MpfQokLmZuLmN5Y2xlLmNyZWF0ZVBhZ2VyQW5jaG9yPWZ1bmN0aW9uKGksZWwsJHAsZWxzLG9wdHMpe3ZhciBhO2lmKCQuaXNGdW5jdGlvbihvcHRzLnBhZ2VyQW5jaG9yQnVpbGRlcikpe2E9b3B0cy5wYWdlckFuY2hvckJ1aWxkZXIoaSxlbCk7ZGVidWcoJ3BhZ2VyQW5jaG9yQnVpbGRlcignK2krJywgZWwpIHJldHVybmVkOiAnK2EpfQplbHNlIGE9JzxhIGhyZWY9IiMiPicrKGkrMSkrJzwvYT4nO2lmKCFhKQpyZXR1cm47dmFyICRhPSQoYSk7aWYoJGEucGFyZW50cygnYm9keScpLmxlbmd0aD09PTApe3ZhciBhcnI9W107aWYoJHAubGVuZ3RoPjEpeyRwLmVhY2goZnVuY3Rpb24oKXt2YXIgJGNsb25lPSRhLmNsb25lKCEwKTskKHRoaXMpLmFwcGVuZCgkY2xvbmUpO2Fyci5wdXNoKCRjbG9uZVswXSl9KTskYT0kKGFycil9CmVsc2V7JGEuYXBwZW5kVG8oJHApfX0Kb3B0cy5wYWdlckFuY2hvcnM9b3B0cy5wYWdlckFuY2hvcnN8fFtdO29wdHMucGFnZXJBbmNob3JzLnB1c2goJGEpO3ZhciBwYWdlckZuPWZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKTtvcHRzLm5leHRTbGlkZT1pO3ZhciBwPW9wdHMuJGNvbnRbMF0sdGltZW91dD1wLmN5Y2xlVGltZW91dDtpZih0aW1lb3V0KXtjbGVhclRpbWVvdXQodGltZW91dCk7cC5jeWNsZVRpbWVvdXQ9MH0KdmFyIGNiPW9wdHMub25QYWdlckV2ZW50fHxvcHRzLnBhZ2VyQ2xpY2s7aWYoJC5pc0Z1bmN0aW9uKGNiKSkKY2Iob3B0cy5uZXh0U2xpZGUsZWxzW29wdHMubmV4dFNsaWRlXSk7Z28oZWxzLG9wdHMsMSxvcHRzLmN1cnJTbGlkZTxpKX07aWYoL21vdXNlZW50ZXJ8bW91c2VvdmVyL2kudGVzdChvcHRzLnBhZ2VyRXZlbnQpKXskYS5ob3ZlcihwYWdlckZuLGZ1bmN0aW9uKCl7fSl9CmVsc2V7JGEuYmluZChvcHRzLnBhZ2VyRXZlbnQscGFnZXJGbil9CmlmKCEvXmNsaWNrLy50ZXN0KG9wdHMucGFnZXJFdmVudCkmJiFvcHRzLmFsbG93UGFnZXJDbGlja0J1YmJsZSkKJGEuYmluZCgnY2xpY2suY3ljbGUnLGZ1bmN0aW9uKCl7cmV0dXJuITF9KTt2YXIgY29udD1vcHRzLiRjb250WzBdO3ZhciBwYXVzZUZsYWc9ITE7aWYob3B0cy5wYXVzZU9uUGFnZXJIb3Zlcil7JGEuaG92ZXIoZnVuY3Rpb24oKXtwYXVzZUZsYWc9ITA7Y29udC5jeWNsZVBhdXNlKys7dHJpZ2dlclBhdXNlKGNvbnQsITAsITApfSxmdW5jdGlvbigpe2lmKHBhdXNlRmxhZykKY29udC5jeWNsZVBhdXNlLS07dHJpZ2dlclBhdXNlKGNvbnQsITAsITApfSl9fTskLmZuLmN5Y2xlLmhvcHNGcm9tTGFzdD1mdW5jdGlvbihvcHRzLGZ3ZCl7dmFyIGhvcHMsbD1vcHRzLmxhc3RTbGlkZSxjPW9wdHMuY3VyclNsaWRlO2lmKGZ3ZCkKaG9wcz1jPmw/Yy1sOm9wdHMuc2xpZGVDb3VudC1sO2Vsc2UgaG9wcz1jPGw/bC1jOmwrb3B0cy5zbGlkZUNvdW50LWM7cmV0dXJuIGhvcHN9O2Z1bmN0aW9uIGNsZWFyVHlwZUZpeCgkc2xpZGVzKXtkZWJ1ZygnYXBwbHlpbmcgY2xlYXJUeXBlIGJhY2tncm91bmQtY29sb3IgaGFjaycpO2Z1bmN0aW9uIGhleChzKXtzPXBhcnNlSW50KHMsMTApLnRvU3RyaW5nKDE2KTtyZXR1cm4gcy5sZW5ndGg8Mj8nMCcrczpzfQpmdW5jdGlvbiBnZXRCZyhlKXtmb3IoO2UmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9J2h0bWwnO2U9ZS5wYXJlbnROb2RlKXt2YXIgdj0kLmNzcyhlLCdiYWNrZ3JvdW5kLWNvbG9yJyk7aWYodiYmdi5pbmRleE9mKCdyZ2InKT49MCl7dmFyIHJnYj12Lm1hdGNoKC9cZCsvZyk7cmV0dXJuJyMnK2hleChyZ2JbMF0pK2hleChyZ2JbMV0pK2hleChyZ2JbMl0pfQppZih2JiZ2IT0ndHJhbnNwYXJlbnQnKQpyZXR1cm4gdn0KcmV0dXJuJyNmZmZmZmYnfQokc2xpZGVzLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsZ2V0QmcodGhpcykpfSl9CiQuZm4uY3ljbGUuY29tbW9uUmVzZXQ9ZnVuY3Rpb24oY3VycixuZXh0LG9wdHMsdyxoLHJldil7JChvcHRzLmVsZW1lbnRzKS5ub3QoY3VycikuaGlkZSgpO2lmKHR5cGVvZiBvcHRzLmNzc0JlZm9yZS5vcGFjaXR5PT0ndW5kZWZpbmVkJykKb3B0cy5jc3NCZWZvcmUub3BhY2l0eT0xO29wdHMuY3NzQmVmb3JlLmRpc3BsYXk9J2Jsb2NrJztpZihvcHRzLnNsaWRlUmVzaXplJiZ3IT09ITEmJm5leHQuY3ljbGVXPjApCm9wdHMuY3NzQmVmb3JlLndpZHRoPW5leHQuY3ljbGVXO2lmKG9wdHMuc2xpZGVSZXNpemUmJmghPT0hMSYmbmV4dC5jeWNsZUg+MCkKb3B0cy5jc3NCZWZvcmUuaGVpZ2h0PW5leHQuY3ljbGVIO29wdHMuY3NzQWZ0ZXI9b3B0cy5jc3NBZnRlcnx8e307b3B0cy5jc3NBZnRlci5kaXNwbGF5PSdub25lJzskKGN1cnIpLmNzcygnekluZGV4JyxvcHRzLnNsaWRlQ291bnQrKHJldj09PSEwPzE6MCkpOyQobmV4dCkuY3NzKCd6SW5kZXgnLG9wdHMuc2xpZGVDb3VudCsocmV2PT09ITA/MDoxKSl9OyQuZm4uY3ljbGUuY3VzdG9tPWZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzLGNiLGZ3ZCxzcGVlZE92ZXJyaWRlKXt2YXIgJGw9JChjdXJyKSwkbj0kKG5leHQpO3ZhciBzcGVlZEluPW9wdHMuc3BlZWRJbixzcGVlZE91dD1vcHRzLnNwZWVkT3V0LGVhc2VJbj1vcHRzLmVhc2VJbixlYXNlT3V0PW9wdHMuZWFzZU91dCxhbmltSW5EZWxheT1vcHRzLmFuaW1JbkRlbGF5LGFuaW1PdXREZWxheT1vcHRzLmFuaW1PdXREZWxheTskbi5jc3Mob3B0cy5jc3NCZWZvcmUpO2lmKHNwZWVkT3ZlcnJpZGUpe2lmKHR5cGVvZiBzcGVlZE92ZXJyaWRlPT0nbnVtYmVyJykKc3BlZWRJbj1zcGVlZE91dD1zcGVlZE92ZXJyaWRlO2Vsc2Ugc3BlZWRJbj1zcGVlZE91dD0xO2Vhc2VJbj1lYXNlT3V0PW51bGx9CnZhciBmbj1mdW5jdGlvbigpeyRuLmRlbGF5KGFuaW1JbkRlbGF5KS5hbmltYXRlKG9wdHMuYW5pbUluLHNwZWVkSW4sZWFzZUluLGZ1bmN0aW9uKCl7Y2IoKX0pfTskbC5kZWxheShhbmltT3V0RGVsYXkpLmFuaW1hdGUob3B0cy5hbmltT3V0LHNwZWVkT3V0LGVhc2VPdXQsZnVuY3Rpb24oKXskbC5jc3Mob3B0cy5jc3NBZnRlcik7aWYoIW9wdHMuc3luYykKZm4oKX0pO2lmKG9wdHMuc3luYylmbigpfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zPXtmYWRlOmZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7JHNsaWRlcy5ub3QoJzplcSgnK29wdHMuY3VyclNsaWRlKycpJykuY3NzKCdvcGFjaXR5JywwKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzKTtvcHRzLmNzc0JlZm9yZS5vcGFjaXR5PTB9KTtvcHRzLmFuaW1Jbj17b3BhY2l0eToxfTtvcHRzLmFuaW1PdXQ9e29wYWNpdHk6MH07b3B0cy5jc3NCZWZvcmU9e3RvcDowLGxlZnQ6MH19fTskLmZuLmN5Y2xlLnZlcj1mdW5jdGlvbigpe3JldHVybiB2ZXJ9OyQuZm4uY3ljbGUuZGVmYXVsdHM9e2FjdGl2ZVBhZ2VyQ2xhc3M6J2FjdGl2ZVNsaWRlJyxhZnRlcjpudWxsLGFsbG93UGFnZXJDbGlja0J1YmJsZTohMSxhbmltSW46bnVsbCxhbmltSW5EZWxheTowLGFuaW1PdXQ6bnVsbCxhbmltT3V0RGVsYXk6MCxhc3BlY3Q6ITEsYXV0b3N0b3A6MCxhdXRvc3RvcENvdW50OjAsYmFja3dhcmRzOiExLGJlZm9yZTpudWxsLGNlbnRlcjpudWxsLGNsZWFydHlwZTohJC5zdXBwb3J0Lm9wYWNpdHksY2xlYXJ0eXBlTm9CZzohMSxjb250YWluZXJSZXNpemU6MSxjb250YWluZXJSZXNpemVIZWlnaHQ6MCxjb250aW51b3VzOjAsY3NzQWZ0ZXI6bnVsbCxjc3NCZWZvcmU6bnVsbCxkZWxheTowLGVhc2VJbjpudWxsLGVhc2VPdXQ6bnVsbCxlYXNpbmc6bnVsbCxlbmQ6bnVsbCxmYXN0T25FdmVudDowLGZpdDowLGZ4OidmYWRlJyxmeEZuOm51bGwsaGVpZ2h0OidhdXRvJyxtYW51YWxUcnVtcDohMCxtZXRhQXR0cjonY3ljbGUnLG5leHQ6bnVsbCxub3dyYXA6MCxvblBhZ2VyRXZlbnQ6bnVsbCxvblByZXZOZXh0RXZlbnQ6bnVsbCxwYWdlcjpudWxsLHBhZ2VyQW5jaG9yQnVpbGRlcjpudWxsLHBhZ2VyRXZlbnQ6J2NsaWNrLmN5Y2xlJyxwYXVzZTowLHBhdXNlT25QYWdlckhvdmVyOjAscHJldjpudWxsLHByZXZOZXh0RXZlbnQ6J2NsaWNrLmN5Y2xlJyxyYW5kb206MCxyYW5kb21pemVFZmZlY3RzOjEscmVxdWV1ZU9uSW1hZ2VOb3RMb2FkZWQ6ITAscmVxdWV1ZVRpbWVvdXQ6MjUwLHJldjowLHNodWZmbGU6bnVsbCxza2lwSW5pdGlhbGl6YXRpb25DYWxsYmFja3M6ITEsc2xpZGVFeHByOm51bGwsc2xpZGVSZXNpemU6MSxzcGVlZDoxMDAwLHNwZWVkSW46bnVsbCxzcGVlZE91dDpudWxsLHN0YXJ0aW5nU2xpZGU6dW5kZWZpbmVkLHN5bmM6MSx0aW1lb3V0OjQwMDAsdGltZW91dEZuOm51bGwsdXBkYXRlQWN0aXZlUGFnZXJMaW5rOm51bGwsd2lkdGg6bnVsbH19KShqUXVlcnkpOyhmdW5jdGlvbigkKXsidXNlIHN0cmljdCI7JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5ub25lPWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7b3B0cy5meEZuPWZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzLGFmdGVyKXskKG5leHQpLnNob3coKTskKGN1cnIpLmhpZGUoKTthZnRlcigpfX07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5mYWRlb3V0PWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7JHNsaWRlcy5ub3QoJzplcSgnK29wdHMuY3VyclNsaWRlKycpJykuY3NzKHtkaXNwbGF5OidibG9jaycsJ29wYWNpdHknOjF9KTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzLHcsaCxyZXYpeyQoY3VycikuY3NzKCd6SW5kZXgnLG9wdHMuc2xpZGVDb3VudCsocmV2IT09ITA/MTowKSk7JChuZXh0KS5jc3MoJ3pJbmRleCcsb3B0cy5zbGlkZUNvdW50KyhyZXYhPT0hMD8wOjEpKX0pO29wdHMuYW5pbUluLm9wYWNpdHk9MTtvcHRzLmFuaW1PdXQub3BhY2l0eT0wO29wdHMuY3NzQmVmb3JlLm9wYWNpdHk9MTtvcHRzLmNzc0JlZm9yZS5kaXNwbGF5PSdibG9jayc7b3B0cy5jc3NBZnRlci56SW5kZXg9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5zY3JvbGxVcD1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpeyRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKTtvcHRzLmJlZm9yZS5wdXNoKCQuZm4uY3ljbGUuY29tbW9uUmVzZXQpO3ZhciBoPSRjb250LmhlaWdodCgpO29wdHMuY3NzQmVmb3JlLnRvcD1oO29wdHMuY3NzQmVmb3JlLmxlZnQ9MDtvcHRzLmNzc0ZpcnN0LnRvcD0wO29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbU91dC50b3A9LWh9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2Nyb2xsRG93bj1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpeyRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKTtvcHRzLmJlZm9yZS5wdXNoKCQuZm4uY3ljbGUuY29tbW9uUmVzZXQpO3ZhciBoPSRjb250LmhlaWdodCgpO29wdHMuY3NzRmlyc3QudG9wPTA7b3B0cy5jc3NCZWZvcmUudG9wPS1oO29wdHMuY3NzQmVmb3JlLmxlZnQ9MDtvcHRzLmFuaW1Jbi50b3A9MDtvcHRzLmFuaW1PdXQudG9wPWh9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2Nyb2xsTGVmdD1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpeyRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKTtvcHRzLmJlZm9yZS5wdXNoKCQuZm4uY3ljbGUuY29tbW9uUmVzZXQpO3ZhciB3PSRjb250LndpZHRoKCk7b3B0cy5jc3NGaXJzdC5sZWZ0PTA7b3B0cy5jc3NCZWZvcmUubGVmdD13O29wdHMuY3NzQmVmb3JlLnRvcD0wO29wdHMuYW5pbUluLmxlZnQ9MDtvcHRzLmFuaW1PdXQubGVmdD0wLXd9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2Nyb2xsUmlnaHQ9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXskY29udC5jc3MoJ292ZXJmbG93JywnaGlkZGVuJyk7b3B0cy5iZWZvcmUucHVzaCgkLmZuLmN5Y2xlLmNvbW1vblJlc2V0KTt2YXIgdz0kY29udC53aWR0aCgpO29wdHMuY3NzRmlyc3QubGVmdD0wO29wdHMuY3NzQmVmb3JlLmxlZnQ9LXc7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5hbmltSW4ubGVmdD0wO29wdHMuYW5pbU91dC5sZWZ0PXd9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2Nyb2xsSG9yej1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpeyRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKS53aWR0aCgpO29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMsZndkKXtpZihvcHRzLnJldikKZndkPSFmd2Q7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cyk7b3B0cy5jc3NCZWZvcmUubGVmdD1md2Q/KG5leHQuY3ljbGVXLTEpOigxLW5leHQuY3ljbGVXKTtvcHRzLmFuaW1PdXQubGVmdD1md2Q/LWN1cnIuY3ljbGVXOmN1cnIuY3ljbGVXfSk7b3B0cy5jc3NGaXJzdC5sZWZ0PTA7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5hbmltSW4ubGVmdD0wO29wdHMuYW5pbU91dC50b3A9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5zY3JvbGxWZXJ0PWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7JGNvbnQuY3NzKCdvdmVyZmxvdycsJ2hpZGRlbicpO29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMsZndkKXtpZihvcHRzLnJldikKZndkPSFmd2Q7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cyk7b3B0cy5jc3NCZWZvcmUudG9wPWZ3ZD8oMS1uZXh0LmN5Y2xlSCk6KG5leHQuY3ljbGVILTEpO29wdHMuYW5pbU91dC50b3A9ZndkP2N1cnIuY3ljbGVIOi1jdXJyLmN5Y2xlSH0pO29wdHMuY3NzRmlyc3QudG9wPTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wO29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbU91dC5sZWZ0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2xpZGVYPWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7b3B0cy5iZWZvcmUucHVzaChmdW5jdGlvbihjdXJyLG5leHQsb3B0cyl7JChvcHRzLmVsZW1lbnRzKS5ub3QoY3VycikuaGlkZSgpOyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITEsITApO29wdHMuYW5pbUluLndpZHRoPW5leHQuY3ljbGVXfSk7b3B0cy5jc3NCZWZvcmUubGVmdD0wO29wdHMuY3NzQmVmb3JlLnRvcD0wO29wdHMuY3NzQmVmb3JlLndpZHRoPTA7b3B0cy5hbmltSW4ud2lkdGg9J3Nob3cnO29wdHMuYW5pbU91dC53aWR0aD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnNsaWRlWT1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQob3B0cy5lbGVtZW50cykubm90KGN1cnIpLmhpZGUoKTskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCExKTtvcHRzLmFuaW1Jbi5oZWlnaHQ9bmV4dC5jeWNsZUh9KTtvcHRzLmNzc0JlZm9yZS5sZWZ0PTA7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5hbmltSW4uaGVpZ2h0PSdzaG93JztvcHRzLmFuaW1PdXQuaGVpZ2h0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2h1ZmZsZT1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe3ZhciBpLHc9JGNvbnQuY3NzKCdvdmVyZmxvdycsJ3Zpc2libGUnKS53aWR0aCgpOyRzbGlkZXMuY3NzKHtsZWZ0OjAsdG9wOjB9KTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCEwLCEwKX0pO2lmKCFvcHRzLnNwZWVkQWRqdXN0ZWQpe29wdHMuc3BlZWQ9b3B0cy5zcGVlZC8yO29wdHMuc3BlZWRBZGp1c3RlZD0hMH0Kb3B0cy5yYW5kb209MDtvcHRzLnNodWZmbGU9b3B0cy5zaHVmZmxlfHx7bGVmdDotdyx0b3A6MTV9O29wdHMuZWxzPVtdO2ZvcihpPTA7aTwkc2xpZGVzLmxlbmd0aDtpKyspCm9wdHMuZWxzLnB1c2goJHNsaWRlc1tpXSk7Zm9yKGk9MDtpPG9wdHMuY3VyclNsaWRlO2krKykKb3B0cy5lbHMucHVzaChvcHRzLmVscy5zaGlmdCgpKTtvcHRzLmZ4Rm49ZnVuY3Rpb24oY3VycixuZXh0LG9wdHMsY2IsZndkKXtpZihvcHRzLnJldikKZndkPSFmd2Q7dmFyICRlbD1md2Q/JChjdXJyKTokKG5leHQpOyQobmV4dCkuY3NzKG9wdHMuY3NzQmVmb3JlKTt2YXIgY291bnQ9b3B0cy5zbGlkZUNvdW50OyRlbC5hbmltYXRlKG9wdHMuc2h1ZmZsZSxvcHRzLnNwZWVkSW4sb3B0cy5lYXNlSW4sZnVuY3Rpb24oKXt2YXIgaG9wcz0kLmZuLmN5Y2xlLmhvcHNGcm9tTGFzdChvcHRzLGZ3ZCk7Zm9yKHZhciBrPTA7azxob3BzO2srKyl7aWYoZndkKQpvcHRzLmVscy5wdXNoKG9wdHMuZWxzLnNoaWZ0KCkpO2Vsc2Ugb3B0cy5lbHMudW5zaGlmdChvcHRzLmVscy5wb3AoKSl9CmlmKGZ3ZCl7Zm9yKHZhciBpPTAsbGVuPW9wdHMuZWxzLmxlbmd0aDtpPGxlbjtpKyspCiQob3B0cy5lbHNbaV0pLmNzcygnei1pbmRleCcsbGVuLWkrY291bnQpO30KZWxzZXt2YXIgej0kKGN1cnIpLmNzcygnei1pbmRleCcpOyRlbC5jc3MoJ3otaW5kZXgnLHBhcnNlSW50KHosMTApKzErY291bnQpfQokZWwuYW5pbWF0ZSh7bGVmdDowLHRvcDowfSxvcHRzLnNwZWVkT3V0LG9wdHMuZWFzZU91dCxmdW5jdGlvbigpeyQoZndkP3RoaXM6Y3VycikuaGlkZSgpO2lmKGNiKWNiKCl9KX0pfTskLmV4dGVuZChvcHRzLmNzc0JlZm9yZSx7ZGlzcGxheTonYmxvY2snLG9wYWNpdHk6MSx0b3A6MCxsZWZ0OjB9KX07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy50dXJuVXA9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCExKTtvcHRzLmNzc0JlZm9yZS50b3A9bmV4dC5jeWNsZUg7b3B0cy5hbmltSW4uaGVpZ2h0PW5leHQuY3ljbGVIO29wdHMuYW5pbU91dC53aWR0aD1uZXh0LmN5Y2xlV30pO29wdHMuY3NzRmlyc3QudG9wPTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wO29wdHMuY3NzQmVmb3JlLmhlaWdodD0wO29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbU91dC5oZWlnaHQ9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy50dXJuRG93bj1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITAsITEpO29wdHMuYW5pbUluLmhlaWdodD1uZXh0LmN5Y2xlSDtvcHRzLmFuaW1PdXQudG9wPWN1cnIuY3ljbGVIfSk7b3B0cy5jc3NGaXJzdC50b3A9MDtvcHRzLmNzc0JlZm9yZS5sZWZ0PTA7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5hbmltT3V0LmhlaWdodD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnR1cm5MZWZ0PWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7b3B0cy5iZWZvcmUucHVzaChmdW5jdGlvbihjdXJyLG5leHQsb3B0cyl7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cywhMSwhMCk7b3B0cy5jc3NCZWZvcmUubGVmdD1uZXh0LmN5Y2xlVztvcHRzLmFuaW1Jbi53aWR0aD1uZXh0LmN5Y2xlV30pO29wdHMuY3NzQmVmb3JlLnRvcD0wO29wdHMuY3NzQmVmb3JlLndpZHRoPTA7b3B0cy5hbmltSW4ubGVmdD0wO29wdHMuYW5pbU91dC53aWR0aD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnR1cm5SaWdodD1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITEsITApO29wdHMuYW5pbUluLndpZHRoPW5leHQuY3ljbGVXO29wdHMuYW5pbU91dC5sZWZ0PWN1cnIuY3ljbGVXfSk7JC5leHRlbmQob3B0cy5jc3NCZWZvcmUse3RvcDowLGxlZnQ6MCx3aWR0aDowfSk7b3B0cy5hbmltSW4ubGVmdD0wO29wdHMuYW5pbU91dC53aWR0aD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnpvb209ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCExLCExLCEwKTtvcHRzLmNzc0JlZm9yZS50b3A9bmV4dC5jeWNsZUgvMjtvcHRzLmNzc0JlZm9yZS5sZWZ0PW5leHQuY3ljbGVXLzI7JC5leHRlbmQob3B0cy5hbmltSW4se3RvcDowLGxlZnQ6MCx3aWR0aDpuZXh0LmN5Y2xlVyxoZWlnaHQ6bmV4dC5jeWNsZUh9KTskLmV4dGVuZChvcHRzLmFuaW1PdXQse3dpZHRoOjAsaGVpZ2h0OjAsdG9wOmN1cnIuY3ljbGVILzIsbGVmdDpjdXJyLmN5Y2xlVy8yfSl9KTtvcHRzLmNzc0ZpcnN0LnRvcD0wO29wdHMuY3NzRmlyc3QubGVmdD0wO29wdHMuY3NzQmVmb3JlLndpZHRoPTA7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuZmFkZVpvb209ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCExLCExKTtvcHRzLmNzc0JlZm9yZS5sZWZ0PW5leHQuY3ljbGVXLzI7b3B0cy5jc3NCZWZvcmUudG9wPW5leHQuY3ljbGVILzI7JC5leHRlbmQob3B0cy5hbmltSW4se3RvcDowLGxlZnQ6MCx3aWR0aDpuZXh0LmN5Y2xlVyxoZWlnaHQ6bmV4dC5jeWNsZUh9KX0pO29wdHMuY3NzQmVmb3JlLndpZHRoPTA7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5hbmltT3V0Lm9wYWNpdHk9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5ibGluZFg9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXt2YXIgdz0kY29udC5jc3MoJ292ZXJmbG93JywnaGlkZGVuJykud2lkdGgoKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzKTtvcHRzLmFuaW1Jbi53aWR0aD1uZXh0LmN5Y2xlVztvcHRzLmFuaW1PdXQubGVmdD1jdXJyLmN5Y2xlV30pO29wdHMuY3NzQmVmb3JlLmxlZnQ9dztvcHRzLmNzc0JlZm9yZS50b3A9MDtvcHRzLmFuaW1Jbi5sZWZ0PTA7b3B0cy5hbmltT3V0LmxlZnQ9d307JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5ibGluZFk9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXt2YXIgaD0kY29udC5jc3MoJ292ZXJmbG93JywnaGlkZGVuJykuaGVpZ2h0KCk7b3B0cy5iZWZvcmUucHVzaChmdW5jdGlvbihjdXJyLG5leHQsb3B0cyl7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cyk7b3B0cy5hbmltSW4uaGVpZ2h0PW5leHQuY3ljbGVIO29wdHMuYW5pbU91dC50b3A9Y3Vyci5jeWNsZUh9KTtvcHRzLmNzc0JlZm9yZS50b3A9aDtvcHRzLmNzc0JlZm9yZS5sZWZ0PTA7b3B0cy5hbmltSW4udG9wPTA7b3B0cy5hbmltT3V0LnRvcD1ofTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLmJsaW5kWj1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe3ZhciBoPSRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKS5oZWlnaHQoKTt2YXIgdz0kY29udC53aWR0aCgpO29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMpO29wdHMuYW5pbUluLmhlaWdodD1uZXh0LmN5Y2xlSDtvcHRzLmFuaW1PdXQudG9wPWN1cnIuY3ljbGVIfSk7b3B0cy5jc3NCZWZvcmUudG9wPWg7b3B0cy5jc3NCZWZvcmUubGVmdD13O29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbUluLmxlZnQ9MDtvcHRzLmFuaW1PdXQudG9wPWg7b3B0cy5hbmltT3V0LmxlZnQ9d307JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5ncm93WD1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITEsITApO29wdHMuY3NzQmVmb3JlLmxlZnQ9dGhpcy5jeWNsZVcvMjtvcHRzLmFuaW1Jbi5sZWZ0PTA7b3B0cy5hbmltSW4ud2lkdGg9dGhpcy5jeWNsZVc7b3B0cy5hbmltT3V0LmxlZnQ9MH0pO29wdHMuY3NzQmVmb3JlLnRvcD0wO29wdHMuY3NzQmVmb3JlLndpZHRoPTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuZ3Jvd1k9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCExKTtvcHRzLmNzc0JlZm9yZS50b3A9dGhpcy5jeWNsZUgvMjtvcHRzLmFuaW1Jbi50b3A9MDtvcHRzLmFuaW1Jbi5oZWlnaHQ9dGhpcy5jeWNsZUg7b3B0cy5hbmltT3V0LnRvcD0wfSk7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLmN1cnRhaW5YPWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7b3B0cy5iZWZvcmUucHVzaChmdW5jdGlvbihjdXJyLG5leHQsb3B0cyl7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cywhMSwhMCwhMCk7b3B0cy5jc3NCZWZvcmUubGVmdD1uZXh0LmN5Y2xlVy8yO29wdHMuYW5pbUluLmxlZnQ9MDtvcHRzLmFuaW1Jbi53aWR0aD10aGlzLmN5Y2xlVztvcHRzLmFuaW1PdXQubGVmdD1jdXJyLmN5Y2xlVy8yO29wdHMuYW5pbU91dC53aWR0aD0wfSk7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5jc3NCZWZvcmUud2lkdGg9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5jdXJ0YWluWT1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITAsITEsITApO29wdHMuY3NzQmVmb3JlLnRvcD1uZXh0LmN5Y2xlSC8yO29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbUluLmhlaWdodD1uZXh0LmN5Y2xlSDtvcHRzLmFuaW1PdXQudG9wPWN1cnIuY3ljbGVILzI7b3B0cy5hbmltT3V0LmhlaWdodD0wfSk7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLmNvdmVyPWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7dmFyIGQ9b3B0cy5kaXJlY3Rpb258fCdsZWZ0Jzt2YXIgdz0kY29udC5jc3MoJ292ZXJmbG93JywnaGlkZGVuJykud2lkdGgoKTt2YXIgaD0kY29udC5oZWlnaHQoKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzKTtvcHRzLmNzc0FmdGVyLmRpc3BsYXk9Jyc7aWYoZD09J3JpZ2h0JykKb3B0cy5jc3NCZWZvcmUubGVmdD0tdztlbHNlIGlmKGQ9PSd1cCcpCm9wdHMuY3NzQmVmb3JlLnRvcD1oO2Vsc2UgaWYoZD09J2Rvd24nKQpvcHRzLmNzc0JlZm9yZS50b3A9LWg7ZWxzZSBvcHRzLmNzc0JlZm9yZS5sZWZ0PXd9KTtvcHRzLmFuaW1Jbi5sZWZ0PTA7b3B0cy5hbmltSW4udG9wPTA7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnVuY292ZXI9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXt2YXIgZD1vcHRzLmRpcmVjdGlvbnx8J2xlZnQnO3ZhciB3PSRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKS53aWR0aCgpO3ZhciBoPSRjb250LmhlaWdodCgpO29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITAsITAsITApO2lmKGQ9PSdyaWdodCcpCm9wdHMuYW5pbU91dC5sZWZ0PXc7ZWxzZSBpZihkPT0ndXAnKQpvcHRzLmFuaW1PdXQudG9wPS1oO2Vsc2UgaWYoZD09J2Rvd24nKQpvcHRzLmFuaW1PdXQudG9wPWg7ZWxzZSBvcHRzLmFuaW1PdXQubGVmdD0td30pO29wdHMuYW5pbUluLmxlZnQ9MDtvcHRzLmFuaW1Jbi50b3A9MDtvcHRzLmNzc0JlZm9yZS50b3A9MDtvcHRzLmNzc0JlZm9yZS5sZWZ0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMudG9zcz1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe3ZhciB3PSRjb250LmNzcygnb3ZlcmZsb3cnLCd2aXNpYmxlJykud2lkdGgoKTt2YXIgaD0kY29udC5oZWlnaHQoKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCEwLCEwKTtpZighb3B0cy5hbmltT3V0LmxlZnQmJiFvcHRzLmFuaW1PdXQudG9wKQokLmV4dGVuZChvcHRzLmFuaW1PdXQse2xlZnQ6dyoyLHRvcDotaC8yLG9wYWNpdHk6MH0pO2Vsc2Ugb3B0cy5hbmltT3V0Lm9wYWNpdHk9MH0pO29wdHMuY3NzQmVmb3JlLmxlZnQ9MDtvcHRzLmNzc0JlZm9yZS50b3A9MDtvcHRzLmFuaW1Jbi5sZWZ0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMud2lwZT1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe3ZhciB3PSRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKS53aWR0aCgpO3ZhciBoPSRjb250LmhlaWdodCgpO29wdHMuY3NzQmVmb3JlPW9wdHMuY3NzQmVmb3JlfHx7fTt2YXIgY2xpcDtpZihvcHRzLmNsaXApe2lmKC9sMnIvLnRlc3Qob3B0cy5jbGlwKSkKY2xpcD0ncmVjdCgwcHggMHB4ICcraCsncHggMHB4KSc7ZWxzZSBpZigvcjJsLy50ZXN0KG9wdHMuY2xpcCkpCmNsaXA9J3JlY3QoMHB4ICcrdysncHggJytoKydweCAnK3crJ3B4KSc7ZWxzZSBpZigvdDJiLy50ZXN0KG9wdHMuY2xpcCkpCmNsaXA9J3JlY3QoMHB4ICcrdysncHggMHB4IDBweCknO2Vsc2UgaWYoL2IydC8udGVzdChvcHRzLmNsaXApKQpjbGlwPSdyZWN0KCcraCsncHggJyt3KydweCAnK2grJ3B4IDBweCknO2Vsc2UgaWYoL3pvb20vLnRlc3Qob3B0cy5jbGlwKSl7dmFyIHRvcD1wYXJzZUludChoLzIsMTApO3ZhciBsZWZ0PXBhcnNlSW50KHcvMiwxMCk7Y2xpcD0ncmVjdCgnK3RvcCsncHggJytsZWZ0KydweCAnK3RvcCsncHggJytsZWZ0KydweCknfX0Kb3B0cy5jc3NCZWZvcmUuY2xpcD1vcHRzLmNzc0JlZm9yZS5jbGlwfHxjbGlwfHwncmVjdCgwcHggMHB4IDBweCAwcHgpJzt2YXIgZD1vcHRzLmNzc0JlZm9yZS5jbGlwLm1hdGNoKC8oXGQrKS9nKTt2YXIgdD1wYXJzZUludChkWzBdLDEwKSxyPXBhcnNlSW50KGRbMV0sMTApLGI9cGFyc2VJbnQoZFsyXSwxMCksbD1wYXJzZUludChkWzNdLDEwKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXtpZihjdXJyPT1uZXh0KXJldHVybjt2YXIgJGN1cnI9JChjdXJyKSwkbmV4dD0kKG5leHQpOyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITAsITAsITEpO29wdHMuY3NzQWZ0ZXIuZGlzcGxheT0nYmxvY2snO3ZhciBzdGVwPTEsY291bnQ9cGFyc2VJbnQoKG9wdHMuc3BlZWRJbi8xMyksMTApLTE7KGZ1bmN0aW9uIGYoKXt2YXIgdHQ9dD90LXBhcnNlSW50KHN0ZXAqKHQvY291bnQpLDEwKTowO3ZhciBsbD1sP2wtcGFyc2VJbnQoc3RlcCoobC9jb3VudCksMTApOjA7dmFyIGJiPWI8aD9iK3BhcnNlSW50KHN0ZXAqKChoLWIpL2NvdW50fHwxKSwxMCk6aDt2YXIgcnI9cjx3P3IrcGFyc2VJbnQoc3RlcCooKHctcikvY291bnR8fDEpLDEwKTp3OyRuZXh0LmNzcyh7Y2xpcDoncmVjdCgnK3R0KydweCAnK3JyKydweCAnK2JiKydweCAnK2xsKydweCknfSk7KHN0ZXArKzw9Y291bnQpP3NldFRpbWVvdXQoZiwxMyk6JGN1cnIuY3NzKCdkaXNwbGF5Jywnbm9uZScpfSkoKX0pOyQuZXh0ZW5kKG9wdHMuY3NzQmVmb3JlLHtkaXNwbGF5OidibG9jaycsb3BhY2l0eToxLHRvcDowLGxlZnQ6MH0pO29wdHMuYW5pbUluPXtsZWZ0OjB9O29wdHMuYW5pbU91dD17bGVmdDowfX19KShqUXVlcnkpO3ZhciBtZW51RGVsYXk9MTUwOyQoZnVuY3Rpb24oKXtpZigkKCcubWVnYS1uYXYnKS5sZW5ndGg+MCl7dmFyIGNvbHVtbnM9W107JCgndWwuY29sdW1uJykuZWFjaChmdW5jdGlvbigpe2NvbHVtbnMucHVzaCgkKHRoaXMpLmRhdGEoJ2NvbHVtbmlkJykpfSk7Y29sdW1ucz0kLnVuaXF1ZShjb2x1bW5zKTskLmVhY2goY29sdW1ucyxmdW5jdGlvbihrZXksdmFsdWUpe3ZhciBjb2w9dmFsdWUubWF0Y2goL1x3Ky1cZCstKFxkKykvKVsxXTskKCcuJyt2YWx1ZSsnID4gLm5hdl8xJykudW53cmFwKCkud3JhcEFsbCgnPGxpIGlkPSInK3ZhbHVlKyciIGNsYXNzPSJjb2x1bW4gY29sdW1uLScrY29sKyciPjwvbGk+Jyl9KX0KJCgndWwubWVnYS1uYXYudG9wLWxldmVsLW5hdiB1bC5uYXZfMScpLmVhY2goZnVuY3Rpb24oKXtzZXRNZW51UG9zaXRpb24oJCh0aGlzKSl9KTtoYW5kbGVUb3BOYXZJdGVtSG92ZXIoKX0pO2Z1bmN0aW9uIHNldE1lbnVQb3NpdGlvbihuYXYpe3ZhciBwYXJlbnRMaVBvc2l0aW9uO3ZhciBsZWZ0O25hdi5lYWNoKGZ1bmN0aW9uKCl7aWYoISQodGhpcykucGFyZW50KCkuaGFzQ2xhc3MoJ2Z1bGwtd2lkdGgnKSl7dmFyIG1lZ2FOYXY9JCh0aGlzKS5wYXJlbnRzKCdkaXYubWVnYV9uYXYnKTt2YXIgbWVnYU5hdldpZHRoPW1lZ2FOYXYud2lkdGgoKTt2YXIgcGFyZW50TGk9JCh0aGlzKS5wYXJlbnQoKTtwYXJlbnRMaVBvc2l0aW9uPXBhcmVudExpLnBvc2l0aW9uKCk7aWYoJCh0aGlzKS53aWR0aCgpPm1lZ2FOYXZXaWR0aCl7dmFyIGNoaWxkcmVuPSQodGhpcykuY2hpbGRyZW4oKTt2YXIgY29sdW1uV2lkdGg9cGFyc2VJbnQobWVnYU5hdldpZHRoL2NoaWxkcmVuLmxlbmd0aCk7Y2hpbGRyZW4uZWFjaChmdW5jdGlvbigpeyQodGhpcykuY3NzKCdtaW4td2lkdGgnLGNvbHVtbldpZHRoKydweCcpfSl9CnZhciByaWdodFNpZGVQb3NpdGlvbj0kKHRoaXMpLndpZHRoKCkrcGFyZW50TGlQb3NpdGlvbi5sZWZ0O2lmKHJpZ2h0U2lkZVBvc2l0aW9uPm1lZ2FOYXZXaWR0aCl7bGVmdD1yaWdodFNpZGVQb3NpdGlvbi1tZWdhTmF2V2lkdGg7JCh0aGlzKS5jc3MoJ2xlZnQnLChsZWZ0Ki0xKSsncHgnKX19ZWxzZXt2YXIgbGlDb3VudD0kKHRoaXMpLmNoaWxkcmVuKCdsaS5jb2x1bW4nKS5sZW5ndGg7dmFyIHdpZHRoPTEwMC9saUNvdW50OyQodGhpcykuY2hpbGRyZW4oJ2xpJykuY3NzKCd3aWR0aCcsd2lkdGgrJyUnKX19KX0KZnVuY3Rpb24gaGFuZGxlVG9wTmF2SXRlbUhvdmVyKCl7dmFyIHRvcE5hdkl0ZW1zPSQoJy5tZWdhX25hdiBsaS5uYXZfMScpO3RvcE5hdkl0ZW1zLmhvdmVyKGZ1bmN0aW9uKCl7dmFyIGljb249JCh0aGlzKS5maW5kKCdpbWcuaW1nLXJlc3BvbnNpdmUnKTt2YXIgY3VycmVudFNyYz1pY29uLmF0dHIoJ3NyYycpO2lmKCFjdXJyZW50U3JjLmluY2x1ZGVzKCdfaG92ZXIucG5nJykpe3ZhciBuZXdTcmM9Y3VycmVudFNyYy5zbGljZSgwLC00KSsiX2hvdmVyLnBuZyI7aWNvbi5hdHRyKCdzcmMnLG5ld1NyYyl9fSxmdW5jdGlvbigpe3ZhciBpY29uPSQodGhpcykuZmluZCgnaW1nLmltZy1yZXNwb25zaXZlJyk7dmFyIGN1cnJlbnRTcmM9aWNvbi5hdHRyKCdzcmMnKTtpZihjdXJyZW50U3JjLmluY2x1ZGVzKCdfaG92ZXIucG5nJykpe3ZhciBuZXdTcmM9Y3VycmVudFNyYy5zbGljZSgwLC0xMCkrIi5wbmciO2ljb24uYXR0cignc3JjJyxuZXdTcmMpfX0pfTskKGZ1bmN0aW9uKCl7aWYoYXV0b2NvbXBsZXRlPT0hMCl7JCgiI3F1aWNrc2VhcmNoX2tleXdvcmRzIikuYXV0b2NvbXBsZXRlKHttaW5MZW5ndGg6MyxkZWxheTo1MDAscG9zaXRpb246e215OiJyaWdodCB0b3AiLGF0OiJyaWdodCBib3R0b20ifSxzZWxlY3Q6ZnVuY3Rpb24oZXZlbnQsdWkpe2lmKHVpLml0ZW0ubGFiZWwhPSJObyBSZXN1bHRzIEZvdW5kIil7d2luZG93LmxvY2F0aW9uLmhyZWY9dWkuaXRlbS5saW5rfX0sc291cmNlOmZ1bmN0aW9uKHJlcXVlc3QscmVzcG9uc2UpeyQucG9zdCgiaW5jbHVkZXMvYWpheC9hamF4LnNlYXJjaF9hdXRvY29tcGxldGUucGhwIix7cmVxdWVzdDpyZXF1ZXN0LnRlcm0sdHlwZTokKCJpbnB1dC5zZWFyY2hfdHlwZTpjaGVja2VkIikudmFsKCl9LGZ1bmN0aW9uKGRhdGEpe3Jlc3BvbnNlKGRhdGEpfSwianNvbiIpLmZhaWwoZnVuY3Rpb24oZXJyKXtjb25zb2xlLmxvZyhlcnIucmVzcG9uc2VUZXh0KX0pfX0pfQokKCIuc2VhcmNoX3R5cGUiKS5jbGljayhmdW5jdGlvbigpeyQoIiN0eXBlIikudmFsKCQodGhpcykudmFsKCkpfSl9KTtmdW5jdGlvbiBjaGFuZ2VQYWdlKHBhZ2UpeyQoJyNwYWdlJykudmFsKHBhZ2UpfTshZnVuY3Rpb24odCl7dmFyIGU9e21vZGU6Imhvcml6b250YWwiLHNsaWRlU2VsZWN0b3I6IiIsaW5maW5pdGVMb29wOiEwLGhpZGVDb250cm9sT25FbmQ6ITEsc3BlZWQ6NTAwLGVhc2luZzpudWxsLHNsaWRlTWFyZ2luOjAsc3RhcnRTbGlkZTowLHJhbmRvbVN0YXJ0OiExLGNhcHRpb25zOiExLHRpY2tlcjohMSx0aWNrZXJIb3ZlcjohMSxhZGFwdGl2ZUhlaWdodDohMSxhZGFwdGl2ZUhlaWdodFNwZWVkOjUwMCx2aWRlbzohMSx1c2VDU1M6ITAscHJlbG9hZEltYWdlczoidmlzaWJsZSIscmVzcG9uc2l2ZTohMCxzbGlkZVpJbmRleDo1MCx3cmFwcGVyQ2xhc3M6ImJ4LXdyYXBwZXIiLHRvdWNoRW5hYmxlZDohMCxzd2lwZVRocmVzaG9sZDo1MCxvbmVUb09uZVRvdWNoOiEwLHByZXZlbnREZWZhdWx0U3dpcGVYOiEwLHByZXZlbnREZWZhdWx0U3dpcGVZOiExLGFyaWFMaXZlOiEwLGFyaWFIaWRkZW46ITAsa2V5Ym9hcmRFbmFibGVkOiExLHBhZ2VyOiEwLHBhZ2VyVHlwZToiZnVsbCIscGFnZXJTaG9ydFNlcGFyYXRvcjoiIC8gIixwYWdlclNlbGVjdG9yOm51bGwsYnVpbGRQYWdlcjpudWxsLHBhZ2VyQ3VzdG9tOm51bGwsY29udHJvbHM6ITAsbmV4dFRleHQ6Ik5leHQiLHByZXZUZXh0OiJQcmV2IixuZXh0U2VsZWN0b3I6bnVsbCxwcmV2U2VsZWN0b3I6bnVsbCxhdXRvQ29udHJvbHM6ITEsc3RhcnRUZXh0OiJTdGFydCIsc3RvcFRleHQ6IlN0b3AiLGF1dG9Db250cm9sc0NvbWJpbmU6ITEsYXV0b0NvbnRyb2xzU2VsZWN0b3I6bnVsbCxhdXRvOiExLHBhdXNlOjRlMyxhdXRvU3RhcnQ6ITAsYXV0b0RpcmVjdGlvbjoibmV4dCIsc3RvcEF1dG9PbkNsaWNrOiExLGF1dG9Ib3ZlcjohMSxhdXRvRGVsYXk6MCxhdXRvU2xpZGVGb3JPbmVQYWdlOiExLG1pblNsaWRlczoxLG1heFNsaWRlczoxLG1vdmVTbGlkZXM6MCxzbGlkZVdpZHRoOjAsc2hyaW5rSXRlbXM6ITEsb25TbGlkZXJMb2FkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG9uU2xpZGVCZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sb25TbGlkZUFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG9uU2xpZGVOZXh0OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG9uU2xpZGVQcmV2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG9uU2xpZGVyUmVzaXplOmZ1bmN0aW9uKCl7cmV0dXJuITB9fTt0LmZuLmJ4U2xpZGVyPWZ1bmN0aW9uKG4pe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4gdGhpcztpZih0aGlzLmxlbmd0aD4xKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLmJ4U2xpZGVyKG4pfSksdGhpczt2YXIgcz17fSxvPXRoaXMscj10KHdpbmRvdykud2lkdGgoKSxhPXQod2luZG93KS5oZWlnaHQoKTtpZighdChvKS5kYXRhKCJieFNsaWRlciIpKXt2YXIgbD1mdW5jdGlvbigpe3QobykuZGF0YSgiYnhTbGlkZXIiKXx8KHMuc2V0dGluZ3M9dC5leHRlbmQoe30sZSxuKSxzLnNldHRpbmdzLnNsaWRlV2lkdGg9cGFyc2VJbnQocy5zZXR0aW5ncy5zbGlkZVdpZHRoKSxzLmNoaWxkcmVuPW8uY2hpbGRyZW4ocy5zZXR0aW5ncy5zbGlkZVNlbGVjdG9yKSxzLmNoaWxkcmVuLmxlbmd0aDxzLnNldHRpbmdzLm1pblNsaWRlcyYmKHMuc2V0dGluZ3MubWluU2xpZGVzPXMuY2hpbGRyZW4ubGVuZ3RoKSxzLmNoaWxkcmVuLmxlbmd0aDxzLnNldHRpbmdzLm1heFNsaWRlcyYmKHMuc2V0dGluZ3MubWF4U2xpZGVzPXMuY2hpbGRyZW4ubGVuZ3RoKSxzLnNldHRpbmdzLnJhbmRvbVN0YXJ0JiYocy5zZXR0aW5ncy5zdGFydFNsaWRlPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpzLmNoaWxkcmVuLmxlbmd0aCkpLHMuYWN0aXZlPXtpbmRleDpzLnNldHRpbmdzLnN0YXJ0U2xpZGV9LHMuY2Fyb3VzZWw9cy5zZXR0aW5ncy5taW5TbGlkZXM+MXx8cy5zZXR0aW5ncy5tYXhTbGlkZXM+MSxzLmNhcm91c2VsJiYocy5zZXR0aW5ncy5wcmVsb2FkSW1hZ2VzPSJhbGwiKSxzLm1pblRocmVzaG9sZD1zLnNldHRpbmdzLm1pblNsaWRlcypzLnNldHRpbmdzLnNsaWRlV2lkdGgrKHMuc2V0dGluZ3MubWluU2xpZGVzLTEpKnMuc2V0dGluZ3Muc2xpZGVNYXJnaW4scy5tYXhUaHJlc2hvbGQ9cy5zZXR0aW5ncy5tYXhTbGlkZXMqcy5zZXR0aW5ncy5zbGlkZVdpZHRoKyhzLnNldHRpbmdzLm1heFNsaWRlcy0xKSpzLnNldHRpbmdzLnNsaWRlTWFyZ2luLHMud29ya2luZz0hMSxzLmNvbnRyb2xzPXt9LHMuaW50ZXJ2YWw9bnVsbCxzLmFuaW1Qcm9wPSJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGU/InRvcCI6ImxlZnQiLHMudXNpbmdDU1M9cy5zZXR0aW5ncy51c2VDU1MmJiJmYWRlIiE9PXMuc2V0dGluZ3MubW9kZSYmZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1bIldlYmtpdFBlcnNwZWN0aXZlIiwiTW96UGVyc3BlY3RpdmUiLCJPUGVyc3BlY3RpdmUiLCJtc1BlcnNwZWN0aXZlIl0saT0wO2k8ZS5sZW5ndGg7aSsrKWlmKHZvaWQgMCE9PXQuc3R5bGVbZVtpXV0pcmV0dXJuIHMuY3NzUHJlZml4PWVbaV0ucmVwbGFjZSgiUGVyc3BlY3RpdmUiLCIiKS50b0xvd2VyQ2FzZSgpLHMuYW5pbVByb3A9Ii0iK3MuY3NzUHJlZml4KyItdHJhbnNmb3JtIiwhMDtyZXR1cm4hMX0oKSwidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlJiYocy5zZXR0aW5ncy5tYXhTbGlkZXM9cy5zZXR0aW5ncy5taW5TbGlkZXMpLG8uZGF0YSgib3JpZ1N0eWxlIixvLmF0dHIoInN0eWxlIikpLG8uY2hpbGRyZW4ocy5zZXR0aW5ncy5zbGlkZVNlbGVjdG9yKS5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS5kYXRhKCJvcmlnU3R5bGUiLHQodGhpcykuYXR0cigic3R5bGUiKSl9KSxkKCkpfSxkPWZ1bmN0aW9uKCl7dmFyIGU9cy5jaGlsZHJlbi5lcShzLnNldHRpbmdzLnN0YXJ0U2xpZGUpO28ud3JhcCgnPGRpdiBjbGFzcz0iJytzLnNldHRpbmdzLndyYXBwZXJDbGFzcysnIj48ZGl2IGNsYXNzPSJieC12aWV3cG9ydCI+PC9kaXY+PC9kaXY+Jykscy52aWV3cG9ydD1vLnBhcmVudCgpLHMuc2V0dGluZ3MuYXJpYUxpdmUmJiFzLnNldHRpbmdzLnRpY2tlciYmcy52aWV3cG9ydC5hdHRyKCJhcmlhLWxpdmUiLCJwb2xpdGUiKSxzLmxvYWRlcj10KCc8ZGl2IGNsYXNzPSJieC1sb2FkaW5nIiAvPicpLHMudmlld3BvcnQucHJlcGVuZChzLmxvYWRlciksby5jc3Moe3dpZHRoOiJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8xZTMqcy5jaGlsZHJlbi5sZW5ndGgrMjE1KyIlIjoiYXV0byIscG9zaXRpb246InJlbGF0aXZlIn0pLHMudXNpbmdDU1MmJnMuc2V0dGluZ3MuZWFzaW5nP28uY3NzKCItIitzLmNzc1ByZWZpeCsiLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIixzLnNldHRpbmdzLmVhc2luZyk6cy5zZXR0aW5ncy5lYXNpbmd8fChzLnNldHRpbmdzLmVhc2luZz0ic3dpbmciKSxzLnZpZXdwb3J0LmNzcyh7d2lkdGg6IjEwMCUiLG92ZXJmbG93OiJoaWRkZW4iLHBvc2l0aW9uOiJyZWxhdGl2ZSJ9KSxzLnZpZXdwb3J0LnBhcmVudCgpLmNzcyh7bWF4V2lkdGg6dSgpfSkscy5jaGlsZHJlbi5jc3Moe2Zsb2F0OiJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8ibGVmdCI6Im5vbmUiLGxpc3RTdHlsZToibm9uZSIscG9zaXRpb246InJlbGF0aXZlIn0pLHMuY2hpbGRyZW4uY3NzKCJ3aWR0aCIsaCgpKSwiaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGUmJnMuc2V0dGluZ3Muc2xpZGVNYXJnaW4+MCYmcy5jaGlsZHJlbi5jc3MoIm1hcmdpblJpZ2h0IixzLnNldHRpbmdzLnNsaWRlTWFyZ2luKSwidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlJiZzLnNldHRpbmdzLnNsaWRlTWFyZ2luPjAmJnMuY2hpbGRyZW4uY3NzKCJtYXJnaW5Cb3R0b20iLHMuc2V0dGluZ3Muc2xpZGVNYXJnaW4pLCJmYWRlIj09PXMuc2V0dGluZ3MubW9kZSYmKHMuY2hpbGRyZW4uY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHpJbmRleDowLGRpc3BsYXk6Im5vbmUifSkscy5jaGlsZHJlbi5lcShzLnNldHRpbmdzLnN0YXJ0U2xpZGUpLmNzcyh7ekluZGV4OnMuc2V0dGluZ3Muc2xpZGVaSW5kZXgsZGlzcGxheToiYmxvY2sifSkpLHMuY29udHJvbHMuZWw9dCgnPGRpdiBjbGFzcz0iYngtY29udHJvbHMiIC8+Jykscy5zZXR0aW5ncy5jYXB0aW9ucyYmUCgpLHMuYWN0aXZlLmxhc3Q9cy5zZXR0aW5ncy5zdGFydFNsaWRlPT09ZigpLTEscy5zZXR0aW5ncy52aWRlbyYmby5maXRWaWRzKCksKCJhbGwiPT09cy5zZXR0aW5ncy5wcmVsb2FkSW1hZ2VzfHxzLnNldHRpbmdzLnRpY2tlcikmJihlPXMuY2hpbGRyZW4pLHMuc2V0dGluZ3MudGlja2VyP3Muc2V0dGluZ3MucGFnZXI9ITE6KHMuc2V0dGluZ3MuY29udHJvbHMmJkMoKSxzLnNldHRpbmdzLmF1dG8mJnMuc2V0dGluZ3MuYXV0b0NvbnRyb2xzJiZUKCkscy5zZXR0aW5ncy5wYWdlciYmdygpLChzLnNldHRpbmdzLmNvbnRyb2xzfHxzLnNldHRpbmdzLmF1dG9Db250cm9sc3x8cy5zZXR0aW5ncy5wYWdlcikmJnMudmlld3BvcnQuYWZ0ZXIocy5jb250cm9scy5lbCkpLGMoZSxnKX0sYz1mdW5jdGlvbihlLGkpe3ZhciBuPWUuZmluZCgnaW1nOm5vdChbc3JjPSIiXSksIGlmcmFtZScpLmxlbmd0aCxzPTA7cmV0dXJuIDA9PT1uP3ZvaWQgaSgpOnZvaWQgZS5maW5kKCdpbWc6bm90KFtzcmM9IiJdKSwgaWZyYW1lJykuZWFjaChmdW5jdGlvbigpe3QodGhpcykub25lKCJsb2FkIGVycm9yIixmdW5jdGlvbigpeysrcz09PW4mJmkoKX0pLmVhY2goZnVuY3Rpb24oKXt0aGlzLmNvbXBsZXRlJiZ0KHRoaXMpLnRyaWdnZXIoImxvYWQiKX0pfSl9LGc9ZnVuY3Rpb24oKXtpZihzLnNldHRpbmdzLmluZmluaXRlTG9vcCYmImZhZGUiIT09cy5zZXR0aW5ncy5tb2RlJiYhcy5zZXR0aW5ncy50aWNrZXIpe3ZhciBlPSJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGU/cy5zZXR0aW5ncy5taW5TbGlkZXM6cy5zZXR0aW5ncy5tYXhTbGlkZXMsaT1zLmNoaWxkcmVuLnNsaWNlKDAsZSkuY2xvbmUoITApLmFkZENsYXNzKCJieC1jbG9uZSIpLG49cy5jaGlsZHJlbi5zbGljZSgtZSkuY2xvbmUoITApLmFkZENsYXNzKCJieC1jbG9uZSIpO3Muc2V0dGluZ3MuYXJpYUhpZGRlbiYmKGkuYXR0cigiYXJpYS1oaWRkZW4iLCEwKSxuLmF0dHIoImFyaWEtaGlkZGVuIiwhMCkpLG8uYXBwZW5kKGkpLnByZXBlbmQobil9cy5sb2FkZXIucmVtb3ZlKCksbSgpLCJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGUmJihzLnNldHRpbmdzLmFkYXB0aXZlSGVpZ2h0PSEwKSxzLnZpZXdwb3J0LmhlaWdodChwKCkpLG8ucmVkcmF3U2xpZGVyKCkscy5zZXR0aW5ncy5vblNsaWRlckxvYWQuY2FsbChvLHMuYWN0aXZlLmluZGV4KSxzLmluaXRpYWxpemVkPSEwLHMuc2V0dGluZ3MucmVzcG9uc2l2ZSYmdCh3aW5kb3cpLmJpbmQoInJlc2l6ZSIsWikscy5zZXR0aW5ncy5hdXRvJiZzLnNldHRpbmdzLmF1dG9TdGFydCYmKGYoKT4xfHxzLnNldHRpbmdzLmF1dG9TbGlkZUZvck9uZVBhZ2UpJiZIKCkscy5zZXR0aW5ncy50aWNrZXImJlcoKSxzLnNldHRpbmdzLnBhZ2VyJiZJKHMuc2V0dGluZ3Muc3RhcnRTbGlkZSkscy5zZXR0aW5ncy5jb250cm9scyYmRCgpLHMuc2V0dGluZ3MudG91Y2hFbmFibGVkJiYhcy5zZXR0aW5ncy50aWNrZXImJk4oKSxzLnNldHRpbmdzLmtleWJvYXJkRW5hYmxlZCYmIXMuc2V0dGluZ3MudGlja2VyJiZ0KGRvY3VtZW50KS5rZXlkb3duKEYpfSxwPWZ1bmN0aW9uKCl7dmFyIGU9MCxuPXQoKTtpZigidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlfHxzLnNldHRpbmdzLmFkYXB0aXZlSGVpZ2h0KWlmKHMuY2Fyb3VzZWwpe3ZhciBvPTE9PT1zLnNldHRpbmdzLm1vdmVTbGlkZXM/cy5hY3RpdmUuaW5kZXg6cy5hY3RpdmUuaW5kZXgqeCgpO2ZvcihuPXMuY2hpbGRyZW4uZXEobyksaT0xO2k8PXMuc2V0dGluZ3MubWF4U2xpZGVzLTE7aSsrKW49bytpPj1zLmNoaWxkcmVuLmxlbmd0aD9uLmFkZChzLmNoaWxkcmVuLmVxKGktMSkpOm4uYWRkKHMuY2hpbGRyZW4uZXEobytpKSl9ZWxzZSBuPXMuY2hpbGRyZW4uZXEocy5hY3RpdmUuaW5kZXgpO2Vsc2Ugbj1zLmNoaWxkcmVuO3JldHVybiJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGU/KG4uZWFjaChmdW5jdGlvbihpKXtlKz10KHRoaXMpLm91dGVySGVpZ2h0KCl9KSxzLnNldHRpbmdzLnNsaWRlTWFyZ2luPjAmJihlKz1zLnNldHRpbmdzLnNsaWRlTWFyZ2luKihzLnNldHRpbmdzLm1pblNsaWRlcy0xKSkpOmU9TWF0aC5tYXguYXBwbHkoTWF0aCxuLm1hcChmdW5jdGlvbigpe3JldHVybiB0KHRoaXMpLm91dGVySGVpZ2h0KCExKX0pLmdldCgpKSwiYm9yZGVyLWJveCI9PT1zLnZpZXdwb3J0LmNzcygiYm94LXNpemluZyIpP2UrPXBhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoInBhZGRpbmctdG9wIikpK3BhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoInBhZGRpbmctYm90dG9tIikpK3BhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoImJvcmRlci10b3Atd2lkdGgiKSkrcGFyc2VGbG9hdChzLnZpZXdwb3J0LmNzcygiYm9yZGVyLWJvdHRvbS13aWR0aCIpKToicGFkZGluZy1ib3giPT09cy52aWV3cG9ydC5jc3MoImJveC1zaXppbmciKSYmKGUrPXBhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoInBhZGRpbmctdG9wIikpK3BhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoInBhZGRpbmctYm90dG9tIikpKSxlfSx1PWZ1bmN0aW9uKCl7dmFyIHQ9IjEwMCUiO3JldHVybiBzLnNldHRpbmdzLnNsaWRlV2lkdGg+MCYmKHQ9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlP3Muc2V0dGluZ3MubWF4U2xpZGVzKnMuc2V0dGluZ3Muc2xpZGVXaWR0aCsocy5zZXR0aW5ncy5tYXhTbGlkZXMtMSkqcy5zZXR0aW5ncy5zbGlkZU1hcmdpbjpzLnNldHRpbmdzLnNsaWRlV2lkdGgpLHR9LGg9ZnVuY3Rpb24oKXt2YXIgdD1zLnNldHRpbmdzLnNsaWRlV2lkdGgsZT1zLnZpZXdwb3J0LndpZHRoKCk7aWYoMD09PXMuc2V0dGluZ3Muc2xpZGVXaWR0aHx8cy5zZXR0aW5ncy5zbGlkZVdpZHRoPmUmJiFzLmNhcm91c2VsfHwidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlKXQ9ZTtlbHNlIGlmKHMuc2V0dGluZ3MubWF4U2xpZGVzPjEmJiJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZSl7aWYoZT5zLm1heFRocmVzaG9sZClyZXR1cm4gdDtlPHMubWluVGhyZXNob2xkP3Q9KGUtcy5zZXR0aW5ncy5zbGlkZU1hcmdpbioocy5zZXR0aW5ncy5taW5TbGlkZXMtMSkpL3Muc2V0dGluZ3MubWluU2xpZGVzOnMuc2V0dGluZ3Muc2hyaW5rSXRlbXMmJih0PU1hdGguZmxvb3IoKGUrcy5zZXR0aW5ncy5zbGlkZU1hcmdpbikvTWF0aC5jZWlsKChlK3Muc2V0dGluZ3Muc2xpZGVNYXJnaW4pLyh0K3Muc2V0dGluZ3Muc2xpZGVNYXJnaW4pKS1zLnNldHRpbmdzLnNsaWRlTWFyZ2luKSl9cmV0dXJuIHR9LHY9ZnVuY3Rpb24oKXt2YXIgdD0xLGU9bnVsbDtyZXR1cm4iaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGUmJnMuc2V0dGluZ3Muc2xpZGVXaWR0aD4wP3Mudmlld3BvcnQud2lkdGgoKTxzLm1pblRocmVzaG9sZD90PXMuc2V0dGluZ3MubWluU2xpZGVzOnMudmlld3BvcnQud2lkdGgoKT5zLm1heFRocmVzaG9sZD90PXMuc2V0dGluZ3MubWF4U2xpZGVzOihlPXMuY2hpbGRyZW4uZmlyc3QoKS53aWR0aCgpK3Muc2V0dGluZ3Muc2xpZGVNYXJnaW4sdD1NYXRoLmZsb29yKChzLnZpZXdwb3J0LndpZHRoKCkrcy5zZXR0aW5ncy5zbGlkZU1hcmdpbikvZSkpOiJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGUmJih0PXMuc2V0dGluZ3MubWluU2xpZGVzKSx0fSxmPWZ1bmN0aW9uKCl7dmFyIHQ9MCxlPTAsaT0wO2lmKHMuc2V0dGluZ3MubW92ZVNsaWRlcz4wKWlmKHMuc2V0dGluZ3MuaW5maW5pdGVMb29wKXQ9TWF0aC5jZWlsKHMuY2hpbGRyZW4ubGVuZ3RoL3goKSk7ZWxzZSBmb3IoO2U8cy5jaGlsZHJlbi5sZW5ndGg7KSsrdCxlPWkrdigpLGkrPXMuc2V0dGluZ3MubW92ZVNsaWRlczw9digpP3Muc2V0dGluZ3MubW92ZVNsaWRlczp2KCk7ZWxzZSB0PU1hdGguY2VpbChzLmNoaWxkcmVuLmxlbmd0aC92KCkpO3JldHVybiB0fSx4PWZ1bmN0aW9uKCl7cmV0dXJuIHMuc2V0dGluZ3MubW92ZVNsaWRlcz4wJiZzLnNldHRpbmdzLm1vdmVTbGlkZXM8PXYoKT9zLnNldHRpbmdzLm1vdmVTbGlkZXM6digpfSxtPWZ1bmN0aW9uKCl7dmFyIHQsZSxpO3MuY2hpbGRyZW4ubGVuZ3RoPnMuc2V0dGluZ3MubWF4U2xpZGVzJiZzLmFjdGl2ZS5sYXN0JiYhcy5zZXR0aW5ncy5pbmZpbml0ZUxvb3A/Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPyhlPXMuY2hpbGRyZW4ubGFzdCgpLHQ9ZS5wb3NpdGlvbigpLFMoLSh0LmxlZnQtKHMudmlld3BvcnQud2lkdGgoKS1lLm91dGVyV2lkdGgoKSkpLCJyZXNldCIsMCkpOiJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGUmJihpPXMuY2hpbGRyZW4ubGVuZ3RoLXMuc2V0dGluZ3MubWluU2xpZGVzLHQ9cy5jaGlsZHJlbi5lcShpKS5wb3NpdGlvbigpLFMoLXQudG9wLCJyZXNldCIsMCkpOih0PXMuY2hpbGRyZW4uZXEocy5hY3RpdmUuaW5kZXgqeCgpKS5wb3NpdGlvbigpLHMuYWN0aXZlLmluZGV4PT09ZigpLTEmJihzLmFjdGl2ZS5sYXN0PSEwKSx2b2lkIDAhPT10JiYoImhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlP1MoLXQubGVmdCwicmVzZXQiLDApOiJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGUmJlMoLXQudG9wLCJyZXNldCIsMCkpKX0sUz1mdW5jdGlvbihlLGksbixyKXt2YXIgYSxsO3MudXNpbmdDU1M/KGw9InZlcnRpY2FsIj09PXMuc2V0dGluZ3MubW9kZT8idHJhbnNsYXRlM2QoMCwgIitlKyJweCwgMCkiOiJ0cmFuc2xhdGUzZCgiK2UrInB4LCAwLCAwKSIsby5jc3MoIi0iK3MuY3NzUHJlZml4KyItdHJhbnNpdGlvbi1kdXJhdGlvbiIsbi8xZTMrInMiKSwic2xpZGUiPT09aT8oby5jc3Mocy5hbmltUHJvcCxsKSwwIT09bj9vLmJpbmQoInRyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQiLGZ1bmN0aW9uKGUpe3QoZS50YXJnZXQpLmlzKG8pJiYoby51bmJpbmQoInRyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQiKSxxKCkpfSk6cSgpKToicmVzZXQiPT09aT9vLmNzcyhzLmFuaW1Qcm9wLGwpOiJ0aWNrZXIiPT09aSYmKG8uY3NzKCItIitzLmNzc1ByZWZpeCsiLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIiwibGluZWFyIiksby5jc3Mocy5hbmltUHJvcCxsKSwwIT09bj9vLmJpbmQoInRyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQiLGZ1bmN0aW9uKGUpe3QoZS50YXJnZXQpLmlzKG8pJiYoby51bmJpbmQoInRyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQiKSxTKHIucmVzZXRWYWx1ZSwicmVzZXQiLDApLEwoKSl9KTooUyhyLnJlc2V0VmFsdWUsInJlc2V0IiwwKSxMKCkpKSk6KGE9e30sYVtzLmFuaW1Qcm9wXT1lLCJzbGlkZSI9PT1pP28uYW5pbWF0ZShhLG4scy5zZXR0aW5ncy5lYXNpbmcsZnVuY3Rpb24oKXtxKCl9KToicmVzZXQiPT09aT9vLmNzcyhzLmFuaW1Qcm9wLGUpOiJ0aWNrZXIiPT09aSYmby5hbmltYXRlKGEsbiwibGluZWFyIixmdW5jdGlvbigpe1Moci5yZXNldFZhbHVlLCJyZXNldCIsMCksTCgpfSkpfSxiPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPSIiLGk9IiIsbj1mKCksbz0wO288bjtvKyspaT0iIixzLnNldHRpbmdzLmJ1aWxkUGFnZXImJnQuaXNGdW5jdGlvbihzLnNldHRpbmdzLmJ1aWxkUGFnZXIpfHxzLnNldHRpbmdzLnBhZ2VyQ3VzdG9tPyhpPXMuc2V0dGluZ3MuYnVpbGRQYWdlcihvKSxzLnBhZ2VyRWwuYWRkQ2xhc3MoImJ4LWN1c3RvbS1wYWdlciIpKTooaT1vKzEscy5wYWdlckVsLmFkZENsYXNzKCJieC1kZWZhdWx0LXBhZ2VyIikpLGUrPSc8ZGl2IGNsYXNzPSJieC1wYWdlci1pdGVtIj48YSBocmVmPSIiIGRhdGEtc2xpZGUtaW5kZXg9IicrbysnIiBjbGFzcz0iYngtcGFnZXItbGluayI+JytpKyI8L2E+PC9kaXY+IjtzLnBhZ2VyRWwuaHRtbChlKX0sdz1mdW5jdGlvbigpe3Muc2V0dGluZ3MucGFnZXJDdXN0b20/cy5wYWdlckVsPXQocy5zZXR0aW5ncy5wYWdlckN1c3RvbSk6KHMucGFnZXJFbD10KCc8ZGl2IGNsYXNzPSJieC1wYWdlciIgLz4nKSxzLnNldHRpbmdzLnBhZ2VyU2VsZWN0b3I/dChzLnNldHRpbmdzLnBhZ2VyU2VsZWN0b3IpLmh0bWwocy5wYWdlckVsKTpzLmNvbnRyb2xzLmVsLmFkZENsYXNzKCJieC1oYXMtcGFnZXIiKS5hcHBlbmQocy5wYWdlckVsKSxiKCkpLHMucGFnZXJFbC5vbigiY2xpY2sgdG91Y2hlbmQiLCJhIix6KX0sQz1mdW5jdGlvbigpe3MuY29udHJvbHMubmV4dD10KCc8YSBjbGFzcz0iYngtbmV4dCIgaHJlZj0iIj4nK3Muc2V0dGluZ3MubmV4dFRleHQrIjwvYT4iKSxzLmNvbnRyb2xzLnByZXY9dCgnPGEgY2xhc3M9ImJ4LXByZXYiIGhyZWY9IiI+JytzLnNldHRpbmdzLnByZXZUZXh0KyI8L2E+Iikscy5jb250cm9scy5uZXh0LmJpbmQoImNsaWNrIHRvdWNoZW5kIixFKSxzLmNvbnRyb2xzLnByZXYuYmluZCgiY2xpY2sgdG91Y2hlbmQiLGspLHMuc2V0dGluZ3MubmV4dFNlbGVjdG9yJiZ0KHMuc2V0dGluZ3MubmV4dFNlbGVjdG9yKS5hcHBlbmQocy5jb250cm9scy5uZXh0KSxzLnNldHRpbmdzLnByZXZTZWxlY3RvciYmdChzLnNldHRpbmdzLnByZXZTZWxlY3RvcikuYXBwZW5kKHMuY29udHJvbHMucHJldikscy5zZXR0aW5ncy5uZXh0U2VsZWN0b3J8fHMuc2V0dGluZ3MucHJldlNlbGVjdG9yfHwocy5jb250cm9scy5kaXJlY3Rpb25FbD10KCc8ZGl2IGNsYXNzPSJieC1jb250cm9scy1kaXJlY3Rpb24iIC8+Jykscy5jb250cm9scy5kaXJlY3Rpb25FbC5hcHBlbmQocy5jb250cm9scy5wcmV2KS5hcHBlbmQocy5jb250cm9scy5uZXh0KSxzLmNvbnRyb2xzLmVsLmFkZENsYXNzKCJieC1oYXMtY29udHJvbHMtZGlyZWN0aW9uIikuYXBwZW5kKHMuY29udHJvbHMuZGlyZWN0aW9uRWwpKX0sVD1mdW5jdGlvbigpe3MuY29udHJvbHMuc3RhcnQ9dCgnPGRpdiBjbGFzcz0iYngtY29udHJvbHMtYXV0by1pdGVtIj48YSBjbGFzcz0iYngtc3RhcnQiIGhyZWY9IiI+JytzLnNldHRpbmdzLnN0YXJ0VGV4dCsiPC9hPjwvZGl2PiIpLHMuY29udHJvbHMuc3RvcD10KCc8ZGl2IGNsYXNzPSJieC1jb250cm9scy1hdXRvLWl0ZW0iPjxhIGNsYXNzPSJieC1zdG9wIiBocmVmPSIiPicrcy5zZXR0aW5ncy5zdG9wVGV4dCsiPC9hPjwvZGl2PiIpLHMuY29udHJvbHMuYXV0b0VsPXQoJzxkaXYgY2xhc3M9ImJ4LWNvbnRyb2xzLWF1dG8iIC8+Jykscy5jb250cm9scy5hdXRvRWwub24oImNsaWNrIiwiLmJ4LXN0YXJ0IixNKSxzLmNvbnRyb2xzLmF1dG9FbC5vbigiY2xpY2siLCIuYngtc3RvcCIseSkscy5zZXR0aW5ncy5hdXRvQ29udHJvbHNDb21iaW5lP3MuY29udHJvbHMuYXV0b0VsLmFwcGVuZChzLmNvbnRyb2xzLnN0YXJ0KTpzLmNvbnRyb2xzLmF1dG9FbC5hcHBlbmQocy5jb250cm9scy5zdGFydCkuYXBwZW5kKHMuY29udHJvbHMuc3RvcCkscy5zZXR0aW5ncy5hdXRvQ29udHJvbHNTZWxlY3Rvcj90KHMuc2V0dGluZ3MuYXV0b0NvbnRyb2xzU2VsZWN0b3IpLmh0bWwocy5jb250cm9scy5hdXRvRWwpOnMuY29udHJvbHMuZWwuYWRkQ2xhc3MoImJ4LWhhcy1jb250cm9scy1hdXRvIikuYXBwZW5kKHMuY29udHJvbHMuYXV0b0VsKSxBKHMuc2V0dGluZ3MuYXV0b1N0YXJ0PyJzdG9wIjoic3RhcnQiKX0sUD1mdW5jdGlvbigpe3MuY2hpbGRyZW4uZWFjaChmdW5jdGlvbihlKXt2YXIgaT10KHRoaXMpLmZpbmQoImltZzpmaXJzdCIpLmF0dHIoInRpdGxlIik7dm9pZCAwIT09aSYmKCIiK2kpLmxlbmd0aCYmdCh0aGlzKS5hcHBlbmQoJzxkaXYgY2xhc3M9ImJ4LWNhcHRpb24iPjxzcGFuPicraSsiPC9zcGFuPjwvZGl2PiIpfSl9LEU9ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHMuY29udHJvbHMuZWwuaGFzQ2xhc3MoImRpc2FibGVkIil8fChzLnNldHRpbmdzLmF1dG8mJnMuc2V0dGluZ3Muc3RvcEF1dG9PbkNsaWNrJiZvLnN0b3BBdXRvKCksby5nb1RvTmV4dFNsaWRlKCkpfSxrPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSxzLmNvbnRyb2xzLmVsLmhhc0NsYXNzKCJkaXNhYmxlZCIpfHwocy5zZXR0aW5ncy5hdXRvJiZzLnNldHRpbmdzLnN0b3BBdXRvT25DbGljayYmby5zdG9wQXV0bygpLG8uZ29Ub1ByZXZTbGlkZSgpKX0sTT1mdW5jdGlvbih0KXtvLnN0YXJ0QXV0bygpLHQucHJldmVudERlZmF1bHQoKX0seT1mdW5jdGlvbih0KXtvLnN0b3BBdXRvKCksdC5wcmV2ZW50RGVmYXVsdCgpfSx6PWZ1bmN0aW9uKGUpe3ZhciBpLG47ZS5wcmV2ZW50RGVmYXVsdCgpLHMuY29udHJvbHMuZWwuaGFzQ2xhc3MoImRpc2FibGVkIil8fChzLnNldHRpbmdzLmF1dG8mJnMuc2V0dGluZ3Muc3RvcEF1dG9PbkNsaWNrJiZvLnN0b3BBdXRvKCksaT10KGUuY3VycmVudFRhcmdldCksdm9pZCAwIT09aS5hdHRyKCJkYXRhLXNsaWRlLWluZGV4IikmJihuPXBhcnNlSW50KGkuYXR0cigiZGF0YS1zbGlkZS1pbmRleCIpKSxuIT09cy5hY3RpdmUuaW5kZXgmJm8uZ29Ub1NsaWRlKG4pKSl9LEk9ZnVuY3Rpb24oZSl7dmFyIGk9cy5jaGlsZHJlbi5sZW5ndGg7cmV0dXJuInNob3J0Ij09PXMuc2V0dGluZ3MucGFnZXJUeXBlPyhzLnNldHRpbmdzLm1heFNsaWRlcz4xJiYoaT1NYXRoLmNlaWwocy5jaGlsZHJlbi5sZW5ndGgvcy5zZXR0aW5ncy5tYXhTbGlkZXMpKSx2b2lkIHMucGFnZXJFbC5odG1sKGUrMStzLnNldHRpbmdzLnBhZ2VyU2hvcnRTZXBhcmF0b3IraSkpOihzLnBhZ2VyRWwuZmluZCgiYSIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSx2b2lkIHMucGFnZXJFbC5lYWNoKGZ1bmN0aW9uKGksbil7dChuKS5maW5kKCJhIikuZXEoZSkuYWRkQ2xhc3MoImFjdGl2ZSIpfSkpfSxxPWZ1bmN0aW9uKCl7aWYocy5zZXR0aW5ncy5pbmZpbml0ZUxvb3Ape3ZhciB0PSIiOzA9PT1zLmFjdGl2ZS5pbmRleD90PXMuY2hpbGRyZW4uZXEoMCkucG9zaXRpb24oKTpzLmFjdGl2ZS5pbmRleD09PWYoKS0xJiZzLmNhcm91c2VsP3Q9cy5jaGlsZHJlbi5lcSgoZigpLTEpKngoKSkucG9zaXRpb24oKTpzLmFjdGl2ZS5pbmRleD09PXMuY2hpbGRyZW4ubGVuZ3RoLTEmJih0PXMuY2hpbGRyZW4uZXEocy5jaGlsZHJlbi5sZW5ndGgtMSkucG9zaXRpb24oKSksdCYmKCJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT9TKC10LmxlZnQsInJlc2V0IiwwKToidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlJiZTKC10LnRvcCwicmVzZXQiLDApKX1zLndvcmtpbmc9ITEscy5zZXR0aW5ncy5vblNsaWRlQWZ0ZXIuY2FsbChvLHMuY2hpbGRyZW4uZXEocy5hY3RpdmUuaW5kZXgpLHMub2xkSW5kZXgscy5hY3RpdmUuaW5kZXgpfSxBPWZ1bmN0aW9uKHQpe3Muc2V0dGluZ3MuYXV0b0NvbnRyb2xzQ29tYmluZT9zLmNvbnRyb2xzLmF1dG9FbC5odG1sKHMuY29udHJvbHNbdF0pOihzLmNvbnRyb2xzLmF1dG9FbC5maW5kKCJhIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLHMuY29udHJvbHMuYXV0b0VsLmZpbmQoImE6bm90KC5ieC0iK3QrIikiKS5hZGRDbGFzcygiYWN0aXZlIikpfSxEPWZ1bmN0aW9uKCl7MT09PWYoKT8ocy5jb250cm9scy5wcmV2LmFkZENsYXNzKCJkaXNhYmxlZCIpLHMuY29udHJvbHMubmV4dC5hZGRDbGFzcygiZGlzYWJsZWQiKSk6IXMuc2V0dGluZ3MuaW5maW5pdGVMb29wJiZzLnNldHRpbmdzLmhpZGVDb250cm9sT25FbmQmJigwPT09cy5hY3RpdmUuaW5kZXg/KHMuY29udHJvbHMucHJldi5hZGRDbGFzcygiZGlzYWJsZWQiKSxzLmNvbnRyb2xzLm5leHQucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikpOnMuYWN0aXZlLmluZGV4PT09ZigpLTE/KHMuY29udHJvbHMubmV4dC5hZGRDbGFzcygiZGlzYWJsZWQiKSxzLmNvbnRyb2xzLnByZXYucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikpOihzLmNvbnRyb2xzLnByZXYucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikscy5jb250cm9scy5uZXh0LnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpKSl9LEg9ZnVuY3Rpb24oKXtpZihzLnNldHRpbmdzLmF1dG9EZWxheT4wKXtzZXRUaW1lb3V0KG8uc3RhcnRBdXRvLHMuc2V0dGluZ3MuYXV0b0RlbGF5KX1lbHNlIG8uc3RhcnRBdXRvKCksdCh3aW5kb3cpLmZvY3VzKGZ1bmN0aW9uKCl7by5zdGFydEF1dG8oKX0pLmJsdXIoZnVuY3Rpb24oKXtvLnN0b3BBdXRvKCl9KTtzLnNldHRpbmdzLmF1dG9Ib3ZlciYmby5ob3ZlcihmdW5jdGlvbigpe3MuaW50ZXJ2YWwmJihvLnN0b3BBdXRvKCEwKSxzLmF1dG9QYXVzZWQ9ITApfSxmdW5jdGlvbigpe3MuYXV0b1BhdXNlZCYmKG8uc3RhcnRBdXRvKCEwKSxzLmF1dG9QYXVzZWQ9bnVsbCl9KX0sVz1mdW5jdGlvbigpe3ZhciBlLGksbixyLGEsbCxkLGMsZz0wOyJuZXh0Ij09PXMuc2V0dGluZ3MuYXV0b0RpcmVjdGlvbj9vLmFwcGVuZChzLmNoaWxkcmVuLmNsb25lKCkuYWRkQ2xhc3MoImJ4LWNsb25lIikpOihvLnByZXBlbmQocy5jaGlsZHJlbi5jbG9uZSgpLmFkZENsYXNzKCJieC1jbG9uZSIpKSxlPXMuY2hpbGRyZW4uZmlyc3QoKS5wb3NpdGlvbigpLGc9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPy1lLmxlZnQ6LWUudG9wKSxTKGcsInJlc2V0IiwwKSxzLnNldHRpbmdzLnBhZ2VyPSExLHMuc2V0dGluZ3MuY29udHJvbHM9ITEscy5zZXR0aW5ncy5hdXRvQ29udHJvbHM9ITEscy5zZXR0aW5ncy50aWNrZXJIb3ZlciYmKHMudXNpbmdDU1M/KHI9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPzQ6NSxzLnZpZXdwb3J0LmhvdmVyKGZ1bmN0aW9uKCl7aT1vLmNzcygiLSIrcy5jc3NQcmVmaXgrIi10cmFuc2Zvcm0iKSxuPXBhcnNlRmxvYXQoaS5zcGxpdCgiLCIpW3JdKSxTKG4sInJlc2V0IiwwKX0sZnVuY3Rpb24oKXtjPTAscy5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKGUpe2MrPSJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT90KHRoaXMpLm91dGVyV2lkdGgoITApOnQodGhpcykub3V0ZXJIZWlnaHQoITApfSksYT1zLnNldHRpbmdzLnNwZWVkL2MsbD0iaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGU/ImxlZnQiOiJ0b3AiLGQ9YSooYy1NYXRoLmFicyhwYXJzZUludChuKSkpLEwoZCl9KSk6cy52aWV3cG9ydC5ob3ZlcihmdW5jdGlvbigpe28uc3RvcCgpfSxmdW5jdGlvbigpe2M9MCxzLmNoaWxkcmVuLmVhY2goZnVuY3Rpb24oZSl7Yys9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlP3QodGhpcykub3V0ZXJXaWR0aCghMCk6dCh0aGlzKS5vdXRlckhlaWdodCghMCl9KSxhPXMuc2V0dGluZ3Muc3BlZWQvYyxsPSJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8ibGVmdCI6InRvcCIsZD1hKihjLU1hdGguYWJzKHBhcnNlSW50KG8uY3NzKGwpKSkpLEwoZCl9KSksTCgpfSxMPWZ1bmN0aW9uKHQpe3ZhciBlLGksbixyPXQ/dDpzLnNldHRpbmdzLnNwZWVkLGE9e2xlZnQ6MCx0b3A6MH0sbD17bGVmdDowLHRvcDowfTsibmV4dCI9PT1zLnNldHRpbmdzLmF1dG9EaXJlY3Rpb24/YT1vLmZpbmQoIi5ieC1jbG9uZSIpLmZpcnN0KCkucG9zaXRpb24oKTpsPXMuY2hpbGRyZW4uZmlyc3QoKS5wb3NpdGlvbigpLGU9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPy1hLmxlZnQ6LWEudG9wLGk9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPy1sLmxlZnQ6LWwudG9wLG49e3Jlc2V0VmFsdWU6aX0sUyhlLCJ0aWNrZXIiLHIsbil9LE89ZnVuY3Rpb24oZSl7dmFyIGk9dCh3aW5kb3cpLG49e3RvcDppLnNjcm9sbFRvcCgpLGxlZnQ6aS5zY3JvbGxMZWZ0KCl9LHM9ZS5vZmZzZXQoKTtyZXR1cm4gbi5yaWdodD1uLmxlZnQraS53aWR0aCgpLG4uYm90dG9tPW4udG9wK2kuaGVpZ2h0KCkscy5yaWdodD1zLmxlZnQrZS5vdXRlcldpZHRoKCkscy5ib3R0b209cy50b3ArZS5vdXRlckhlaWdodCgpLCEobi5yaWdodDxzLmxlZnR8fG4ubGVmdD5zLnJpZ2h0fHxuLmJvdHRvbTxzLnRvcHx8bi50b3A+cy5ib3R0b20pfSxGPWZ1bmN0aW9uKHQpe3ZhciBlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpLGk9ImlucHV0fHRleHRhcmVhIixuPW5ldyBSZWdFeHAoZSxbImkiXSkscz1uLmV4ZWMoaSk7aWYobnVsbD09cyYmTyhvKSl7aWYoMzk9PT10LmtleUNvZGUpcmV0dXJuIEUodCksITE7aWYoMzc9PT10LmtleUNvZGUpcmV0dXJuIGsodCksITF9fSxOPWZ1bmN0aW9uKCl7cy50b3VjaD17c3RhcnQ6e3g6MCx5OjB9LGVuZDp7eDowLHk6MH19LHMudmlld3BvcnQuYmluZCgidG91Y2hzdGFydCBNU1BvaW50ZXJEb3duIHBvaW50ZXJkb3duIixYKSxzLnZpZXdwb3J0Lm9uKCJjbGljayIsIi5ieHNsaWRlciBhIixmdW5jdGlvbih0KXtzLnZpZXdwb3J0Lmhhc0NsYXNzKCJjbGljay1kaXNhYmxlZCIpJiYodC5wcmV2ZW50RGVmYXVsdCgpLHMudmlld3BvcnQucmVtb3ZlQ2xhc3MoImNsaWNrLWRpc2FibGVkIikpfSl9LFg9ZnVuY3Rpb24odCl7aWYocy5jb250cm9scy5lbC5hZGRDbGFzcygiZGlzYWJsZWQiKSxzLndvcmtpbmcpdC5wcmV2ZW50RGVmYXVsdCgpLHMuY29udHJvbHMuZWwucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7ZWxzZXtzLnRvdWNoLm9yaWdpbmFsUG9zPW8ucG9zaXRpb24oKTt2YXIgZT10Lm9yaWdpbmFsRXZlbnQsaT0idW5kZWZpbmVkIiE9dHlwZW9mIGUuY2hhbmdlZFRvdWNoZXM/ZS5jaGFuZ2VkVG91Y2hlczpbZV07cy50b3VjaC5zdGFydC54PWlbMF0ucGFnZVgscy50b3VjaC5zdGFydC55PWlbMF0ucGFnZVkscy52aWV3cG9ydC5nZXQoMCkuc2V0UG9pbnRlckNhcHR1cmUmJihzLnBvaW50ZXJJZD1lLnBvaW50ZXJJZCxzLnZpZXdwb3J0LmdldCgwKS5zZXRQb2ludGVyQ2FwdHVyZShzLnBvaW50ZXJJZCkpLHMudmlld3BvcnQuYmluZCgidG91Y2htb3ZlIE1TUG9pbnRlck1vdmUgcG9pbnRlcm1vdmUiLFYpLHMudmlld3BvcnQuYmluZCgidG91Y2hlbmQgTVNQb2ludGVyVXAgcG9pbnRlcnVwIixSKSxzLnZpZXdwb3J0LmJpbmQoIk1TUG9pbnRlckNhbmNlbCBwb2ludGVyY2FuY2VsIixZKX19LFk9ZnVuY3Rpb24odCl7UyhzLnRvdWNoLm9yaWdpbmFsUG9zLmxlZnQsInJlc2V0IiwwKSxzLmNvbnRyb2xzLmVsLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpLHMudmlld3BvcnQudW5iaW5kKCJNU1BvaW50ZXJDYW5jZWwgcG9pbnRlcmNhbmNlbCIsWSkscy52aWV3cG9ydC51bmJpbmQoInRvdWNobW92ZSBNU1BvaW50ZXJNb3ZlIHBvaW50ZXJtb3ZlIixWKSxzLnZpZXdwb3J0LnVuYmluZCgidG91Y2hlbmQgTVNQb2ludGVyVXAgcG9pbnRlcnVwIixSKSxzLnZpZXdwb3J0LmdldCgwKS5yZWxlYXNlUG9pbnRlckNhcHR1cmUmJnMudmlld3BvcnQuZ2V0KDApLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShzLnBvaW50ZXJJZCl9LFY9ZnVuY3Rpb24odCl7dmFyIGU9dC5vcmlnaW5hbEV2ZW50LGk9InVuZGVmaW5lZCIhPXR5cGVvZiBlLmNoYW5nZWRUb3VjaGVzP2UuY2hhbmdlZFRvdWNoZXM6W2VdLG49TWF0aC5hYnMoaVswXS5wYWdlWC1zLnRvdWNoLnN0YXJ0LngpLG89TWF0aC5hYnMoaVswXS5wYWdlWS1zLnRvdWNoLnN0YXJ0LnkpLHI9MCxhPTA7MypuPm8mJnMuc2V0dGluZ3MucHJldmVudERlZmF1bHRTd2lwZVg/dC5wcmV2ZW50RGVmYXVsdCgpOjMqbz5uJiZzLnNldHRpbmdzLnByZXZlbnREZWZhdWx0U3dpcGVZJiZ0LnByZXZlbnREZWZhdWx0KCksImZhZGUiIT09cy5zZXR0aW5ncy5tb2RlJiZzLnNldHRpbmdzLm9uZVRvT25lVG91Y2gmJigiaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGU/KGE9aVswXS5wYWdlWC1zLnRvdWNoLnN0YXJ0Lngscj1zLnRvdWNoLm9yaWdpbmFsUG9zLmxlZnQrYSk6KGE9aVswXS5wYWdlWS1zLnRvdWNoLnN0YXJ0Lnkscj1zLnRvdWNoLm9yaWdpbmFsUG9zLnRvcCthKSxTKHIsInJlc2V0IiwwKSl9LFI9ZnVuY3Rpb24odCl7cy52aWV3cG9ydC51bmJpbmQoInRvdWNobW92ZSBNU1BvaW50ZXJNb3ZlIHBvaW50ZXJtb3ZlIixWKSxzLmNvbnRyb2xzLmVsLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO3ZhciBlPXQub3JpZ2luYWxFdmVudCxpPSJ1bmRlZmluZWQiIT10eXBlb2YgZS5jaGFuZ2VkVG91Y2hlcz9lLmNoYW5nZWRUb3VjaGVzOltlXSxuPTAscj0wO3MudG91Y2guZW5kLng9aVswXS5wYWdlWCxzLnRvdWNoLmVuZC55PWlbMF0ucGFnZVksImZhZGUiPT09cy5zZXR0aW5ncy5tb2RlPyhyPU1hdGguYWJzKHMudG91Y2guc3RhcnQueC1zLnRvdWNoLmVuZC54KSxyPj1zLnNldHRpbmdzLnN3aXBlVGhyZXNob2xkJiYocy50b3VjaC5zdGFydC54PnMudG91Y2guZW5kLng/by5nb1RvTmV4dFNsaWRlKCk6by5nb1RvUHJldlNsaWRlKCksby5zdG9wQXV0bygpKSk6KCJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8ocj1zLnRvdWNoLmVuZC54LXMudG91Y2guc3RhcnQueCxuPXMudG91Y2gub3JpZ2luYWxQb3MubGVmdCk6KHI9cy50b3VjaC5lbmQueS1zLnRvdWNoLnN0YXJ0Lnksbj1zLnRvdWNoLm9yaWdpbmFsUG9zLnRvcCksIXMuc2V0dGluZ3MuaW5maW5pdGVMb29wJiYoMD09PXMuYWN0aXZlLmluZGV4JiZyPjB8fHMuYWN0aXZlLmxhc3QmJnI8MCk/UyhuLCJyZXNldCIsMjAwKTpNYXRoLmFicyhyKT49cy5zZXR0aW5ncy5zd2lwZVRocmVzaG9sZD8ocjwwP28uZ29Ub05leHRTbGlkZSgpOm8uZ29Ub1ByZXZTbGlkZSgpLG8uc3RvcEF1dG8oKSk6UyhuLCJyZXNldCIsMjAwKSkscy52aWV3cG9ydC51bmJpbmQoInRvdWNoZW5kIE1TUG9pbnRlclVwIHBvaW50ZXJ1cCIsUikscy52aWV3cG9ydC5nZXQoMCkucmVsZWFzZVBvaW50ZXJDYXB0dXJlJiZzLnZpZXdwb3J0LmdldCgwKS5yZWxlYXNlUG9pbnRlckNhcHR1cmUocy5wb2ludGVySWQpfSxaPWZ1bmN0aW9uKGUpe2lmKHMuaW5pdGlhbGl6ZWQpaWYocy53b3JraW5nKXdpbmRvdy5zZXRUaW1lb3V0KFosMTApO2Vsc2V7dmFyIGk9dCh3aW5kb3cpLndpZHRoKCksbj10KHdpbmRvdykuaGVpZ2h0KCk7cj09PWkmJmE9PT1ufHwocj1pLGE9bixvLnJlZHJhd1NsaWRlcigpLHMuc2V0dGluZ3Mub25TbGlkZXJSZXNpemUuY2FsbChvLHMuYWN0aXZlLmluZGV4KSl9fSxCPWZ1bmN0aW9uKHQpe3ZhciBlPXYoKTtzLnNldHRpbmdzLmFyaWFIaWRkZW4mJiFzLnNldHRpbmdzLnRpY2tlciYmKHMuY2hpbGRyZW4uYXR0cigiYXJpYS1oaWRkZW4iLCJ0cnVlIikscy5jaGlsZHJlbi5zbGljZSh0LHQrZSkuYXR0cigiYXJpYS1oaWRkZW4iLCJmYWxzZSIpKX0sVT1mdW5jdGlvbih0KXtyZXR1cm4gdDwwP3Muc2V0dGluZ3MuaW5maW5pdGVMb29wP2YoKS0xOnMuYWN0aXZlLmluZGV4OnQ+PWYoKT9zLnNldHRpbmdzLmluZmluaXRlTG9vcD8wOnMuYWN0aXZlLmluZGV4OnR9O3JldHVybiBvLmdvVG9TbGlkZT1mdW5jdGlvbihlLGkpe3ZhciBuLHIsYSxsLGQ9ITAsYz0wLGc9e2xlZnQ6MCx0b3A6MH0sdT1udWxsO2lmKHMub2xkSW5kZXg9cy5hY3RpdmUuaW5kZXgscy5hY3RpdmUuaW5kZXg9VShlKSwhcy53b3JraW5nJiZzLmFjdGl2ZS5pbmRleCE9PXMub2xkSW5kZXgpe2lmKHMud29ya2luZz0hMCxkPXMuc2V0dGluZ3Mub25TbGlkZUJlZm9yZS5jYWxsKG8scy5jaGlsZHJlbi5lcShzLmFjdGl2ZS5pbmRleCkscy5vbGRJbmRleCxzLmFjdGl2ZS5pbmRleCksInVuZGVmaW5lZCIhPXR5cGVvZiBkJiYhZClyZXR1cm4gcy5hY3RpdmUuaW5kZXg9cy5vbGRJbmRleCx2b2lkKHMud29ya2luZz0hMSk7Im5leHQiPT09aT9zLnNldHRpbmdzLm9uU2xpZGVOZXh0LmNhbGwobyxzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KSxzLm9sZEluZGV4LHMuYWN0aXZlLmluZGV4KXx8KGQ9ITEpOiJwcmV2Ij09PWkmJihzLnNldHRpbmdzLm9uU2xpZGVQcmV2LmNhbGwobyxzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KSxzLm9sZEluZGV4LHMuYWN0aXZlLmluZGV4KXx8KGQ9ITEpKSxzLmFjdGl2ZS5sYXN0PXMuYWN0aXZlLmluZGV4Pj1mKCktMSwocy5zZXR0aW5ncy5wYWdlcnx8cy5zZXR0aW5ncy5wYWdlckN1c3RvbSkmJkkocy5hY3RpdmUuaW5kZXgpLHMuc2V0dGluZ3MuY29udHJvbHMmJkQoKSwiZmFkZSI9PT1zLnNldHRpbmdzLm1vZGU/KHMuc2V0dGluZ3MuYWRhcHRpdmVIZWlnaHQmJnMudmlld3BvcnQuaGVpZ2h0KCkhPT1wKCkmJnMudmlld3BvcnQuYW5pbWF0ZSh7aGVpZ2h0OnAoKX0scy5zZXR0aW5ncy5hZGFwdGl2ZUhlaWdodFNwZWVkKSxzLmNoaWxkcmVuLmZpbHRlcigiOnZpc2libGUiKS5mYWRlT3V0KHMuc2V0dGluZ3Muc3BlZWQpLmNzcyh7ekluZGV4OjB9KSxzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KS5jc3MoInpJbmRleCIscy5zZXR0aW5ncy5zbGlkZVpJbmRleCsxKS5mYWRlSW4ocy5zZXR0aW5ncy5zcGVlZCxmdW5jdGlvbigpe3QodGhpcykuY3NzKCJ6SW5kZXgiLHMuc2V0dGluZ3Muc2xpZGVaSW5kZXgpLHEoKX0pKToocy5zZXR0aW5ncy5hZGFwdGl2ZUhlaWdodCYmcy52aWV3cG9ydC5oZWlnaHQoKSE9PXAoKSYmcy52aWV3cG9ydC5hbmltYXRlKHtoZWlnaHQ6cCgpfSxzLnNldHRpbmdzLmFkYXB0aXZlSGVpZ2h0U3BlZWQpLCFzLnNldHRpbmdzLmluZmluaXRlTG9vcCYmcy5jYXJvdXNlbCYmcy5hY3RpdmUubGFzdD8iaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGU/KHU9cy5jaGlsZHJlbi5lcShzLmNoaWxkcmVuLmxlbmd0aC0xKSxnPXUucG9zaXRpb24oKSxjPXMudmlld3BvcnQud2lkdGgoKS11Lm91dGVyV2lkdGgoKSk6KG49cy5jaGlsZHJlbi5sZW5ndGgtcy5zZXR0aW5ncy5taW5TbGlkZXMsZz1zLmNoaWxkcmVuLmVxKG4pLnBvc2l0aW9uKCkpOnMuY2Fyb3VzZWwmJnMuYWN0aXZlLmxhc3QmJiJwcmV2Ij09PWk/KHI9MT09PXMuc2V0dGluZ3MubW92ZVNsaWRlcz9zLnNldHRpbmdzLm1heFNsaWRlcy14KCk6KGYoKS0xKSp4KCktKHMuY2hpbGRyZW4ubGVuZ3RoLXMuc2V0dGluZ3MubWF4U2xpZGVzKSx1PW8uY2hpbGRyZW4oIi5ieC1jbG9uZSIpLmVxKHIpLGc9dS5wb3NpdGlvbigpKToibmV4dCI9PT1pJiYwPT09cy5hY3RpdmUuaW5kZXg/KGc9by5maW5kKCI+IC5ieC1jbG9uZSIpLmVxKHMuc2V0dGluZ3MubWF4U2xpZGVzKS5wb3NpdGlvbigpLHMuYWN0aXZlLmxhc3Q9ITEpOmU+PTAmJihsPWUqcGFyc2VJbnQoeCgpKSxnPXMuY2hpbGRyZW4uZXEobCkucG9zaXRpb24oKSksInVuZGVmaW5lZCIhPXR5cGVvZiBnPyhhPSJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8tKGcubGVmdC1jKTotZy50b3AsUyhhLCJzbGlkZSIscy5zZXR0aW5ncy5zcGVlZCkpOnMud29ya2luZz0hMSkscy5zZXR0aW5ncy5hcmlhSGlkZGVuJiZCKHMuYWN0aXZlLmluZGV4KngoKSl9fSxvLmdvVG9OZXh0U2xpZGU9ZnVuY3Rpb24oKXtpZihzLnNldHRpbmdzLmluZmluaXRlTG9vcHx8IXMuYWN0aXZlLmxhc3Qpe3ZhciB0PXBhcnNlSW50KHMuYWN0aXZlLmluZGV4KSsxO28uZ29Ub1NsaWRlKHQsIm5leHQiKX19LG8uZ29Ub1ByZXZTbGlkZT1mdW5jdGlvbigpe2lmKHMuc2V0dGluZ3MuaW5maW5pdGVMb29wfHwwIT09cy5hY3RpdmUuaW5kZXgpe3ZhciB0PXBhcnNlSW50KHMuYWN0aXZlLmluZGV4KS0xO28uZ29Ub1NsaWRlKHQsInByZXYiKX19LG8uc3RhcnRBdXRvPWZ1bmN0aW9uKHQpe3MuaW50ZXJ2YWx8fChzLmludGVydmFsPXNldEludGVydmFsKGZ1bmN0aW9uKCl7Im5leHQiPT09cy5zZXR0aW5ncy5hdXRvRGlyZWN0aW9uP28uZ29Ub05leHRTbGlkZSgpOm8uZ29Ub1ByZXZTbGlkZSgpfSxzLnNldHRpbmdzLnBhdXNlKSxzLnNldHRpbmdzLmF1dG9Db250cm9scyYmdCE9PSEwJiZBKCJzdG9wIikpfSxvLnN0b3BBdXRvPWZ1bmN0aW9uKHQpe3MuaW50ZXJ2YWwmJihjbGVhckludGVydmFsKHMuaW50ZXJ2YWwpLHMuaW50ZXJ2YWw9bnVsbCxzLnNldHRpbmdzLmF1dG9Db250cm9scyYmdCE9PSEwJiZBKCJzdGFydCIpKX0sby5nZXRDdXJyZW50U2xpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gcy5hY3RpdmUuaW5kZXh9LG8uZ2V0Q3VycmVudFNsaWRlRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiBzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KX0sby5nZXRTbGlkZUVsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHMuY2hpbGRyZW4uZXEodCl9LG8uZ2V0U2xpZGVDb3VudD1mdW5jdGlvbigpe3JldHVybiBzLmNoaWxkcmVuLmxlbmd0aH0sby5pc1dvcmtpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gcy53b3JraW5nfSxvLnJlZHJhd1NsaWRlcj1mdW5jdGlvbigpe3MuY2hpbGRyZW4uYWRkKG8uZmluZCgiLmJ4LWNsb25lIikpLm91dGVyV2lkdGgoaCgpKSxzLnZpZXdwb3J0LmNzcygiaGVpZ2h0IixwKCkpLHMuc2V0dGluZ3MudGlja2VyfHxtKCkscy5hY3RpdmUubGFzdCYmKHMuYWN0aXZlLmluZGV4PWYoKS0xKSxzLmFjdGl2ZS5pbmRleD49ZigpJiYocy5hY3RpdmUubGFzdD0hMCkscy5zZXR0aW5ncy5wYWdlciYmIXMuc2V0dGluZ3MucGFnZXJDdXN0b20mJihiKCksSShzLmFjdGl2ZS5pbmRleCkpLHMuc2V0dGluZ3MuYXJpYUhpZGRlbiYmQihzLmFjdGl2ZS5pbmRleCp4KCkpfSxvLmRlc3Ryb3lTbGlkZXI9ZnVuY3Rpb24oKXtzLmluaXRpYWxpemVkJiYocy5pbml0aWFsaXplZD0hMSx0KCIuYngtY2xvbmUiLHRoaXMpLnJlbW92ZSgpLHMuY2hpbGRyZW4uZWFjaChmdW5jdGlvbigpe3ZvaWQgMCE9PXQodGhpcykuZGF0YSgib3JpZ1N0eWxlIik/dCh0aGlzKS5hdHRyKCJzdHlsZSIsdCh0aGlzKS5kYXRhKCJvcmlnU3R5bGUiKSk6dCh0aGlzKS5yZW1vdmVBdHRyKCJzdHlsZSIpfSksdm9pZCAwIT09dCh0aGlzKS5kYXRhKCJvcmlnU3R5bGUiKT90aGlzLmF0dHIoInN0eWxlIix0KHRoaXMpLmRhdGEoIm9yaWdTdHlsZSIpKTp0KHRoaXMpLnJlbW92ZUF0dHIoInN0eWxlIiksdCh0aGlzKS51bndyYXAoKS51bndyYXAoKSxzLmNvbnRyb2xzLmVsJiZzLmNvbnRyb2xzLmVsLnJlbW92ZSgpLHMuY29udHJvbHMubmV4dCYmcy5jb250cm9scy5uZXh0LnJlbW92ZSgpLHMuY29udHJvbHMucHJldiYmcy5jb250cm9scy5wcmV2LnJlbW92ZSgpLHMucGFnZXJFbCYmcy5zZXR0aW5ncy5jb250cm9scyYmIXMuc2V0dGluZ3MucGFnZXJDdXN0b20mJnMucGFnZXJFbC5yZW1vdmUoKSx0KCIuYngtY2FwdGlvbiIsdGhpcykucmVtb3ZlKCkscy5jb250cm9scy5hdXRvRWwmJnMuY29udHJvbHMuYXV0b0VsLnJlbW92ZSgpLGNsZWFySW50ZXJ2YWwocy5pbnRlcnZhbCkscy5zZXR0aW5ncy5yZXNwb25zaXZlJiZ0KHdpbmRvdykudW5iaW5kKCJyZXNpemUiLFopLHMuc2V0dGluZ3Mua2V5Ym9hcmRFbmFibGVkJiZ0KGRvY3VtZW50KS51bmJpbmQoImtleWRvd24iLEYpLHQodGhpcykucmVtb3ZlRGF0YSgiYnhTbGlkZXIiKSl9LG8ucmVsb2FkU2xpZGVyPWZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUmJihuPWUpLG8uZGVzdHJveVNsaWRlcigpLGwoKSx0KG8pLmRhdGEoImJ4U2xpZGVyIix0aGlzKX0sbCgpLHQobykuZGF0YSgiYnhTbGlkZXIiLHRoaXMpLHRoaXN9fX0oalF1ZXJ5KTsoZnVuY3Rpb24oJCl7JC5mbi5ldmVuWm9vbT1mdW5jdGlvbihvcHRpb25zKXt2YXIgZXZlblpvb209bmV3IEV2ZW5ab29tKCQodGhpcyksb3B0aW9ucyk7JCh0aGlzKS5tb3VzZWVudGVyKGZ1bmN0aW9uKCl7ZXZlblpvb20uY2hlY2tJbWFnZUNoYW5nZWQoJCh0aGlzKSk7ZXZlblpvb20uc2hvd0xlbnMoKX0pLm1vdXNlbW92ZShmdW5jdGlvbihlKXtldmVuWm9vbS5tb3ZlTGVucyhlLnBhZ2VYLGUucGFnZVkpfSkubW91c2VsZWF2ZShmdW5jdGlvbigpe2V2ZW5ab29tLmhpZGVMZW5zKCl9KX07ZnVuY3Rpb24gRXZlblpvb20oJGNvbnRhaW5lcixvcHRpb25zKXt0aGlzLl9pbml0PWZ1bmN0aW9uKHNldHRpbmdzKXtpZih0eXBlb2Ygc2V0dGluZ3MhPSJvYmplY3QiKXtzZXR0aW5ncz17fX0KdGhpcy5zZXR0aW5ncz17bGVuc1Bpbm5pbmdEaXN0YW5jZToyMH07dGhpcy5zZXR0aW5ncz0kLmV4dGVuZCh0aGlzLnNldHRpbmdzLHNldHRpbmdzKTt0aGlzLiRjb250YWluZXI9JGNvbnRhaW5lcjt0aGlzLiRjb250YWluZXIuYWRkQ2xhc3MoImV2ZW5ab29tIikuYXBwZW5kKCI8ZGl2IGNsYXNzPVwiZXZlblpvb21MZW5zIGhpZGRlblwiPjwvZGl2PiIpO3RoaXMuX2NhbGN1bGF0ZUltYWdlc1NpemUoKTt0aGlzLiRsZW5zPSQoIi5ldmVuWm9vbUxlbnMiLHRoaXMuJGNvbnRhaW5lcik7dGhpcy4kbGVucy5jc3MoImJhY2tncm91bmQtaW1hZ2UiLCJ1cmwoJyIrdGhpcy56b29tZWRJbWdTcmMrIicpIik7dGhpcy5sZW5zV2lkdGg9dGhpcy4kbGVucy53aWR0aCgpO3RoaXMubGVuc0hlaWdodD10aGlzLiRsZW5zLmhlaWdodCgpO3RoaXMubGVuc1dpZHRoSGFsZj10aGlzLmxlbnNXaWR0aC8yO3RoaXMubGVuc0hlaWdodEhhbGY9dGhpcy5sZW5zSGVpZ2h0LzI7dGhpcy5jdXJyZW50TGVuc1Bvc2l0aW9uWD0wO3RoaXMuY3VycmVudExlbnNQb3NpdGlvblk9MH07dGhpcy5fY2FsY3VsYXRlSW1hZ2VzU2l6ZT1mdW5jdGlvbigpe3RoaXMuaW1nU3JjPXRoaXMuX2ZpbmRPcmlnaW5hbEltZyh0aGlzLiRjb250YWluZXIpO3RoaXMuem9vbWVkSW1nU3JjPXRoaXMuJGNvbnRhaW5lci5kYXRhKCJ6b29tZWQiKTtpZih0aGlzLnpvb21lZEltZ1NyYyl7dmFyIHRoYXQ9dGhpczskKCI8aW1nIHNyYz0nIit0aGlzLmltZ1NyYysiJy8+Iikub24oJ2xvYWQnLGZ1bmN0aW9uKCl7dmFyIGltZ1dpZHRoPXRoaXMud2lkdGg7dmFyIGltZ0hlaWdodD10aGlzLmhlaWdodDt0aGF0LmNvbnRhaW50ZXJXaWR0aD10aGF0LiRjb250YWluZXIud2lkdGgoKTt0aGF0LmNvbnRhaW50ZXJIZWlnaHQ9dGhhdC4kY29udGFpbmVyLmhlaWdodCgpOyQoIjxpbWcgc3JjPSciK3RoYXQuem9vbWVkSW1nU3JjKyInLz4iKS5vbignbG9hZCcsZnVuY3Rpb24oKXtpZih0aGlzLndpZHRoPGltZ1dpZHRofHx0aGlzLmhlaWdodDxpbWdIZWlnaHQpe3RoYXQuem9vbWVkSW1nU3JjPXRoYXQuaW1nU3JjO3RoYXQuaW1nV2lkdGhSYXRpbz0xO3RoYXQuaW1nSGVpZ2h0UmF0aW89MX0KZWxzZXt0aGF0LmltZ1dpZHRoUmF0aW89dGhpcy53aWR0aC9pbWdXaWR0aDt0aGF0LmltZ0hlaWdodFJhdGlvPXRoaXMuaGVpZ2h0L2ltZ0hlaWdodH19KX0pfQplbHNle2NvbnNvbGUud2FybigiTm8gem9vbWVkIGltZyBmb3VuZCwgcGxlYXNlIHNldCBcImRhdGEtem9vbWVkXCIgZm9yIGV2ZW5ab29tIHNlbGVjdG9yIil9fTt0aGlzLl9maW5kT3JpZ2luYWxJbWc9ZnVuY3Rpb24oJGNvbnRhaW5lcil7aWYoJCgiaW1nIiwkY29udGFpbmVyKS5sZW5ndGgpe3JldHVybiAkKCJpbWc6Zmlyc3QiLCRjb250YWluZXIpLmF0dHIoInNyYyIpfQpjb25zb2xlLndhcm4oIk5vIG9yaWdpbmFsIGltZyBmb3VuZCwgcGxlYXNlIGFkZCBhbiA8aW1nPiB0YWcgaW5zaWRlIGV2ZW5ab29tIHNlbGVjdG9yIik7cmV0dXJuITF9O3RoaXMuY2FsY3VsYXRlQmFja2dyb3VuZFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIGJhY2tncm91bmRQb3NYPSgodGhpcy5jdXJyZW50TGVuc1Bvc2l0aW9uWC10aGlzLiRjb250YWluZXIub2Zmc2V0KCkubGVmdCt0aGlzLmxlbnNXaWR0aEhhbGYpKnRoaXMuaW1nV2lkdGhSYXRpbykqKC0xKSt0aGlzLmxlbnNXaWR0aEhhbGY7dmFyIGJhY2tncm91bmRQb3NZPSgodGhpcy5jdXJyZW50TGVuc1Bvc2l0aW9uWS10aGlzLiRjb250YWluZXIub2Zmc2V0KCkudG9wK3RoaXMubGVuc0hlaWdodEhhbGYpKnRoaXMuaW1nSGVpZ2h0UmF0aW8pKigtMSkrdGhpcy5sZW5zSGVpZ2h0SGFsZjt0aGlzLiRsZW5zLmNzcygiYmFja2dyb3VuZC1wb3NpdGlvbiIsYmFja2dyb3VuZFBvc1grInB4ICIrYmFja2dyb3VuZFBvc1krInB4Iil9O3RoaXMuX2luaXQob3B0aW9ucyl9CkV2ZW5ab29tLnByb3RvdHlwZS5zaG93TGVucz1mdW5jdGlvbigpe3RoaXMuJGxlbnMucmVtb3ZlQ2xhc3MoImhpZGRlbiIpfTtFdmVuWm9vbS5wcm90b3R5cGUuaGlkZUxlbnM9ZnVuY3Rpb24oKXt0aGlzLiRsZW5zLmFkZENsYXNzKCJoaWRkZW4iKX07RXZlblpvb20ucHJvdG90eXBlLmNoZWNrSW1hZ2VDaGFuZ2VkPWZ1bmN0aW9uKCRjb250YWluZXIpe3ZhciBuZXdJbWdTcmM9dGhpcy5fZmluZE9yaWdpbmFsSW1nKCRjb250YWluZXIpO2lmKG5ld0ltZ1NyYyE9dGhpcy5pbWdTcmMpe2lmKG5ld0ltZ1NyYyE9ITEpe3RoaXMucmVpbml0aWFsaXplKCRjb250YWluZXIpfQplbHNle3RoaXMuaGlkZUxlbnMoKX19fTtFdmVuWm9vbS5wcm90b3R5cGUucmVpbml0aWFsaXplPWZ1bmN0aW9uKCRjb250YWluZXIpe3RoaXMuJGNvbnRhaW5lcj0kY29udGFpbmVyO3RoaXMuY29udGFpbnRlcldpZHRoPXRoaXMuJGNvbnRhaW5lci53aWR0aCgpO3RoaXMuY29udGFpbnRlckhlaWdodD10aGlzLiRjb250YWluZXIuaGVpZ2h0KCk7dGhpcy5fY2FsY3VsYXRlSW1hZ2VzU2l6ZSgpO3RoaXMuJGxlbnMuY3NzKCJiYWNrZ3JvdW5kLWltYWdlIiwidXJsKCciK3RoaXMuem9vbWVkSW1nU3JjKyInKSIpfTtFdmVuWm9vbS5wcm90b3R5cGUubW92ZUxlbnM9ZnVuY3Rpb24obmV3UG9zWCxuZXdQb3NZKXt2YXIgbGVuc1Bvc1g9bmV3UG9zWC10aGlzLmxlbnNXaWR0aEhhbGY7dmFyIGxlbnNQb3NZPW5ld1Bvc1ktdGhpcy5sZW5zSGVpZ2h0SGFsZjt2YXIgbWluTGVuc1Bvc1g9dGhpcy4kY29udGFpbmVyLm9mZnNldCgpLmxlZnQtdGhpcy5sZW5zV2lkdGhIYWxmO3ZhciBtaW5MZW5zUG9zWT10aGlzLiRjb250YWluZXIub2Zmc2V0KCkudG9wLXRoaXMubGVuc0hlaWdodEhhbGY7dmFyIG1heExlbnNQb3NYPW1pbkxlbnNQb3NYK3RoaXMuY29udGFpbnRlcldpZHRoO3ZhciBtYXhMZW5zUG9zWT1taW5MZW5zUG9zWSt0aGlzLmNvbnRhaW50ZXJIZWlnaHQ7dmFyIGhpZGVMZW5zPSExO2lmKGxlbnNQb3NYPD1taW5MZW5zUG9zWCl7aWYobWluTGVuc1Bvc1gtbGVuc1Bvc1g+PXRoaXMuc2V0dGluZ3MubGVuc1Bpbm5pbmdEaXN0YW5jZSl7aGlkZUxlbnM9ITB9CmxlbnNQb3NYPW1pbkxlbnNQb3NYfWVsc2UgaWYobGVuc1Bvc1g+PW1heExlbnNQb3NYKXtpZihsZW5zUG9zWC1tYXhMZW5zUG9zWD49dGhpcy5zZXR0aW5ncy5sZW5zUGlubmluZ0Rpc3RhbmNlKXtoaWRlTGVucz0hMH0KbGVuc1Bvc1g9bWF4TGVuc1Bvc1h9CmlmKGxlbnNQb3NZPD1taW5MZW5zUG9zWSl7aWYobWluTGVuc1Bvc1ktbGVuc1Bvc1k+PXRoaXMuc2V0dGluZ3MubGVuc1Bpbm5pbmdEaXN0YW5jZSl7aGlkZUxlbnM9ITB9CmxlbnNQb3NZPW1pbkxlbnNQb3NZfWVsc2UgaWYobGVuc1Bvc1k+PW1heExlbnNQb3NZKXtpZihsZW5zUG9zWS1tYXhMZW5zUG9zWT49dGhpcy5zZXR0aW5ncy5sZW5zUGlubmluZ0Rpc3RhbmNlKXtoaWRlTGVucz0hMH0KbGVuc1Bvc1k9bWF4TGVuc1Bvc1l9CmlmKCFoaWRlTGVucyl7dGhpcy5zaG93TGVucygpfQplbHNle3RoaXMuaGlkZUxlbnMoKX0KdGhpcy4kbGVucy5vZmZzZXQoe2xlZnQ6bGVuc1Bvc1gsdG9wOmxlbnNQb3NZfSk7dGhpcy5jdXJyZW50TGVuc1Bvc2l0aW9uWD1sZW5zUG9zWDt0aGlzLmN1cnJlbnRMZW5zUG9zaXRpb25ZPWxlbnNQb3NZO3RoaXMuY2FsY3VsYXRlQmFja2dyb3VuZFBvc2l0aW9uKCl9fShqUXVlcnkpKTt2YXIgYWRkclR5cGVzX21hcD1uZXcgQXJyYXkoKTthZGRyVHlwZXNfbWFwLmI9J2JpbGxpbmcnO2FkZHJUeXBlc19tYXAucz0nc2hpcHBpbmcnO3ZhciBhZGRyPW5ldyBPYmplY3QoKTthZGRyLnN0YXRlPScnO2FkZHIuY291bnR5PScnO2FkZHIuY2l0eT0nJzthZGRyLmNvdW50cnk9Jyc7dmFyIGNob3NlQWRkcj0wOyQod2luZG93KS5vbignbG9hZCcsZnVuY3Rpb24oKXskKCIjYWNjb3VudF9kaWFsb2ciKS5kaWFsb2coe2F1dG9PcGVuOiExLHJlc2l6YWJsZTohMCxkcmFnZ2FibGU6ITAsbW9kYWw6ITAsd2lkdGg6MzIwLGhlaWdodDoyMDAsY2xvc2U6ZnVuY3Rpb24oKXskKHRoaXMpLmh0bWwoJycpfX0pfSk7ZnVuY3Rpb24gY2xlYXJfZmllbGRTZXQoKXskKCIuYWRkcmVzcy1maWVsZCwgLmFjY291bnQtZmllbGQiKS52YWwoJycpfQpmdW5jdGlvbiBjbGVhcl9hVHlwZV9maWVsZFNldChhdCl7JCgiIyIrYWRkclR5cGVzX21hcFthdF0rIl9hZGRyZXNzX2Jsb2NrIC5hZGRyZXNzLWZpZWxkLCAjIithZGRyVHlwZXNfbWFwW2F0XSsiX2FkZHJlc3NfYmxvY2sgLmFjY291bnQtZmllbGQiKS52YWwoJycpfQpmdW5jdGlvbiB0b2dnbGVfcmVxKGZsZCl7dmFyIGNmPWFkZHIuY291bnRyeTt2YXIgY3dsPWNvdW50cmllc193aXRoX3N0YXRlczt2YXIgZmxkSXNSZXE9c3RhdGVfZmxkSXNSZXE7aWYoZmxkLmlkPT0nY291bnR5Jyl7ZmxkSXNSZXE9Y291bnR5X2ZsZElzUmVxO2N3bD1jb3VudHJpZXNfd2l0aF9jb3VudGllc30KaWYoZmxkSXNSZXE9PSJ0cnVlIiYmY3dsLmluZGV4T2YoY2YpPi0xKXskKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygnaW52YWxpZCBhbGVydCcpOyQoIiNmbGRTZXRfIitmbGQuaWQrIiBsYWJlbC5hY2N0LWxibCBpLnJlcXVpcmVkLWluZGljYXRvciIpLnNob3coKTskKCIjZmxkU2V0XyIrZmxkLmlkKyIgOmlucHV0LCAjZmxkU2V0XyIrZmxkLmlkKyIgc2VsZWN0IikuYWRkQ2xhc3MoInJlcS1mbGQiKS5hdHRyKCJhcmlhLXJlcXVpcmVkIiwhMCk7aWYoZmxkLmlkPT0ic3RhdGUiKXt0b2dnbGVfb3RoZXJTdGF0ZSgnJyk7JCgiI3N0YXRlX290aGVyIikuYXR0cigicGxhY2Vob2xkZXIiLHBsYWNlaG9sZGVyX3N0YXRlT3RoZXIpOyQoIiNzdGF0ZV9vdGhlcl9mbGQiKS5jc3MoIm1hcmdpbi10b3AiLCI0cHgiKTskKCIjc3RhdGUiKS5zaG93KCl9fWVsc2V7JCgiI2ZsZFNldF8iK2ZsZC5pZCkucmVtb3ZlQ2xhc3MoJ2ludmFsaWQgYWxlcnQnKTskKCIjZmxkU2V0XyIrZmxkLmlkKyIgbGFiZWwuYWNjdC1sYmwgaS5yZXF1aXJlZC1pbmRpY2F0b3IiKS5oaWRlKCk7JCgiI2ZsZFNldF8iK2ZsZC5pZCsiIDppbnB1dCwgI2ZsZFNldF8iK2ZsZC5pZCsiIHNlbGVjdCIpLnJlbW92ZUNsYXNzKCJyZXEtZmxkIikuYXR0cigiYXJpYS1yZXF1aXJlZCIsITEpO2lmKGZsZC5pZD09InN0YXRlIil7aWYoY3dsLmluZGV4T2YoY2YpPDApe3RvZ2dsZV9vdGhlclN0YXRlKCdvdGhlcicpOyQoIiNzdGF0ZSIpLmhpZGUoKTskKCIjc3RhdGVfb3RoZXIiKS5hdHRyKCJwbGFjZWhvbGRlciIsJycpOyQoIiNzdGF0ZV9vdGhlcl9mbGQiKS5jc3MoIm1hcmdpbi10b3AiLCIwIil9ZWxzZXt0b2dnbGVfb3RoZXJTdGF0ZSgnJyk7JCgiI3N0YXRlX290aGVyIikuYXR0cigicGxhY2Vob2xkZXIiLHBsYWNlaG9sZGVyX3N0YXRlT3RoZXIpOyQoIiNzdGF0ZV9vdGhlcl9mbGQiKS5jc3MoIm1hcmdpbi10b3AiLCI0cHgiKTskKCIjc3RhdGUiKS5zaG93KCl9fX19CnZhciBvcmlnQ291bnRyeT0nJzt2YXIgb3JpZ1N0YXRlPScnO2Z1bmN0aW9uIHNlbGVjdENvdW50cnkoY09iail7dmFyIHNmTmFtZT1jT2JqLmlkO3ZhciBzT2JqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0ZScpO2FkZHIuY291bnRyeT1jT2JqLnZhbHVlO2FkZHIuc3RhdGU9c09iai52YWx1ZTt2YXIgb1N0YXRlPSQoIiNzdGF0ZV9vdGhlciIpLnZhbCgpO2lmKG9TdGF0ZSE9InVuZGVmaW5lZCIpe2FkZHIuc3RhdGVfb3RoZXI9b1N0YXRlfQokLnBvc3QoYWNjb3VudF9hamF4X2ZpbGUse3NlbEdldDoiZ2V0U3RhdGUiLGZBY3Rpb246Zm9ybUFjdGlvbixzZWxDb3VudHJ5OmFkZHIuY291bnRyeSxzZWxTdGF0ZTphZGRyLnN0YXRlLG90aGVyU3RhdGU6YWRkci5zdGF0ZV9vdGhlcixmbGROYW1lOnNmTmFtZSxyZXFGaWxlOnJlcXVlc3RpbmdGaWxlfSxmdW5jdGlvbihkYXRhKXt2YWxpZGF0ZV9mbGRWYWwoY09iaik7JChzT2JqKS5odG1sKGRhdGEuZmllbGQpO3ZhciBzVmFsPXNPYmoudmFsdWU7dmFyIHNNaW5MZW49JChzT2JqKS5hdHRyKCdkYXRhLW1pbi1sZW5ndGgnKTt2YXIgc29WYWw9JCgiI3N0YXRlX290aGVyIikudmFsKCk7YWRkci5zdGF0ZT1zVmFsO2lmKHNWYWwhPW51bGwmJnNWYWwubGVuZ3RoPjAmJnNWYWwhPSdvdGhlcicpe2lmKG9yaWdTdGF0ZS5sZW5ndGg8MSl7b3JpZ1N0YXRlPXNWYWx9CnNlbGVjdFN0YXRlKCl9CnZhciBmbGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRlJyk7aWYoZmxkIT1udWxsJiZmbGQhPSJ1bmRlZmluZWQiJiZmbGQudmFsdWUhPSJ1bmRlZmluZWQiKXt0b2dnbGVfcmVxKGZsZCl9CnZhciBzUmVxPSQoIiNzdGF0ZSwgI3N0YXRlX290aGVyIikuaGFzQ2xhc3MoJ3JlcS1mbGQnKTtpZihzUmVxPT0hMSl7JCgiI2ZsZFNldF9zdGF0ZSIpLnJlbW92ZUNsYXNzKCJ2YWxpZCBpbnZhbGlkIGFsZXJ0Iil9ZWxzZXtpZigob3JpZ0NvdW50cnk9PWFkZHIuY291bnRyeSYmb3JpZ1N0YXRlIT1hZGRyLnN0YXRlKXx8b3JpZ0NvdW50cnkhPWFkZHIuY291bnRyeXx8YWRkci5zdGF0ZS5sZW5ndGg8MSl7aWYob3JpZ0NvdW50cnk9PWFkZHIuY291bnRyeSl7JChzT2JqKS52YWwob3JpZ1N0YXRlKTthZGRyLnN0YXRlPW9yaWdTdGF0ZX0KaWYoYWRkci5zdGF0ZS5sZW5ndGg+PXNNaW5MZW4pe2lmKG9yaWdDb3VudHJ5IT1hZGRyLmNvdW50cnkpe3ZhbGlkYXRlX2ZsZFZhbChzT2JqKX1lbHNleyQoIiNmbGRTZXRfc3RhdGUiKS5yZW1vdmVDbGFzcygiYWxlcnQgaW52YWxpZCIpLmFkZENsYXNzKCJ2YWxpZCIpfX1lbHNleyQoIiNmbGRTZXRfc3RhdGUiKS5yZW1vdmVDbGFzcygidmFsaWQgaW52YWxpZCIpLmFkZENsYXNzKCJhbGVydCIpfX19CmNoa19vazJzdWJtaXQoKTtmbGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvdW50eScpO2lmKGZsZCE9bnVsbCYmZmxkIT0idW5kZWZpbmVkIiYmZmxkLnZhbHVlIT0idW5kZWZpbmVkIil7dG9nZ2xlX3JlcShmbGQpfX0sImpzb24iKX0KZnVuY3Rpb24gdG9nZ2xlX290aGVyU3RhdGUoc3Mpe2lmKHNzIT0nb3RoZXInKXskKCIjc3RhdGVfb3RoZXIiKS5hdHRyKCduYW1lJywnc3RhdGVfb3RoZXInKS52YWwoJycpOyQoIiNzdGF0ZV9vdGhlcl9mbGQiKS5oaWRlKCk7JCgiI3N0YXRlIikuYXR0cignbmFtZScsJ3N0YXRlJyk7JCgiI3N0YXRlIikucHJvcCgnZGlzYWJsZWQnLCExKTskKCIjZmxkU2V0X3N0YXRlIikuc2hvdygpfWVsc2V7JCgiI3N0YXRlIikuYXR0cignbmFtZScsJ3N0YXRlX290aGVyJyk7JCgiI3N0YXRlX290aGVyX2ZsZCIpLnNob3coKTskKCIjc3RhdGVfb3RoZXIiKS5hdHRyKCduYW1lJywnc3RhdGUnKTskKCIjc3RhdGUiKS5wcm9wKCdkaXNhYmxlZCcsITApOyQoIiNmbGRTZXRfc3RhdGUiKS5oaWRlKCl9fQpmdW5jdGlvbiBzZWxlY3RTdGF0ZSgpe2FkZHIuc3RhdGU9JCgiI3N0YXRlIikudmFsKCk7dmFyIG9TdGF0ZT0kKCIjc3RhdGVfb3RoZXIiKS52YWwoKTtpZihvU3RhdGUhPSJ1bmRlZmluZWQiKXthZGRyLnN0YXRlX290aGVyPW9TdGF0ZX0KdG9nZ2xlX290aGVyU3RhdGUoYWRkci5zdGF0ZSl9CmZ1bmN0aW9uIHRvZ2dsZVBhc3N3b3Jkcygpe2lmKCQoIiNjcmVhdGVfYWNjb3VudCIpLmxlbmd0aD4wKXt2YXIgY2hrZD0kKCIjY3JlYXRlX2FjY291bnQiKS5wcm9wKCdjaGVja2VkJyk7Y3JlYXRlQWNjb3VudD0oY2hrZCE9MSYmZ3Vlc3RfYWxsb3dlZD09J3RydWUnPzA6MSk7aWYoY3JlYXRlQWNjb3VudD09MSl7JCgiI3Bhc3N3b3Jkc19ib3gsICNuZXdzbGV0dGVyX3NpZ251cF9zZXR0aW5nIikuc2hvdygpOyQoIiNhY2NvdW50X3N1Ym1pdDEgLnN1Ym1pdC1idXR0b24tbGFiZWwiKS5odG1sKGNyZWF0ZUFjY291bnRfYnV0dG9uVGV4dCk7JCgiI2FjY291bnRfc3VibWl0MSBzcGFuLmZhIikucmVtb3ZlQ2xhc3MoImZhLXVzZXItc2VjcmV0IikuYWRkQ2xhc3MoImZhLXVzZXItcGx1cyIpOyQoIi5wYXNzd29yZC1mbGQiKS52YWwoJycpOyQoIi5wYXNzd29yZC1mbGQiKS5wcm9wKCdkaXNhYmxlZCcsITEpOyQoIiNndWVzdF9hY2NvdW50IikudmFsKCcwJyl9ZWxzZXskKCIjcGFzc3dvcmRzX2JveCwgI25ld3NsZXR0ZXJfc2lnbnVwX3NldHRpbmciKS5oaWRlKCk7JCgiI2FjY291bnRfc3VibWl0MSAuc3VibWl0LWJ1dHRvbi1sYWJlbCIpLmh0bWwoY3JlYXRlR3Vlc3RfYnV0dG9uVGV4dCk7JCgiI2FjY291bnRfc3VibWl0MSBzcGFuLmZhIikucmVtb3ZlQ2xhc3MoImZhLXVzZXItcGx1cyIpLmFkZENsYXNzKCJmYS11c2VyLXNlY3JldCIpOyQoIi5wYXNzd29yZC1mbGQiKS52YWwoJycpOyQoIi5wYXNzd29yZC1mbGQiKS5wcm9wKCdkaXNhYmxlZCcsITApOyQoIiNndWVzdF9hY2NvdW50IikudmFsKCcxJyl9fX0KZnVuY3Rpb24gdG9nZ2xlX3NBZGRyX2VuYWJsZWQoYXQsY2Epe2lmKGF0PT0ncycpe2lmKGNhPT1hZGRySWRzLmIpeyQoIiNhZGRyZXNzX2VkaXRfZm9ybSA6aW5wdXQiKS5wcm9wKHtyZWFkb25seTohMCxkaXNhYmxlZDohMH0pO3JldHVybiExfWVsc2V7JCgiI2FkZHJlc3NfZWRpdF9mb3JtIDppbnB1dCIpLnByb3Aoe3JlYWRvbmx5OiExLGRpc2FibGVkOiExfSl9fQpyZXR1cm4hMH0KdmFyIGNob3NlQWRkcj0wO2Z1bmN0aW9uIHNob3dBZGRyRWRpdG9yKGF0LGNhKXthVHlwZT1hdDtjaG9zZUFkZHI9Y2E7Y2xvc2VFZGl0b3JzKCk7dmFyIGJhc2VBZGRyT2JqPSIjIithZGRyVHlwZXNfbWFwW2F0XSsiX2FkZHJlc3NfYmxvY2siOyQoYmFzZUFkZHJPYmorIiAuZWRpdC1idXR0b25zIikuaGlkZSgpOyQucG9zdChhY2NvdW50X2FqYXhfZmlsZSx7c2VsR2V0OiJhZGRyRWRpdEZybSIsYWRkcmVzc19pZDpjYSxhVHlwZTphdCxyZXFGaWxlOnJlcXVlc3RpbmdGaWxlfSxmdW5jdGlvbihkYXRhKXskKGJhc2VBZGRyT2JqKyIgLmFjdGlvbi1ibG9jayIpLmh0bWwoZGF0YS5hRnJtKTtvcmlnQ291bnRyeT0kKCIjY291bnRyeSIpLnZhbCgpO3ZhciBzQWRkck9uPXRvZ2dsZV9zQWRkcl9lbmFibGVkKGF0LGNhKTtpZihzQWRkck9uPT0hMCl7aW5pdF92YWxpZGF0aW9uKCl9fSwianNvbiIpfQpmdW5jdGlvbiBjbG9zZUVkaXRvcnMoKXskKCIuYWN0aW9uLWJsb2NrIikuaHRtbCgnJyk7JCgiLmVkaXQtYnV0dG9ucyIpLnNob3coKTtvcmlnQ291bnRyeT0nJztvcmlnU3RhdGU9Jyd9CmZ1bmN0aW9uIGxvYWRBZGRyZXNzKGF0LGFpZCl7YVR5cGU9YXQ7Y2hvc2VBZGRyPSQoIi5hZGRyZXNzLWNob29zZXJzOmNoZWNrZWQiKS52YWwoKTt2YXIgYmFzZUFkZHJPYmo9IiMiK2FkZHJUeXBlc19tYXBbYXRdKyJfYWRkcmVzc19ibG9jayI7JC5wb3N0KGFjY291bnRfYWpheF9maWxlLHtzZWxHZXQ6ImFkZHJFZGl0RnJtIixhVHlwZTphdCxhZGRyZXNzX2lkOmNob3NlQWRkcixyZXFGaWxlOnJlcXVlc3RpbmdGaWxlfSxmdW5jdGlvbihkYXRhKXskKGJhc2VBZGRyT2JqKyIgLmFjdGlvbi1ibG9jayIpLmh0bWwoZGF0YS5hRnJtKTt2YXIgc0FkZHJPbj10b2dnbGVfc0FkZHJfZW5hYmxlZChhdCxjaG9zZUFkZHIpO2lmKHNBZGRyT249PSEwKXtpbml0X3ZhbGlkYXRpb24oKX0KaWYoY2hvc2VBZGRyPT0wKXskKGJhc2VBZGRyT2JqKyIgLmFjdGlvbi1ibG9jayA6dGV4dCIpLnZhbCgnJyk7JCgiI2FjdGlvbiIpLnZhbCgnaW5zZXJ0Jyk7JCgiI2FkZHJlc3NfaWQiKS52YWwoJycpfWVsc2V7JCgiI2FjdGlvbiIpLnZhbCgndXBkYXRlJyk7JCgiI2FkZHJlc3NfaWQiKS52YWwoY2hvc2VBZGRyKTtpZihzQWRkck9uPT0hMCl7dmFsaWRhdGVGb3JtKCl9fQpjaGtfb2syc3VibWl0KCl9LCJqc29uIil9CmZ1bmN0aW9uIHNlbGVjdEFkZHJlc3MoYXQpe2Nob3NlQWRkcj0kKCIuYWRkcmVzcy1jaG9vc2VyczpjaGVja2VkIikudmFsKCk7dmFyIGJhc2VBZGRyT2JqPSIjIithZGRyVHlwZXNfbWFwW2F0XSsiX2FkZHJlc3NfYmxvY2siO2FkZHJJZHNbYXRdPWNob3NlQWRkcjskLnBvc3QoYWNjb3VudF9hamF4X2ZpbGUse3NlbEdldDoiYWRkclZpZXciLGFUeXBlOmF0LGFkZHJlc3NfaWQ6Y2hvc2VBZGRyLHJlcUZpbGU6cmVxdWVzdGluZ0ZpbGV9LGZ1bmN0aW9uKGRhdGEpeyQoIiNlZGl0X2FkZHJlc3NfaWQiKS52YWwoY2hvc2VBZGRyKTskKGJhc2VBZGRyT2JqKyIgLmFjdGlvbi1ibG9jayIpLmh0bWwoJycpOyQoYmFzZUFkZHJPYmorIiAudmlldy1ibG9jayIpLmh0bWwoZGF0YS5sYWJlbCk7JChiYXNlQWRkck9iaisiIC5lZGl0LWJ1dHRvbnMgYS5idG4iKS5hdHRyKCdvbmNsaWNrJywic2hvd0FkZHJFZGl0b3IoJyIrYXQrIicsICciK2Nob3NlQWRkcisiJykiKTskKGJhc2VBZGRyT2JqKyIgLmVkaXQtYnV0dG9ucyIpLnNob3coKTskKCIjIithZGRyVHlwZXNfbWFwW2F0XSsiX2FkZHJlc3NfaWQiKS52YWwoY2hvc2VBZGRyKX0sImpzb24iKTtvcmlnQ291bnRyeT0nJztvcmlnU3RhdGU9Jyd9CmZ1bmN0aW9uIHByb2Nlc3NBZGRyZXNzKGZybSxhdCl7Y2hvc2VBZGRyPSQoIi5hZGRyZXNzLWNob29zZXJzOmNoZWNrZWQiKS52YWwoKTt2YXIgYmFzZUFkZHJPYmo9IiMiK2FkZHJUeXBlc19tYXBbYXRdKyJfYWRkcmVzc19ibG9jayI7dmFyIGF0T3RoZXI9KGF0PT0ncyc/J2InOidzJyk7JC5wb3N0KGFjY291bnRfYWpheF9maWxlLHtzZWxHZXQ6ImFkZHJQcm9jIixhVHlwZTphdCxhZGRyZXNzX2lkOmNob3NlQWRkcixyZXFGaWxlOnJlcXVlc3RpbmdGaWxlLGZEYXRhOiQoIiMiK2ZybSkuc2VyaWFsaXplKCl9LGZ1bmN0aW9uKGRhdGEpe2lmKGRhdGEuYVJlcz09J2Vycm9yJyl7JChiYXNlQWRkck9iaisiIC5hY3Rpb24tYmxvY2siKS5odG1sKGRhdGEuYUZybSk7aW5pdF92YWxpZGF0aW9uKCk7dmFsaWRhdGVGb3JtKCl9ZWxzZXthZGRySWRzW2F0XT1kYXRhLmFJRDtjaG9zZUFkZHI9ZGF0YS5hSUQ7aWYoZGF0YS5hVmlldy5sZW5ndGg+MCl7JChiYXNlQWRkck9iaisiIC52aWV3LWJsb2NrIikuaHRtbChkYXRhLmFWaWV3KTtpZihhZGRySWRzW2F0XT09YWRkcklkc1thdE90aGVyXSl7JCgiIyIrYWRkclR5cGVzX21hcFthdE90aGVyXSsiX2FkZHJlc3NfYmxvY2siKyIgLnZpZXctYmxvY2siKS5odG1sKGRhdGEuYVZpZXcpfX0KJChiYXNlQWRkck9iaisiIC5hY3Rpb24tYmxvY2siKS5odG1sKCcnKTskKGJhc2VBZGRyT2JqKyIgLmVkaXQtYnV0dG9ucyBhLmJ0biIpLmF0dHIoJ29uY2xpY2snLCJzaG93QWRkckVkaXRvcignIithdCsiJywgJyIrY2hvc2VBZGRyKyInKSIpOyQoYmFzZUFkZHJPYmorIiAuZWRpdC1idXR0b25zIikuc2hvdygpOyQoIiMiK2FkZHJUeXBlc19tYXBbYXRdKyJfYWRkcmVzc19pZCIpLnZhbChjaG9zZUFkZHIpfX0sImpzb24iKS5mYWlsKGZ1bmN0aW9uKHhocix0ZXh0U3RhdHVzLGVycm9yKXtjb25zb2xlLmxvZyh4aHIuc3RhdHVzVGV4dCk7Y29uc29sZS5sb2codGV4dFN0YXR1cyl9KTtvcmlnQ291bnRyeT0nJztvcmlnU3RhdGU9Jyc7cmV0dXJuITF9CmZ1bmN0aW9uIGRyYXdfdmFsaWRhdGVFcnJvck1zZyhtc2cpe3JldHVybic8ZGl2IGlkPSJ2YWxpZGF0ZV9lcnJvcl9tc2ciPicrbXNnKyI8L2Rpdj4ifQpmdW5jdGlvbiBjYXB0Y2hhVmFsaWRhdGVkKHJlcyl7Y2FwdGNoYVZhbGlkPSEwO2Noa19vazJzdWJtaXQoKX0KZnVuY3Rpb24gY2FwdGNoYUV4cGlyZWQocmVzKXtjYXB0Y2hhVmFsaWQ9ITE7Y2hrX29rMnN1Ym1pdCgpfQpmdW5jdGlvbiB2YWxpZGF0ZUVtYWlsKGZsZCl7dmFyIGVtYWlsUGF0dGVybj0vXihbYS16MC05XSkoKFstYS16MC05Ll9dKSooW2EtejAtOV0pKSpcQChbYS16MC05XSkoKFthLXowLTktXSkqKFthLXowLTldKSkrKFwuKFthLXowLTldKShbLWEtejAtOV8tXSk/KFthLXowLTldKSspKyQvaTt2YXIgbWluTGVuPSQoZmxkKS5hdHRyKCdkYXRhLW1pbi1sZW5ndGgnKTt2TXNnPScnO2lmKGZsZC52YWx1ZS5sZW5ndGg+bWluTGVuJiZmbGQudmFsdWUubWF0Y2goZW1haWxQYXR0ZXJuKSE9bnVsbCl7JC5wb3N0KGFjY291bnRfYWpheF9maWxlLHthY3Rpb246J2Noa19lbWFpbF9leGlzdHMnLGNoa19lbWFpbDpmbGQudmFsdWV9LGZ1bmN0aW9uKGRhdGEpe2lmKGRhdGEucmVzdWx0IT0nb2snKXskKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygndmFsaWQnKS5hZGRDbGFzcygnaW52YWxpZCcpOyQoIiNhY2NvdW50X2RpYWxvZyIpLmh0bWwoZHJhd192YWxpZGF0ZUVycm9yTXNnKGRhdGEubXNnKSkuZGlhbG9nKCJvcGVuIil9ZWxzZXskKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygnaW52YWxpZCcpLmFkZENsYXNzKCd2YWxpZCcpfX0sImpzb24iKX1lbHNle3ZhciB2TXNnPWVycm9yTXNnX2ludmFsaWRfZW1haWw7aWYoZmxkLnZhbHVlLmxlbmd0aDxtaW5MZW4pe3ZNc2c9Ik11c3QgQmUgIittaW5MZW4rIiBvciBNb3JlIENoYXJhY3RlcnMifQokKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygndmFsaWQnKS5hZGRDbGFzcygnaW52YWxpZCcpOyQoIiNhY2NvdW50X2RpYWxvZyIpLmh0bWwoZHJhd192YWxpZGF0ZUVycm9yTXNnKHZNc2cpKS5kaWFsb2coIm9wZW4iKX19CmZ1bmN0aW9uIHZhbGlkYXRlX2ZsZFZhbChmbGQpe3ZhciBmUmVxPSQoZmxkKS5oYXNDbGFzcygncmVxLWZsZCcpO3ZhciBtaW5MZW49JChmbGQpLmF0dHIoJ2RhdGEtbWluLWxlbmd0aCcpO3ZhciB2TXNnPScnO2lmKGZSZXE9PSEwKXtpZihmbGQuaWQ9PSdwYXNzd29yZF9jb25maXJtJyl7dmFyIHBhc3N3ZD0kKCIjcGFzc3dvcmQiKS52YWwoKTtpZihmbGQudmFsdWUhPXBhc3N3ZCl7JCgiI2ZsZFNldF8iK2ZsZC5pZCkucmVtb3ZlQ2xhc3MoJ3ZhbGlkJykuYWRkQ2xhc3MoJ2ludmFsaWQnKTskKCIjYWNjb3VudF9kaWFsb2ciKS5odG1sKGRyYXdfdmFsaWRhdGVFcnJvck1zZyhlcnJvck1zZ19wYXNzd29yZF9taXNtYXRjaCkpLmRpYWxvZygib3BlbiIpfWVsc2V7JCgiI2ZsZFNldF8iK2ZsZC5pZCkucmVtb3ZlQ2xhc3MoJ2ludmFsaWQnKS5hZGRDbGFzcygndmFsaWQnKX19ZWxzZSBpZihmbGQuaWQ9PSdlbWFpbF9hZGRyZXNzJyl7dmFsaWRhdGVFbWFpbChmbGQpfWVsc2UgaWYoZmxkLmlkPT0nc3RhdGUnfHxmbGQuaWQ9PSdzdGF0ZV9vdGhlcicpe2lmKGZsZC5pZD09J3N0YXRlJyl7aWYoZmxkLnZhbHVlPT0nb3RoZXInKXt2YXIgX290aGVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGF0ZV9vdGhlciIpO2lmKF9vdGhlci52YWx1ZS5sZW5ndGg8bWluTGVuKXskKCIjZmxkU2V0X3N0YXRlIikucmVtb3ZlQ2xhc3MoJ3ZhbGlkIGFsZXJ0JykuYWRkQ2xhc3MoJ2FsZXJ0Jyl9ZWxzZXskKCIjZmxkU2V0X3N0YXRlIikucmVtb3ZlQ2xhc3MoJ2ludmFsaWQgYWxlcnQnKS5hZGRDbGFzcygndmFsaWQnKX19ZWxzZXtpZihmbGQudmFsdWUubGVuZ3RoPG1pbkxlbil7JCgiI2ZsZFNldF9zdGF0ZSIpLnJlbW92ZUNsYXNzKCd2YWxpZCBhbGVydCcpLmFkZENsYXNzKCdpbnZhbGlkJyk7dk1zZz0iU3RhdGUgSXMgUmVxdWlyZWQifWVsc2V7JCgiI2ZsZFNldF9zdGF0ZSIpLnJlbW92ZUNsYXNzKCdpbnZhbGlkIGFsZXJ0JykuYWRkQ2xhc3MoJ3ZhbGlkJyl9fX1lbHNle2lmKGZsZC52YWx1ZS5sZW5ndGg8bWluTGVuKXskKCIjZmxkU2V0X3N0YXRlIikucmVtb3ZlQ2xhc3MoJ3ZhbGlkIGFsZXJ0JykuYWRkQ2xhc3MoJ2ludmFsaWQnKTt2TXNnPSJNdXN0IEJlICIrbWluTGVuKyIgb3IgTW9yZSBDaGFyYWN0ZXJzIn1lbHNleyQoIiNmbGRTZXRfc3RhdGUiKS5yZW1vdmVDbGFzcygnaW52YWxpZCBhbGVydCcpLmFkZENsYXNzKCd2YWxpZCcpfX0KaWYodk1zZy5sZW5ndGg+MCl7JCgiI2FjY291bnRfZGlhbG9nIikuaHRtbChkcmF3X3ZhbGlkYXRlRXJyb3JNc2codk1zZykpLmRpYWxvZygib3BlbiIpfX1lbHNle2lmKGZsZC52YWx1ZS5sZW5ndGg8bWluTGVuKXskKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygndmFsaWQgYWxlcnQnKS5hZGRDbGFzcygnaW52YWxpZCcpO3ZNc2c9Ik11c3QgQmUgIittaW5MZW4rIiBvciBNb3JlIENoYXJhY3RlcnMiO2lmKGZsZC5pZD09J2NvdW50cnknKXt2TXNnPSJDb3VudHJ5IElzIFJlcXVpcmVkIn0KJCgiI2FjY291bnRfZGlhbG9nIikuaHRtbChkcmF3X3ZhbGlkYXRlRXJyb3JNc2codk1zZykpLmRpYWxvZygib3BlbiIpfWVsc2V7JCgiI2ZsZFNldF8iK2ZsZC5pZCkucmVtb3ZlQ2xhc3MoJ2ludmFsaWQgYWxlcnQnKS5hZGRDbGFzcygndmFsaWQnKX19fX0KZnVuY3Rpb24gY2hrX29rMnN1Ym1pdCgpe3ZhciBvMnM9InRydWUiO3ZhciBmVmFsaWQ9ITE7dmFyIGZJbnZhbGlkPSExO3ZhciBmbGQ9Jyc7dmFyIGZSZXE9ITE7dmFyIGZEaXNhYmxlZD0hMTskKCIuYWRkcmVzcy1maWVsZC1zZXQsIC5hY2NvdW50LWZpZWxkLXNldCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgY3VyRmxkPSQoIiMiK3RoaXMuaWQrIiA6aW5wdXQiKTtmRGlzYWJsZWQ9JChjdXJGbGQpLnByb3AoJ2Rpc2FibGVkJyk7ZlJlcT0kKGN1ckZsZCkuaGFzQ2xhc3MoJ3JlcS1mbGQnKTtmVmFsaWQ9JCh0aGlzKS5oYXNDbGFzcygndmFsaWQnKTtmSW52YWxpZD0kKHRoaXMpLmhhc0NsYXNzKCdpbnZhbGlkIGFsZXJ0Jyk7aWYoZkRpc2FibGVkPT0hMSYmKGZJbnZhbGlkPT0hMHx8KGZSZXE9PSEwJiZmVmFsaWQ9PSExKSkpe28ycz0iZmFsc2UifX0pO2lmKGNhcHRjaGFWYWxpZCE9ITApe28ycz0iZmFsc2UifQppZihvMnM9PSJmYWxzZSIpe31lbHNleyQoIi5zdWJtaXQtYnV0dG9ucyIpLnNob3coKX0KcmV0dXJuIG8yc30KZnVuY3Rpb24gdmFsaWRhdGVGb3JtKCl7JCgiLmFkZHJlc3MtZmllbGQtc2V0IDppbnB1dCwgLmFjY291bnQtZmllbGQtc2V0IDppbnB1dCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZktleT10aGlzLmlkLnJlcGxhY2UoJ2ZsZFNldF8nLCcnKTt2YXIgZk9iaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChmS2V5KTt2YWxpZGF0ZV9mbGRWYWwoZk9iail9KTtyZXR1cm4gY2hrX29rMnN1Ym1pdCgpfQpmdW5jdGlvbiBpbml0X3ZhbGlkYXRpb24oKXtpZigkKCcjY291bnRyeV9pZCcpLmxlbmd0aD4wKXskKCIuYWRkcmVzcy1maWVsZC1zZXQgOmlucHV0LCAuYWNjb3VudC1maWVsZC1zZXQgOmlucHV0Iikub24oImJsdXIgY2hhbmdlIixmdW5jdGlvbigpe3ZhciBmS2V5PXRoaXMuaWQucmVwbGFjZSgnZmxkU2V0XycsJycpO3ZhciBmT2JqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZLZXkpO3ZhbGlkYXRlX2ZsZFZhbChmT2JqKTtjaGtfb2syc3VibWl0KCl9KTthZGRyLmNvdW50cnk9JCgiI2NvdW50cnlfaWQiKS52YWwoKTtzZWxlY3RDb3VudHJ5KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb3VudHJ5X2lkJykpfX07aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBqUXVlcnkpdGhyb3cgbmV3IEVycm9yKCJCb290c3RyYXAncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGpRdWVyeSIpOytmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dC5mbi5qcXVlcnkuc3BsaXQoIiAiKVswXS5zcGxpdCgiLiIpO2lmKGVbMF08MiYmZVsxXTw5fHwxPT1lWzBdJiY5PT1lWzFdJiZlWzJdPDF8fGVbMF0+Myl0aHJvdyBuZXcgRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5IHZlcnNpb24gMS45LjEgb3IgaGlnaGVyLCBidXQgbG93ZXIgdGhhbiB2ZXJzaW9uIDQiKX0oalF1ZXJ5KSwrZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGUoZSxvKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49dCh0aGlzKSxzPW4uZGF0YSgiYnMubW9kYWwiKSxyPXQuZXh0ZW5kKHt9LGkuREVGQVVMVFMsbi5kYXRhKCksIm9iamVjdCI9PXR5cGVvZiBlJiZlKTtzfHxuLmRhdGEoImJzLm1vZGFsIixzPW5ldyBpKHRoaXMscikpLCJzdHJpbmciPT10eXBlb2YgZT9zW2VdKG8pOnIuc2hvdyYmcy5zaG93KG8pfSl9dmFyIGk9ZnVuY3Rpb24oZSxpKXt0aGlzLm9wdGlvbnM9aSx0aGlzLiRib2R5PXQoZG9jdW1lbnQuYm9keSksdGhpcy4kZWxlbWVudD10KGUpLHRoaXMuJGRpYWxvZz10aGlzLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1kaWFsb2ciKSx0aGlzLiRiYWNrZHJvcD1udWxsLHRoaXMuaXNTaG93bj1udWxsLHRoaXMub3JpZ2luYWxCb2R5UGFkPW51bGwsdGhpcy5zY3JvbGxiYXJXaWR0aD0wLHRoaXMuaWdub3JlQmFja2Ryb3BDbGljaz0hMSx0aGlzLmZpeGVkQ29udGVudD0iLm5hdmJhci1maXhlZC10b3AsIC5uYXZiYXItZml4ZWQtYm90dG9tIix0aGlzLm9wdGlvbnMucmVtb3RlJiZ0aGlzLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1jb250ZW50IikubG9hZCh0aGlzLm9wdGlvbnMucmVtb3RlLHQucHJveHkoZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50LnRyaWdnZXIoImxvYWRlZC5icy5tb2RhbCIpfSx0aGlzKSl9O2kuVkVSU0lPTj0iMy40LjEiLGkuVFJBTlNJVElPTl9EVVJBVElPTj0zMDAsaS5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxpLkRFRkFVTFRTPXtiYWNrZHJvcDohMCxrZXlib2FyZDohMCxzaG93OiEwfSxpLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNTaG93bj90aGlzLmhpZGUoKTp0aGlzLnNob3codCl9LGkucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oZSl7dmFyIG89dGhpcyxuPXQuRXZlbnQoInNob3cuYnMubW9kYWwiLHtyZWxhdGVkVGFyZ2V0OmV9KTt0aGlzLiRlbGVtZW50LnRyaWdnZXIobiksdGhpcy5pc1Nob3dufHxuLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwodGhpcy5pc1Nob3duPSEwLHRoaXMuY2hlY2tTY3JvbGxiYXIoKSx0aGlzLnNldFNjcm9sbGJhcigpLHRoaXMuJGJvZHkuYWRkQ2xhc3MoIm1vZGFsLW9wZW4iKSx0aGlzLmVzY2FwZSgpLHRoaXMucmVzaXplKCksdGhpcy4kZWxlbWVudC5vbigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIsJ1tkYXRhLWRpc21pc3M9Im1vZGFsIl0nLHQucHJveHkodGhpcy5oaWRlLHRoaXMpKSx0aGlzLiRkaWFsb2cub24oIm1vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsIixmdW5jdGlvbigpe28uJGVsZW1lbnQub25lKCJtb3VzZXVwLmRpc21pc3MuYnMubW9kYWwiLGZ1bmN0aW9uKGUpe3QoZS50YXJnZXQpLmlzKG8uJGVsZW1lbnQpJiYoby5pZ25vcmVCYWNrZHJvcENsaWNrPSEwKX0pfSksdGhpcy5iYWNrZHJvcChmdW5jdGlvbigpe3ZhciBuPXQuc3VwcG9ydC50cmFuc2l0aW9uJiZvLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIik7by4kZWxlbWVudC5wYXJlbnQoKS5sZW5ndGh8fG8uJGVsZW1lbnQuYXBwZW5kVG8oby4kYm9keSksby4kZWxlbWVudC5zaG93KCkuc2Nyb2xsVG9wKDApLG8uYWRqdXN0RGlhbG9nKCksbiYmby4kZWxlbWVudFswXS5vZmZzZXRXaWR0aCxvLiRlbGVtZW50LmFkZENsYXNzKCJpbiIpLG8uZW5mb3JjZUZvY3VzKCk7dmFyIHM9dC5FdmVudCgic2hvd24uYnMubW9kYWwiLHtyZWxhdGVkVGFyZ2V0OmV9KTtuP28uJGRpYWxvZy5vbmUoImJzVHJhbnNpdGlvbkVuZCIsZnVuY3Rpb24oKXtvLiRlbGVtZW50LnRyaWdnZXIoImZvY3VzIikudHJpZ2dlcihzKX0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGkuVFJBTlNJVElPTl9EVVJBVElPTik6by4kZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIpLnRyaWdnZXIocyl9KSl9LGkucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oZSl7ZSYmZS5wcmV2ZW50RGVmYXVsdCgpLGU9dC5FdmVudCgiaGlkZS5icy5tb2RhbCIpLHRoaXMuJGVsZW1lbnQudHJpZ2dlcihlKSx0aGlzLmlzU2hvd24mJiFlLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYodGhpcy5pc1Nob3duPSExLHRoaXMuZXNjYXBlKCksdGhpcy5yZXNpemUoKSx0KGRvY3VtZW50KS5vZmYoImZvY3VzaW4uYnMubW9kYWwiKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJpbiIpLm9mZigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIpLm9mZigibW91c2V1cC5kaXNtaXNzLmJzLm1vZGFsIiksdGhpcy4kZGlhbG9nLm9mZigibW91c2Vkb3duLmRpc21pc3MuYnMubW9kYWwiKSx0LnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kZWxlbWVudC5oYXNDbGFzcygiZmFkZSIpP3RoaXMuJGVsZW1lbnQub25lKCJic1RyYW5zaXRpb25FbmQiLHQucHJveHkodGhpcy5oaWRlTW9kYWwsdGhpcykpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGkuVFJBTlNJVElPTl9EVVJBVElPTik6dGhpcy5oaWRlTW9kYWwoKSl9LGkucHJvdG90eXBlLmVuZm9yY2VGb2N1cz1mdW5jdGlvbigpe3QoZG9jdW1lbnQpLm9mZigiZm9jdXNpbi5icy5tb2RhbCIpLm9uKCJmb2N1c2luLmJzLm1vZGFsIix0LnByb3h5KGZ1bmN0aW9uKHQpe2RvY3VtZW50PT09dC50YXJnZXR8fHRoaXMuJGVsZW1lbnRbMF09PT10LnRhcmdldHx8dGhpcy4kZWxlbWVudC5oYXModC50YXJnZXQpLmxlbmd0aHx8dGhpcy4kZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIpfSx0aGlzKSl9LGkucHJvdG90eXBlLmVzY2FwZT1mdW5jdGlvbigpe3RoaXMuaXNTaG93biYmdGhpcy5vcHRpb25zLmtleWJvYXJkP3RoaXMuJGVsZW1lbnQub24oImtleWRvd24uZGlzbWlzcy5icy5tb2RhbCIsdC5wcm94eShmdW5jdGlvbih0KXsyNz09dC53aGljaCYmdGhpcy5oaWRlKCl9LHRoaXMpKTp0aGlzLmlzU2hvd258fHRoaXMuJGVsZW1lbnQub2ZmKCJrZXlkb3duLmRpc21pc3MuYnMubW9kYWwiKX0saS5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKCl7dGhpcy5pc1Nob3duP3Qod2luZG93KS5vbigicmVzaXplLmJzLm1vZGFsIix0LnByb3h5KHRoaXMuaGFuZGxlVXBkYXRlLHRoaXMpKTp0KHdpbmRvdykub2ZmKCJyZXNpemUuYnMubW9kYWwiKX0saS5wcm90b3R5cGUuaGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLiRlbGVtZW50LmhpZGUoKSx0aGlzLmJhY2tkcm9wKGZ1bmN0aW9uKCl7dC4kYm9keS5yZW1vdmVDbGFzcygibW9kYWwtb3BlbiIpLHQucmVzZXRBZGp1c3RtZW50cygpLHQucmVzZXRTY3JvbGxiYXIoKSx0LiRlbGVtZW50LnRyaWdnZXIoImhpZGRlbi5icy5tb2RhbCIpfSl9LGkucHJvdG90eXBlLnJlbW92ZUJhY2tkcm9wPWZ1bmN0aW9uKCl7dGhpcy4kYmFja2Ryb3AmJnRoaXMuJGJhY2tkcm9wLnJlbW92ZSgpLHRoaXMuJGJhY2tkcm9wPW51bGx9LGkucHJvdG90eXBlLmJhY2tkcm9wPWZ1bmN0aW9uKGUpe3ZhciBvPXRoaXMsbj10aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIik/ImZhZGUiOiIiO2lmKHRoaXMuaXNTaG93biYmdGhpcy5vcHRpb25zLmJhY2tkcm9wKXt2YXIgcz10LnN1cHBvcnQudHJhbnNpdGlvbiYmbjtpZih0aGlzLiRiYWNrZHJvcD10KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5hZGRDbGFzcygibW9kYWwtYmFja2Ryb3AgIituKS5hcHBlbmRUbyh0aGlzLiRib2R5KSx0aGlzLiRlbGVtZW50Lm9uKCJjbGljay5kaXNtaXNzLmJzLm1vZGFsIix0LnByb3h5KGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2s/dm9pZCh0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2s9ITEpOnZvaWQodC50YXJnZXQ9PT10LmN1cnJlbnRUYXJnZXQmJigic3RhdGljIj09dGhpcy5vcHRpb25zLmJhY2tkcm9wP3RoaXMuJGVsZW1lbnRbMF0uZm9jdXMoKTp0aGlzLmhpZGUoKSkpfSx0aGlzKSkscyYmdGhpcy4kYmFja2Ryb3BbMF0ub2Zmc2V0V2lkdGgsdGhpcy4kYmFja2Ryb3AuYWRkQ2xhc3MoImluIiksIWUpcmV0dXJuO3M/dGhpcy4kYmFja2Ryb3Aub25lKCJic1RyYW5zaXRpb25FbmQiLGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGkuQkFDS0RST1BfVFJBTlNJVElPTl9EVVJBVElPTik6ZSgpfWVsc2UgaWYoIXRoaXMuaXNTaG93biYmdGhpcy4kYmFja2Ryb3Ape3RoaXMuJGJhY2tkcm9wLnJlbW92ZUNsYXNzKCJpbiIpO3ZhciByPWZ1bmN0aW9uKCl7by5yZW1vdmVCYWNrZHJvcCgpLGUmJmUoKX07dC5zdXBwb3J0LnRyYW5zaXRpb24mJnRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImZhZGUiKT90aGlzLiRiYWNrZHJvcC5vbmUoImJzVHJhbnNpdGlvbkVuZCIscikuZW11bGF0ZVRyYW5zaXRpb25FbmQoaS5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OKTpyKCl9ZWxzZSBlJiZlKCl9LGkucHJvdG90eXBlLmhhbmRsZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuYWRqdXN0RGlhbG9nKCl9LGkucHJvdG90eXBlLmFkanVzdERpYWxvZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuJGVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0PmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7dGhpcy4kZWxlbWVudC5jc3Moe3BhZGRpbmdMZWZ0OiF0aGlzLmJvZHlJc092ZXJmbG93aW5nJiZ0P3RoaXMuc2Nyb2xsYmFyV2lkdGg6IiIscGFkZGluZ1JpZ2h0OnRoaXMuYm9keUlzT3ZlcmZsb3dpbmcmJiF0P3RoaXMuc2Nyb2xsYmFyV2lkdGg6IiJ9KX0saS5wcm90b3R5cGUucmVzZXRBZGp1c3RtZW50cz1mdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQuY3NzKHtwYWRkaW5nTGVmdDoiIixwYWRkaW5nUmlnaHQ6IiJ9KX0saS5wcm90b3R5cGUuY2hlY2tTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgdD13aW5kb3cuaW5uZXJXaWR0aDtpZighdCl7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3Q9ZS5yaWdodC1NYXRoLmFicyhlLmxlZnQpfXRoaXMuYm9keUlzT3ZlcmZsb3dpbmc9ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDx0LHRoaXMuc2Nyb2xsYmFyV2lkdGg9dGhpcy5tZWFzdXJlU2Nyb2xsYmFyKCl9LGkucHJvdG90eXBlLnNldFNjcm9sbGJhcj1mdW5jdGlvbigpe3ZhciBlPXBhcnNlSW50KHRoaXMuJGJvZHkuY3NzKCJwYWRkaW5nLXJpZ2h0Iil8fDAsMTApO3RoaXMub3JpZ2luYWxCb2R5UGFkPWRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0fHwiIjt2YXIgaT10aGlzLnNjcm9sbGJhcldpZHRoO3RoaXMuYm9keUlzT3ZlcmZsb3dpbmcmJih0aGlzLiRib2R5LmNzcygicGFkZGluZy1yaWdodCIsZStpKSx0KHRoaXMuZml4ZWRDb250ZW50KS5lYWNoKGZ1bmN0aW9uKGUsbyl7dmFyIG49by5zdHlsZS5wYWRkaW5nUmlnaHQscz10KG8pLmNzcygicGFkZGluZy1yaWdodCIpO3QobykuZGF0YSgicGFkZGluZy1yaWdodCIsbikuY3NzKCJwYWRkaW5nLXJpZ2h0IixwYXJzZUZsb2F0KHMpK2krInB4Iil9KSl9LGkucHJvdG90eXBlLnJlc2V0U2Nyb2xsYmFyPWZ1bmN0aW9uKCl7dGhpcy4kYm9keS5jc3MoInBhZGRpbmctcmlnaHQiLHRoaXMub3JpZ2luYWxCb2R5UGFkKSx0KHRoaXMuZml4ZWRDb250ZW50KS5lYWNoKGZ1bmN0aW9uKGUsaSl7dmFyIG89dChpKS5kYXRhKCJwYWRkaW5nLXJpZ2h0Iik7dChpKS5yZW1vdmVEYXRhKCJwYWRkaW5nLXJpZ2h0IiksaS5zdHlsZS5wYWRkaW5nUmlnaHQ9bz9vOiIifSl9LGkucHJvdG90eXBlLm1lYXN1cmVTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT0ibW9kYWwtc2Nyb2xsYmFyLW1lYXN1cmUiLHRoaXMuJGJvZHkuYXBwZW5kKHQpO3ZhciBlPXQub2Zmc2V0V2lkdGgtdC5jbGllbnRXaWR0aDtyZXR1cm4gdGhpcy4kYm9keVswXS5yZW1vdmVDaGlsZCh0KSxlfTt2YXIgbz10LmZuLm1vZGFsO3QuZm4ubW9kYWw9ZSx0LmZuLm1vZGFsLkNvbnN0cnVjdG9yPWksdC5mbi5tb2RhbC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHQuZm4ubW9kYWw9byx0aGlzfSx0KGRvY3VtZW50KS5vbigiY2xpY2suYnMubW9kYWwuZGF0YS1hcGkiLCdbZGF0YS10b2dnbGU9Im1vZGFsIl0nLGZ1bmN0aW9uKGkpe3ZhciBvPXQodGhpcyksbj1vLmF0dHIoImhyZWYiKSxzPW8uYXR0cigiZGF0YS10YXJnZXQiKXx8biYmbi5yZXBsYWNlKC8uKig/PSNbXlxzXSskKS8sIiIpLHI9dChkb2N1bWVudCkuZmluZChzKSxhPXIuZGF0YSgiYnMubW9kYWwiKT8idG9nZ2xlIjp0LmV4dGVuZCh7cmVtb3RlOiEvIy8udGVzdChuKSYmbn0sci5kYXRhKCksby5kYXRhKCkpO28uaXMoImEiKSYmaS5wcmV2ZW50RGVmYXVsdCgpLHIub25lKCJzaG93LmJzLm1vZGFsIixmdW5jdGlvbih0KXt0LmlzRGVmYXVsdFByZXZlbnRlZCgpfHxyLm9uZSgiaGlkZGVuLmJzLm1vZGFsIixmdW5jdGlvbigpe28uaXMoIjp2aXNpYmxlIikmJm8udHJpZ2dlcigiZm9jdXMiKX0pfSksZS5jYWxsKHIsYSx0aGlzKX0pfShqUXVlcnkpLCtmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLGkpe3ZhciBvPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigtMSE9PXQuaW5BcnJheShvLGkpKXJldHVybi0xIT09dC5pbkFycmF5KG8scyk/Qm9vbGVhbihlLm5vZGVWYWx1ZS5tYXRjaChsKXx8ZS5ub2RlVmFsdWUubWF0Y2goaCkpOiEwO2Zvcih2YXIgbj10KGkpLmZpbHRlcihmdW5jdGlvbih0LGUpe3JldHVybiBlIGluc3RhbmNlb2YgUmVnRXhwfSkscj0wLGE9bi5sZW5ndGg7YT5yO3IrKylpZihvLm1hdGNoKG5bcl0pKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGkoaSxvLG4pe2lmKDA9PT1pLmxlbmd0aClyZXR1cm4gaTtpZihuJiYiZnVuY3Rpb24iPT10eXBlb2YgbilyZXR1cm4gbihpKTtpZighZG9jdW1lbnQuaW1wbGVtZW50YXRpb258fCFkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQpcmV0dXJuIGk7dmFyIHM9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJzYW5pdGl6YXRpb24iKTtzLmJvZHkuaW5uZXJIVE1MPWk7Zm9yKHZhciByPXQubWFwKG8sZnVuY3Rpb24odCxlKXtyZXR1cm4gZX0pLGE9dChzLmJvZHkpLmZpbmQoIioiKSxsPTAsaD1hLmxlbmd0aDtoPmw7bCsrKXt2YXIgcD1hW2xdLGQ9cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKC0xIT09dC5pbkFycmF5KGQscikpZm9yKHZhciBjPXQubWFwKHAuYXR0cmlidXRlcyxmdW5jdGlvbih0KXtyZXR1cm4gdH0pLGY9W10uY29uY2F0KG9bIioiXXx8W10sb1tkXXx8W10pLHU9MCxtPWMubGVuZ3RoO20+dTt1KyspZShjW3VdLGYpfHxwLnJlbW92ZUF0dHJpYnV0ZShjW3VdLm5vZGVOYW1lKTtlbHNlIHAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwKX1yZXR1cm4gcy5ib2R5LmlubmVySFRNTH1mdW5jdGlvbiBvKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT10KHRoaXMpLG89aS5kYXRhKCJicy50b29sdGlwIiksbj0ib2JqZWN0Ij09dHlwZW9mIGUmJmU7IW8mJi9kZXN0cm95fGhpZGUvLnRlc3QoZSl8fChvfHxpLmRhdGEoImJzLnRvb2x0aXAiLG89bmV3IHAodGhpcyxuKSksInN0cmluZyI9PXR5cGVvZiBlJiZvW2VdKCkpfSl9dmFyIG49WyJzYW5pdGl6ZSIsIndoaXRlTGlzdCIsInNhbml0aXplRm4iXSxzPVsiYmFja2dyb3VuZCIsImNpdGUiLCJocmVmIiwiaXRlbXR5cGUiLCJsb25nZGVzYyIsInBvc3RlciIsInNyYyIsInhsaW5rOmhyZWYiXSxyPS9eYXJpYS1bXHctXSokL2ksYT17IioiOlsiY2xhc3MiLCJkaXIiLCJpZCIsImxhbmciLCJyb2xlIixyXSxhOlsidGFyZ2V0IiwiaHJlZiIsInRpdGxlIiwicmVsIl0sYXJlYTpbXSxiOltdLGJyOltdLGNvbDpbXSxjb2RlOltdLGRpdjpbXSxlbTpbXSxocjpbXSxoMTpbXSxoMjpbXSxoMzpbXSxoNDpbXSxoNTpbXSxoNjpbXSxpOltdLGltZzpbInNyYyIsImFsdCIsInRpdGxlIiwid2lkdGgiLCJoZWlnaHQiXSxsaTpbXSxvbDpbXSxwOltdLHByZTpbXSxzOltdLHNtYWxsOltdLHNwYW46W10sc3ViOltdLHN1cDpbXSxzdHJvbmc6W10sdTpbXSx1bDpbXX0sbD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwfHRlbHxmaWxlKTp8W14mOi8/I10qKD86Wy8/I118JCkpL2dpLGg9L15kYXRhOig/OmltYWdlXC8oPzpibXB8Z2lmfGpwZWd8anBnfHBuZ3x0aWZmfHdlYnApfHZpZGVvXC8oPzptcGVnfG1wNHxvZ2d8d2VibSl8YXVkaW9cLyg/Om1wM3xvZ2F8b2dnfG9wdXMpKTtiYXNlNjQsW2EtejAtOSsvXSs9KiQvaSxwPWZ1bmN0aW9uKHQsZSl7dGhpcy50eXBlPW51bGwsdGhpcy5vcHRpb25zPW51bGwsdGhpcy5lbmFibGVkPW51bGwsdGhpcy50aW1lb3V0PW51bGwsdGhpcy5ob3ZlclN0YXRlPW51bGwsdGhpcy4kZWxlbWVudD1udWxsLHRoaXMuaW5TdGF0ZT1udWxsLHRoaXMuaW5pdCgidG9vbHRpcCIsdCxlKX07cC5WRVJTSU9OPSIzLjQuMSIscC5UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxwLkRFRkFVTFRTPXthbmltYXRpb246ITAscGxhY2VtZW50OiJ0b3AiLHNlbGVjdG9yOiExLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJ0b29sdGlwIiByb2xlPSJ0b29sdGlwIj48ZGl2IGNsYXNzPSJ0b29sdGlwLWFycm93Ij48L2Rpdj48ZGl2IGNsYXNzPSJ0b29sdGlwLWlubmVyIj48L2Rpdj48L2Rpdj4nLHRyaWdnZXI6ImhvdmVyIGZvY3VzIix0aXRsZToiIixkZWxheTowLGh0bWw6ITEsY29udGFpbmVyOiExLHZpZXdwb3J0OntzZWxlY3RvcjoiYm9keSIscGFkZGluZzowfSxzYW5pdGl6ZTohMCxzYW5pdGl6ZUZuOm51bGwsd2hpdGVMaXN0OmF9LHAucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oZSxpLG8pe2lmKHRoaXMuZW5hYmxlZD0hMCx0aGlzLnR5cGU9ZSx0aGlzLiRlbGVtZW50PXQoaSksdGhpcy5vcHRpb25zPXRoaXMuZ2V0T3B0aW9ucyhvKSx0aGlzLiR2aWV3cG9ydD10aGlzLm9wdGlvbnMudmlld3BvcnQmJnQoZG9jdW1lbnQpLmZpbmQodC5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy52aWV3cG9ydCk/dGhpcy5vcHRpb25zLnZpZXdwb3J0LmNhbGwodGhpcyx0aGlzLiRlbGVtZW50KTp0aGlzLm9wdGlvbnMudmlld3BvcnQuc2VsZWN0b3J8fHRoaXMub3B0aW9ucy52aWV3cG9ydCksdGhpcy5pblN0YXRlPXtjbGljazohMSxob3ZlcjohMSxmb2N1czohMX0sdGhpcy4kZWxlbWVudFswXWluc3RhbmNlb2YgZG9jdW1lbnQuY29uc3RydWN0b3ImJiF0aGlzLm9wdGlvbnMuc2VsZWN0b3IpdGhyb3cgbmV3IEVycm9yKCJgc2VsZWN0b3JgIG9wdGlvbiBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIGluaXRpYWxpemluZyAiK3RoaXMudHlwZSsiIG9uIHRoZSB3aW5kb3cuZG9jdW1lbnQgb2JqZWN0ISIpO2Zvcih2YXIgbj10aGlzLm9wdGlvbnMudHJpZ2dlci5zcGxpdCgiICIpLHM9bi5sZW5ndGg7cy0tOyl7dmFyIHI9bltzXTtpZigiY2xpY2siPT1yKXRoaXMuJGVsZW1lbnQub24oImNsaWNrLiIrdGhpcy50eXBlLHRoaXMub3B0aW9ucy5zZWxlY3Rvcix0LnByb3h5KHRoaXMudG9nZ2xlLHRoaXMpKTtlbHNlIGlmKCJtYW51YWwiIT1yKXt2YXIgYT0iaG92ZXIiPT1yPyJtb3VzZWVudGVyIjoiZm9jdXNpbiIsbD0iaG92ZXIiPT1yPyJtb3VzZWxlYXZlIjoiZm9jdXNvdXQiO3RoaXMuJGVsZW1lbnQub24oYSsiLiIrdGhpcy50eXBlLHRoaXMub3B0aW9ucy5zZWxlY3Rvcix0LnByb3h5KHRoaXMuZW50ZXIsdGhpcykpLHRoaXMuJGVsZW1lbnQub24obCsiLiIrdGhpcy50eXBlLHRoaXMub3B0aW9ucy5zZWxlY3Rvcix0LnByb3h5KHRoaXMubGVhdmUsdGhpcykpfX10aGlzLm9wdGlvbnMuc2VsZWN0b3I/dGhpcy5fb3B0aW9ucz10LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMse3RyaWdnZXI6Im1hbnVhbCIsc2VsZWN0b3I6IiJ9KTp0aGlzLmZpeFRpdGxlKCl9LHAucHJvdG90eXBlLmdldERlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHAuREVGQVVMVFN9LHAucHJvdG90eXBlLmdldE9wdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIG89dGhpcy4kZWxlbWVudC5kYXRhKCk7Zm9yKHZhciBzIGluIG8pby5oYXNPd25Qcm9wZXJ0eShzKSYmLTEhPT10LmluQXJyYXkocyxuKSYmZGVsZXRlIG9bc107cmV0dXJuIGU9dC5leHRlbmQoe30sdGhpcy5nZXREZWZhdWx0cygpLG8sZSksZS5kZWxheSYmIm51bWJlciI9PXR5cGVvZiBlLmRlbGF5JiYoZS5kZWxheT17c2hvdzplLmRlbGF5LGhpZGU6ZS5kZWxheX0pLGUuc2FuaXRpemUmJihlLnRlbXBsYXRlPWkoZS50ZW1wbGF0ZSxlLndoaXRlTGlzdCxlLnNhbml0aXplRm4pKSxlfSxwLnByb3RvdHlwZS5nZXREZWxlZ2F0ZU9wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgZT17fSxpPXRoaXMuZ2V0RGVmYXVsdHMoKTtyZXR1cm4gdGhpcy5fb3B0aW9ucyYmdC5lYWNoKHRoaXMuX29wdGlvbnMsZnVuY3Rpb24odCxvKXtpW3RdIT1vJiYoZVt0XT1vKX0pLGV9LHAucHJvdG90eXBlLmVudGVyPWZ1bmN0aW9uKGUpe3ZhciBpPWUgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2U6dChlLmN1cnJlbnRUYXJnZXQpLmRhdGEoImJzLiIrdGhpcy50eXBlKTtyZXR1cm4gaXx8KGk9bmV3IHRoaXMuY29uc3RydWN0b3IoZS5jdXJyZW50VGFyZ2V0LHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpLHQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSxpKSksZSBpbnN0YW5jZW9mIHQuRXZlbnQmJihpLmluU3RhdGVbImZvY3VzaW4iPT1lLnR5cGU/ImZvY3VzIjoiaG92ZXIiXT0hMCksaS50aXAoKS5oYXNDbGFzcygiaW4iKXx8ImluIj09aS5ob3ZlclN0YXRlP3ZvaWQoaS5ob3ZlclN0YXRlPSJpbiIpOihjbGVhclRpbWVvdXQoaS50aW1lb3V0KSxpLmhvdmVyU3RhdGU9ImluIixpLm9wdGlvbnMuZGVsYXkmJmkub3B0aW9ucy5kZWxheS5zaG93P3ZvaWQoaS50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXsiaW4iPT1pLmhvdmVyU3RhdGUmJmkuc2hvdygpfSxpLm9wdGlvbnMuZGVsYXkuc2hvdykpOmkuc2hvdygpKX0scC5wcm90b3R5cGUuaXNJblN0YXRlVHJ1ZT1mdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLmluU3RhdGUpaWYodGhpcy5pblN0YXRlW3RdKXJldHVybiEwO3JldHVybiExfSxwLnByb3RvdHlwZS5sZWF2ZT1mdW5jdGlvbihlKXt2YXIgaT1lIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9lOnQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSk7cmV0dXJuIGl8fChpPW5ldyB0aGlzLmNvbnN0cnVjdG9yKGUuY3VycmVudFRhcmdldCx0aGlzLmdldERlbGVnYXRlT3B0aW9ucygpKSx0KGUuY3VycmVudFRhcmdldCkuZGF0YSgiYnMuIit0aGlzLnR5cGUsaSkpLGUgaW5zdGFuY2VvZiB0LkV2ZW50JiYoaS5pblN0YXRlWyJmb2N1c291dCI9PWUudHlwZT8iZm9jdXMiOiJob3ZlciJdPSExKSxpLmlzSW5TdGF0ZVRydWUoKT92b2lkIDA6KGNsZWFyVGltZW91dChpLnRpbWVvdXQpLGkuaG92ZXJTdGF0ZT0ib3V0IixpLm9wdGlvbnMuZGVsYXkmJmkub3B0aW9ucy5kZWxheS5oaWRlP3ZvaWQoaS50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXsib3V0Ij09aS5ob3ZlclN0YXRlJiZpLmhpZGUoKX0saS5vcHRpb25zLmRlbGF5LmhpZGUpKTppLmhpZGUoKSl9LHAucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt2YXIgZT10LkV2ZW50KCJzaG93LmJzLiIrdGhpcy50eXBlKTtpZih0aGlzLmhhc0NvbnRlbnQoKSYmdGhpcy5lbmFibGVkKXt0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSk7dmFyIGk9dC5jb250YWlucyh0aGlzLiRlbGVtZW50WzBdLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHRoaXMuJGVsZW1lbnRbMF0pO2lmKGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fCFpKXJldHVybjt2YXIgbz10aGlzLG49dGhpcy50aXAoKSxzPXRoaXMuZ2V0VUlEKHRoaXMudHlwZSk7dGhpcy5zZXRDb250ZW50KCksbi5hdHRyKCJpZCIscyksdGhpcy4kZWxlbWVudC5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5IixzKSx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uJiZuLmFkZENsYXNzKCJmYWRlIik7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMub3B0aW9ucy5wbGFjZW1lbnQ/dGhpcy5vcHRpb25zLnBsYWNlbWVudC5jYWxsKHRoaXMsblswXSx0aGlzLiRlbGVtZW50WzBdKTp0aGlzLm9wdGlvbnMucGxhY2VtZW50LGE9L1xzP2F1dG8/XHM/L2ksbD1hLnRlc3Qocik7bCYmKHI9ci5yZXBsYWNlKGEsIiIpfHwidG9wIiksbi5kZXRhY2goKS5jc3Moe3RvcDowLGxlZnQ6MCxkaXNwbGF5OiJibG9jayJ9KS5hZGRDbGFzcyhyKS5kYXRhKCJicy4iK3RoaXMudHlwZSx0aGlzKSx0aGlzLm9wdGlvbnMuY29udGFpbmVyP24uYXBwZW5kVG8odChkb2N1bWVudCkuZmluZCh0aGlzLm9wdGlvbnMuY29udGFpbmVyKSk6bi5pbnNlcnRBZnRlcih0aGlzLiRlbGVtZW50KSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoImluc2VydGVkLmJzLiIrdGhpcy50eXBlKTt2YXIgaD10aGlzLmdldFBvc2l0aW9uKCksZD1uWzBdLm9mZnNldFdpZHRoLGM9blswXS5vZmZzZXRIZWlnaHQ7aWYobCl7dmFyIGY9cix1PXRoaXMuZ2V0UG9zaXRpb24odGhpcy4kdmlld3BvcnQpO3I9ImJvdHRvbSI9PXImJmguYm90dG9tK2M+dS5ib3R0b20/InRvcCI6InRvcCI9PXImJmgudG9wLWM8dS50b3A/ImJvdHRvbSI6InJpZ2h0Ij09ciYmaC5yaWdodCtkPnUud2lkdGg/ImxlZnQiOiJsZWZ0Ij09ciYmaC5sZWZ0LWQ8dS5sZWZ0PyJyaWdodCI6cixuLnJlbW92ZUNsYXNzKGYpLmFkZENsYXNzKHIpfXZhciBtPXRoaXMuZ2V0Q2FsY3VsYXRlZE9mZnNldChyLGgsZCxjKTt0aGlzLmFwcGx5UGxhY2VtZW50KG0scik7dmFyIGc9ZnVuY3Rpb24oKXt2YXIgdD1vLmhvdmVyU3RhdGU7by4kZWxlbWVudC50cmlnZ2VyKCJzaG93bi5icy4iK28udHlwZSksby5ob3ZlclN0YXRlPW51bGwsIm91dCI9PXQmJm8ubGVhdmUobyl9O3Quc3VwcG9ydC50cmFuc2l0aW9uJiZ0aGlzLiR0aXAuaGFzQ2xhc3MoImZhZGUiKT9uLm9uZSgiYnNUcmFuc2l0aW9uRW5kIixnKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChwLlRSQU5TSVRJT05fRFVSQVRJT04pOmcoKX19LHAucHJvdG90eXBlLmFwcGx5UGxhY2VtZW50PWZ1bmN0aW9uKGUsaSl7dmFyIG89dGhpcy50aXAoKSxuPW9bMF0ub2Zmc2V0V2lkdGgscz1vWzBdLm9mZnNldEhlaWdodCxyPXBhcnNlSW50KG8uY3NzKCJtYXJnaW4tdG9wIiksMTApLGE9cGFyc2VJbnQoby5jc3MoIm1hcmdpbi1sZWZ0IiksMTApO2lzTmFOKHIpJiYocj0wKSxpc05hTihhKSYmKGE9MCksZS50b3ArPXIsZS5sZWZ0Kz1hLHQub2Zmc2V0LnNldE9mZnNldChvWzBdLHQuZXh0ZW5kKHt1c2luZzpmdW5jdGlvbih0KXtvLmNzcyh7dG9wOk1hdGgucm91bmQodC50b3ApLGxlZnQ6TWF0aC5yb3VuZCh0LmxlZnQpfSl9fSxlKSwwKSxvLmFkZENsYXNzKCJpbiIpO3ZhciBsPW9bMF0ub2Zmc2V0V2lkdGgsaD1vWzBdLm9mZnNldEhlaWdodDsidG9wIj09aSYmaCE9cyYmKGUudG9wPWUudG9wK3MtaCk7dmFyIHA9dGhpcy5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGEoaSxlLGwsaCk7cC5sZWZ0P2UubGVmdCs9cC5sZWZ0OmUudG9wKz1wLnRvcDt2YXIgZD0vdG9wfGJvdHRvbS8udGVzdChpKSxjPWQ/MipwLmxlZnQtbitsOjIqcC50b3AtcytoLGY9ZD8ib2Zmc2V0V2lkdGgiOiJvZmZzZXRIZWlnaHQiO28ub2Zmc2V0KGUpLHRoaXMucmVwbGFjZUFycm93KGMsb1swXVtmXSxkKX0scC5wcm90b3R5cGUucmVwbGFjZUFycm93PWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmFycm93KCkuY3NzKGk/ImxlZnQiOiJ0b3AiLDUwKigxLXQvZSkrIiUiKS5jc3MoaT8idG9wIjoibGVmdCIsIiIpfSxwLnByb3RvdHlwZS5zZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50aXAoKSxlPXRoaXMuZ2V0VGl0bGUoKTt0aGlzLm9wdGlvbnMuaHRtbD8odGhpcy5vcHRpb25zLnNhbml0aXplJiYoZT1pKGUsdGhpcy5vcHRpb25zLndoaXRlTGlzdCx0aGlzLm9wdGlvbnMuc2FuaXRpemVGbikpLHQuZmluZCgiLnRvb2x0aXAtaW5uZXIiKS5odG1sKGUpKTp0LmZpbmQoIi50b29sdGlwLWlubmVyIikudGV4dChlKSx0LnJlbW92ZUNsYXNzKCJmYWRlIGluIHRvcCBib3R0b20gbGVmdCByaWdodCIpfSxwLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGkoKXsiaW4iIT1vLmhvdmVyU3RhdGUmJm4uZGV0YWNoKCksby4kZWxlbWVudCYmby4kZWxlbWVudC5yZW1vdmVBdHRyKCJhcmlhLWRlc2NyaWJlZGJ5IikudHJpZ2dlcigiaGlkZGVuLmJzLiIrby50eXBlKSxlJiZlKCl9dmFyIG89dGhpcyxuPXQodGhpcy4kdGlwKSxzPXQuRXZlbnQoImhpZGUuYnMuIit0aGlzLnR5cGUpO3JldHVybiB0aGlzLiRlbGVtZW50LnRyaWdnZXIocykscy5pc0RlZmF1bHRQcmV2ZW50ZWQoKT92b2lkIDA6KG4ucmVtb3ZlQ2xhc3MoImluIiksdC5zdXBwb3J0LnRyYW5zaXRpb24mJm4uaGFzQ2xhc3MoImZhZGUiKT9uLm9uZSgiYnNUcmFuc2l0aW9uRW5kIixpKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChwLlRSQU5TSVRJT05fRFVSQVRJT04pOmkoKSx0aGlzLmhvdmVyU3RhdGU9bnVsbCx0aGlzKX0scC5wcm90b3R5cGUuZml4VGl0bGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLiRlbGVtZW50Oyh0LmF0dHIoInRpdGxlIil8fCJzdHJpbmciIT10eXBlb2YgdC5hdHRyKCJkYXRhLW9yaWdpbmFsLXRpdGxlIikpJiZ0LmF0dHIoImRhdGEtb3JpZ2luYWwtdGl0bGUiLHQuYXR0cigidGl0bGUiKXx8IiIpLmF0dHIoInRpdGxlIiwiIil9LHAucHJvdG90eXBlLmhhc0NvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUaXRsZSgpfSxwLnByb3RvdHlwZS5nZXRQb3NpdGlvbj1mdW5jdGlvbihlKXtlPWV8fHRoaXMuJGVsZW1lbnQ7dmFyIGk9ZVswXSxvPSJCT0RZIj09aS50YWdOYW1lLG49aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtudWxsPT1uLndpZHRoJiYobj10LmV4dGVuZCh7fSxuLHt3aWR0aDpuLnJpZ2h0LW4ubGVmdCxoZWlnaHQ6bi5ib3R0b20tbi50b3B9KSk7dmFyIHM9d2luZG93LlNWR0VsZW1lbnQmJmkgaW5zdGFuY2VvZiB3aW5kb3cuU1ZHRWxlbWVudCxyPW8/e3RvcDowLGxlZnQ6MH06cz9udWxsOmUub2Zmc2V0KCksYT17c2Nyb2xsOm8/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A6ZS5zY3JvbGxUb3AoKX0sbD1vP3t3aWR0aDp0KHdpbmRvdykud2lkdGgoKSxoZWlnaHQ6dCh3aW5kb3cpLmhlaWdodCgpfTpudWxsO3JldHVybiB0LmV4dGVuZCh7fSxuLGEsbCxyKX0scC5wcm90b3R5cGUuZ2V0Q2FsY3VsYXRlZE9mZnNldD1mdW5jdGlvbih0LGUsaSxvKXtyZXR1cm4iYm90dG9tIj09dD97dG9wOmUudG9wK2UuaGVpZ2h0LGxlZnQ6ZS5sZWZ0K2Uud2lkdGgvMi1pLzJ9OiJ0b3AiPT10P3t0b3A6ZS50b3AtbyxsZWZ0OmUubGVmdCtlLndpZHRoLzItaS8yfToibGVmdCI9PXQ/e3RvcDplLnRvcCtlLmhlaWdodC8yLW8vMixsZWZ0OmUubGVmdC1pfTp7dG9wOmUudG9wK2UuaGVpZ2h0LzItby8yLGxlZnQ6ZS5sZWZ0K2Uud2lkdGh9fSxwLnByb3RvdHlwZS5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGE9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49e3RvcDowLGxlZnQ6MH07aWYoIXRoaXMuJHZpZXdwb3J0KXJldHVybiBuO3ZhciBzPXRoaXMub3B0aW9ucy52aWV3cG9ydCYmdGhpcy5vcHRpb25zLnZpZXdwb3J0LnBhZGRpbmd8fDAscj10aGlzLmdldFBvc2l0aW9uKHRoaXMuJHZpZXdwb3J0KTtpZigvcmlnaHR8bGVmdC8udGVzdCh0KSl7dmFyIGE9ZS50b3Atcy1yLnNjcm9sbCxsPWUudG9wK3Mtci5zY3JvbGwrbzthPHIudG9wP24udG9wPXIudG9wLWE6bD5yLnRvcCtyLmhlaWdodCYmKG4udG9wPXIudG9wK3IuaGVpZ2h0LWwpfWVsc2V7dmFyIGg9ZS5sZWZ0LXMscD1lLmxlZnQrcytpO2g8ci5sZWZ0P24ubGVmdD1yLmxlZnQtaDpwPnIucmlnaHQmJihuLmxlZnQ9ci5sZWZ0K3Iud2lkdGgtcCl9cmV0dXJuIG59LHAucHJvdG90eXBlLmdldFRpdGxlPWZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLiRlbGVtZW50LGk9dGhpcy5vcHRpb25zO3JldHVybiB0PWUuYXR0cigiZGF0YS1vcmlnaW5hbC10aXRsZSIpfHwoImZ1bmN0aW9uIj09dHlwZW9mIGkudGl0bGU/aS50aXRsZS5jYWxsKGVbMF0pOmkudGl0bGUpfSxwLnByb3RvdHlwZS5nZXRVSUQ9ZnVuY3Rpb24odCl7ZG8gdCs9fn4oMWU2Kk1hdGgucmFuZG9tKCkpO3doaWxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQpKTtyZXR1cm4gdH0scC5wcm90b3R5cGUudGlwPWZ1bmN0aW9uKCl7aWYoIXRoaXMuJHRpcCYmKHRoaXMuJHRpcD10KHRoaXMub3B0aW9ucy50ZW1wbGF0ZSksMSE9dGhpcy4kdGlwLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKHRoaXMudHlwZSsiIGB0ZW1wbGF0ZWAgb3B0aW9uIG11c3QgY29uc2lzdCBvZiBleGFjdGx5IDEgdG9wLWxldmVsIGVsZW1lbnQhIik7cmV0dXJuIHRoaXMuJHRpcH0scC5wcm90b3R5cGUuYXJyb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYXJyb3c9dGhpcy4kYXJyb3d8fHRoaXMudGlwKCkuZmluZCgiLnRvb2x0aXAtYXJyb3ciKX0scC5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSEwfSxwLnByb3RvdHlwZS5kaXNhYmxlPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSExfSxwLnByb3RvdHlwZS50b2dnbGVFbmFibGVkPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSF0aGlzLmVuYWJsZWR9LHAucHJvdG90eXBlLnRvZ2dsZT1mdW5jdGlvbihlKXt2YXIgaT10aGlzO2UmJihpPXQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSksaXx8KGk9bmV3IHRoaXMuY29uc3RydWN0b3IoZS5jdXJyZW50VGFyZ2V0LHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpLHQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSxpKSkpLGU/KGkuaW5TdGF0ZS5jbGljaz0haS5pblN0YXRlLmNsaWNrLGkuaXNJblN0YXRlVHJ1ZSgpP2kuZW50ZXIoaSk6aS5sZWF2ZShpKSk6aS50aXAoKS5oYXNDbGFzcygiaW4iKT9pLmxlYXZlKGkpOmkuZW50ZXIoaSl9LHAucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2NsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpLHRoaXMuaGlkZShmdW5jdGlvbigpe3QuJGVsZW1lbnQub2ZmKCIuIit0LnR5cGUpLnJlbW92ZURhdGEoImJzLiIrdC50eXBlKSx0LiR0aXAmJnQuJHRpcC5kZXRhY2goKSx0LiR0aXA9bnVsbCx0LiRhcnJvdz1udWxsLHQuJHZpZXdwb3J0PW51bGwsdC4kZWxlbWVudD1udWxsfSl9LHAucHJvdG90eXBlLnNhbml0aXplSHRtbD1mdW5jdGlvbih0KXtyZXR1cm4gaSh0LHRoaXMub3B0aW9ucy53aGl0ZUxpc3QsdGhpcy5vcHRpb25zLnNhbml0aXplRm4pfTt2YXIgZD10LmZuLnRvb2x0aXA7dC5mbi50b29sdGlwPW8sdC5mbi50b29sdGlwLkNvbnN0cnVjdG9yPXAsdC5mbi50b29sdGlwLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdC5mbi50b29sdGlwPWQsdGhpc319KGpRdWVyeSksK2Z1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbz10KHRoaXMpLG49by5kYXRhKCJicy5wb3BvdmVyIikscz0ib2JqZWN0Ij09dHlwZW9mIGUmJmU7IW4mJi9kZXN0cm95fGhpZGUvLnRlc3QoZSl8fChufHxvLmRhdGEoImJzLnBvcG92ZXIiLG49bmV3IGkodGhpcyxzKSksInN0cmluZyI9PXR5cGVvZiBlJiZuW2VdKCkpfSl9dmFyIGk9ZnVuY3Rpb24odCxlKXt0aGlzLmluaXQoInBvcG92ZXIiLHQsZSl9O2lmKCF0LmZuLnRvb2x0aXApdGhyb3cgbmV3IEVycm9yKCJQb3BvdmVyIHJlcXVpcmVzIHRvb2x0aXAuanMiKTtpLlZFUlNJT049IjMuNC4xIixpLkRFRkFVTFRTPXQuZXh0ZW5kKHt9LHQuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvci5ERUZBVUxUUyx7cGxhY2VtZW50OiJyaWdodCIsdHJpZ2dlcjoiY2xpY2siLGNvbnRlbnQ6IiIsdGVtcGxhdGU6JzxkaXYgY2xhc3M9InBvcG92ZXIiIHJvbGU9InRvb2x0aXAiPjxkaXYgY2xhc3M9ImFycm93Ij48L2Rpdj48aDMgY2xhc3M9InBvcG92ZXItdGl0bGUiPjwvaDM+PGRpdiBjbGFzcz0icG9wb3Zlci1jb250ZW50Ij48L2Rpdj48L2Rpdj4nfSksaS5wcm90b3R5cGU9dC5leHRlbmQoe30sdC5mbi50b29sdGlwLkNvbnN0cnVjdG9yLnByb3RvdHlwZSksaS5wcm90b3R5cGUuY29uc3RydWN0b3I9aSxpLnByb3RvdHlwZS5nZXREZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBpLkRFRkFVTFRTfSxpLnByb3RvdHlwZS5zZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50aXAoKSxlPXRoaXMuZ2V0VGl0bGUoKSxpPXRoaXMuZ2V0Q29udGVudCgpO2lmKHRoaXMub3B0aW9ucy5odG1sKXt2YXIgbz10eXBlb2YgaTt0aGlzLm9wdGlvbnMuc2FuaXRpemUmJihlPXRoaXMuc2FuaXRpemVIdG1sKGUpLCJzdHJpbmciPT09byYmKGk9dGhpcy5zYW5pdGl6ZUh0bWwoaSkpKSx0LmZpbmQoIi5wb3BvdmVyLXRpdGxlIikuaHRtbChlKSx0LmZpbmQoIi5wb3BvdmVyLWNvbnRlbnQiKS5jaGlsZHJlbigpLmRldGFjaCgpLmVuZCgpWyJzdHJpbmciPT09bz8iaHRtbCI6ImFwcGVuZCJdKGkpfWVsc2UgdC5maW5kKCIucG9wb3Zlci10aXRsZSIpLnRleHQoZSksdC5maW5kKCIucG9wb3Zlci1jb250ZW50IikuY2hpbGRyZW4oKS5kZXRhY2goKS5lbmQoKS50ZXh0KGkpO3QucmVtb3ZlQ2xhc3MoImZhZGUgdG9wIGJvdHRvbSBsZWZ0IHJpZ2h0IGluIiksdC5maW5kKCIucG9wb3Zlci10aXRsZSIpLmh0bWwoKXx8dC5maW5kKCIucG9wb3Zlci10aXRsZSIpLmhpZGUoKX0saS5wcm90b3R5cGUuaGFzQ29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpdGxlKCl8fHRoaXMuZ2V0Q29udGVudCgpfSxpLnByb3RvdHlwZS5nZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy4kZWxlbWVudCxlPXRoaXMub3B0aW9ucztyZXR1cm4gdC5hdHRyKCJkYXRhLWNvbnRlbnQiKXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnRlbnQ/ZS5jb250ZW50LmNhbGwodFswXSk6ZS5jb250ZW50KX0saS5wcm90b3R5cGUuYXJyb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYXJyb3c9dGhpcy4kYXJyb3d8fHRoaXMudGlwKCkuZmluZCgiLmFycm93Iil9O3ZhciBvPXQuZm4ucG9wb3Zlcjt0LmZuLnBvcG92ZXI9ZSx0LmZuLnBvcG92ZXIuQ29uc3RydWN0b3I9aSx0LmZuLnBvcG92ZXIubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiB0LmZuLnBvcG92ZXI9byx0aGlzfX0oalF1ZXJ5KTsoZnVuY3Rpb24oJCl7JCh3aW5kb3cpLm9uKCJsb2FkIixmdW5jdGlvbigpeyQoZG9jdW1lbnQpLnNjcm9sbHppcEluaXQoKTskKGRvY3VtZW50KS5yb2xsZXJJbml0KCl9KTskKHdpbmRvdykub24oImxvYWQgc2Nyb2xsIHJlc2l6ZSIsZnVuY3Rpb24oKXskKCcubnVtc2Nyb2xsZXInKS5zY3JvbGx6aXAoe3Nob3dGdW5jdGlvbjpmdW5jdGlvbigpe251bWJlclJvbGxlcigkKHRoaXMpLmF0dHIoJ2RhdGEtc2xubycpKX0sd2hvbGVWaXNpYmxlOiExLH0pfSk7JC5mbi5zY3JvbGx6aXBJbml0PWZ1bmN0aW9uKCl7JCgnYm9keScpLnByZXBlbmQoIjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmZpeGVkO3RvcDowcHg7bGVmdDowcHg7d2lkdGg6MDtoZWlnaHQ6MDsnIGlkPSdzY3JvbGx6aXBQb2ludCc+PC9kaXY+Iil9OyQuZm4ucm9sbGVySW5pdD1mdW5jdGlvbigpe3ZhciBpPTA7JCgnLm51bXNjcm9sbGVyJykuZWFjaChmdW5jdGlvbigpe2krKzskKHRoaXMpLmF0dHIoJ2RhdGEtc2xubycsaSk7JCh0aGlzKS5hZGRDbGFzcygicm9sbGVyLXRpdGxlLW51bWJlci0iK2kpfSl9OyQuZm4uc2Nyb2xsemlwPWZ1bmN0aW9uKG9wdGlvbnMpe3ZhciBzZXR0aW5ncz0kLmV4dGVuZCh7c2hvd0Z1bmN0aW9uOm51bGwsaGlkZUZ1bmN0aW9uOm51bGwsc2hvd1NoaWZ0OjAsd2hvbGVWaXNpYmxlOiExLGhpZGVTaGlmdDowLH0sb3B0aW9ucyk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpLG9iail7JCh0aGlzKS5hZGRDbGFzcygnc2Nyb2xsemlwJyk7aWYoJC5pc0Z1bmN0aW9uKHNldHRpbmdzLnNob3dGdW5jdGlvbikpe2lmKCEkKHRoaXMpLmhhc0NsYXNzKCdpc1Nob3duJykmJigkKHdpbmRvdykub3V0ZXJIZWlnaHQoKSskKCcjc2Nyb2xsemlwUG9pbnQnKS5vZmZzZXQoKS50b3Atc2V0dGluZ3Muc2hvd1NoaWZ0KT4oJCh0aGlzKS5vZmZzZXQoKS50b3ArKChzZXR0aW5ncy53aG9sZVZpc2libGUpPyQodGhpcykub3V0ZXJIZWlnaHQoKTowKSkmJigkKCcjc2Nyb2xsemlwUG9pbnQnKS5vZmZzZXQoKS50b3ArKChzZXR0aW5ncy53aG9sZVZpc2libGUpPyQodGhpcykub3V0ZXJIZWlnaHQoKTowKSk8KCQodGhpcykub3V0ZXJIZWlnaHQoKSskKHRoaXMpLm9mZnNldCgpLnRvcC1zZXR0aW5ncy5zaG93U2hpZnQpKXskKHRoaXMpLmFkZENsYXNzKCdpc1Nob3duJyk7c2V0dGluZ3Muc2hvd0Z1bmN0aW9uLmNhbGwodGhpcyl9fQppZigkLmlzRnVuY3Rpb24oc2V0dGluZ3MuaGlkZUZ1bmN0aW9uKSl7aWYoJCh0aGlzKS5oYXNDbGFzcygnaXNTaG93bicpJiYoKCQod2luZG93KS5vdXRlckhlaWdodCgpKyQoJyNzY3JvbGx6aXBQb2ludCcpLm9mZnNldCgpLnRvcC1zZXR0aW5ncy5oaWRlU2hpZnQpPCgkKHRoaXMpLm9mZnNldCgpLnRvcCsoKHNldHRpbmdzLndob2xlVmlzaWJsZSk/JCh0aGlzKS5vdXRlckhlaWdodCgpOjApKXx8KCQoJyNzY3JvbGx6aXBQb2ludCcpLm9mZnNldCgpLnRvcCsoKHNldHRpbmdzLndob2xlVmlzaWJsZSk/JCh0aGlzKS5vdXRlckhlaWdodCgpOjApKT4oJCh0aGlzKS5vdXRlckhlaWdodCgpKyQodGhpcykub2Zmc2V0KCkudG9wLXNldHRpbmdzLmhpZGVTaGlmdCkpKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdpc1Nob3duJyk7c2V0dGluZ3MuaGlkZUZ1bmN0aW9uLmNhbGwodGhpcyl9fQpyZXR1cm4gdGhpc30pfTtmdW5jdGlvbiBudW1iZXJSb2xsZXIoc2xubyl7dmFyIG1pbj0kKCcucm9sbGVyLXRpdGxlLW51bWJlci0nK3Nsbm8pLmF0dHIoJ2RhdGEtbWluJyk7dmFyIG1heD0kKCcucm9sbGVyLXRpdGxlLW51bWJlci0nK3Nsbm8pLmF0dHIoJ2RhdGEtbWF4Jyk7dmFyIHRpbWVkaWZmPSQoJy5yb2xsZXItdGl0bGUtbnVtYmVyLScrc2xubykuYXR0cignZGF0YS1kZWxheScpO3ZhciBpbmNyZW1lbnQ9JCgnLnJvbGxlci10aXRsZS1udW1iZXItJytzbG5vKS5hdHRyKCdkYXRhLWluY3JlbWVudCcpO3ZhciBudW1kaWZmPW1heC1taW47dmFyIHRpbWVvdXQ9KHRpbWVkaWZmKjEwMDApL251bWRpZmY7bnVtYmVyUm9sbChzbG5vLG1pbixtYXgsaW5jcmVtZW50LHRpbWVvdXQpfQpmdW5jdGlvbiBudW1iZXJSb2xsKHNsbm8sbWluLG1heCxpbmNyZW1lbnQsdGltZW91dCl7aWYobWluPD1tYXgpeyQoJy5yb2xsZXItdGl0bGUtbnVtYmVyLScrc2xubykuaHRtbChtaW4pO21pbj1wYXJzZUludChtaW4pK3BhcnNlSW50KGluY3JlbWVudCk7c2V0VGltZW91dChmdW5jdGlvbigpe251bWJlclJvbGwoZXZhbChzbG5vKSxldmFsKG1pbiksZXZhbChtYXgpLGV2YWwoaW5jcmVtZW50KSxldmFsKHRpbWVvdXQpKX0sdGltZW91dCl9ZWxzZXskKCcucm9sbGVyLXRpdGxlLW51bWJlci0nK3Nsbm8pLmh0bWwobWF4KX19fSkoalF1ZXJ5KTshZnVuY3Rpb24oYSxiLGMsZCl7ZnVuY3Rpb24gZShiLGMpe3RoaXMuc2V0dGluZ3M9bnVsbCx0aGlzLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyxjKSx0aGlzLiRlbGVtZW50PWEoYiksdGhpcy5faGFuZGxlcnM9e30sdGhpcy5fcGx1Z2lucz17fSx0aGlzLl9zdXByZXNzPXt9LHRoaXMuX2N1cnJlbnQ9bnVsbCx0aGlzLl9zcGVlZD1udWxsLHRoaXMuX2Nvb3JkaW5hdGVzPVtdLHRoaXMuX2JyZWFrcG9pbnQ9bnVsbCx0aGlzLl93aWR0aD1udWxsLHRoaXMuX2l0ZW1zPVtdLHRoaXMuX2Nsb25lcz1bXSx0aGlzLl9tZXJnZXJzPVtdLHRoaXMuX3dpZHRocz1bXSx0aGlzLl9pbnZhbGlkYXRlZD17fSx0aGlzLl9waXBlPVtdLHRoaXMuX2RyYWc9e3RpbWU6bnVsbCx0YXJnZXQ6bnVsbCxwb2ludGVyOm51bGwsc3RhZ2U6e3N0YXJ0Om51bGwsY3VycmVudDpudWxsfSxkaXJlY3Rpb246bnVsbH0sdGhpcy5fc3RhdGVzPXtjdXJyZW50Ont9LHRhZ3M6e2luaXRpYWxpemluZzpbImJ1c3kiXSxhbmltYXRpbmc6WyJidXN5Il0sZHJhZ2dpbmc6WyJpbnRlcmFjdGluZyJdfX0sYS5lYWNoKFsib25SZXNpemUiLCJvblRocm90dGxlZFJlc2l6ZSJdLGEucHJveHkoZnVuY3Rpb24oYixjKXt0aGlzLl9oYW5kbGVyc1tjXT1hLnByb3h5KHRoaXNbY10sdGhpcyl9LHRoaXMpKSxhLmVhY2goZS5QbHVnaW5zLGEucHJveHkoZnVuY3Rpb24oYSxiKXt0aGlzLl9wbHVnaW5zW2EuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkrYS5zbGljZSgxKV09bmV3IGIodGhpcyl9LHRoaXMpKSxhLmVhY2goZS5Xb3JrZXJzLGEucHJveHkoZnVuY3Rpb24oYixjKXt0aGlzLl9waXBlLnB1c2goe2ZpbHRlcjpjLmZpbHRlcixydW46YS5wcm94eShjLnJ1bix0aGlzKX0pfSx0aGlzKSksdGhpcy5zZXR1cCgpLHRoaXMuaW5pdGlhbGl6ZSgpfWUuRGVmYXVsdHM9e2l0ZW1zOjMsbG9vcDohMSxjZW50ZXI6ITEscmV3aW5kOiExLGNoZWNrVmlzaWJpbGl0eTohMCxtb3VzZURyYWc6ITAsdG91Y2hEcmFnOiEwLHB1bGxEcmFnOiEwLGZyZWVEcmFnOiExLG1hcmdpbjowLHN0YWdlUGFkZGluZzowLG1lcmdlOiExLG1lcmdlRml0OiEwLGF1dG9XaWR0aDohMSxzdGFydFBvc2l0aW9uOjAscnRsOiExLHNtYXJ0U3BlZWQ6MjUwLGZsdWlkU3BlZWQ6ITEsZHJhZ0VuZFNwZWVkOiExLHJlc3BvbnNpdmU6e30scmVzcG9uc2l2ZVJlZnJlc2hSYXRlOjIwMCxyZXNwb25zaXZlQmFzZUVsZW1lbnQ6YixmYWxsYmFja0Vhc2luZzoic3dpbmciLHNsaWRlVHJhbnNpdGlvbjoiIixpbmZvOiExLG5lc3RlZEl0ZW1TZWxlY3RvcjohMSxpdGVtRWxlbWVudDoiZGl2IixzdGFnZUVsZW1lbnQ6ImRpdiIscmVmcmVzaENsYXNzOiJvd2wtcmVmcmVzaCIsbG9hZGVkQ2xhc3M6Im93bC1sb2FkZWQiLGxvYWRpbmdDbGFzczoib3dsLWxvYWRpbmciLHJ0bENsYXNzOiJvd2wtcnRsIixyZXNwb25zaXZlQ2xhc3M6Im93bC1yZXNwb25zaXZlIixkcmFnQ2xhc3M6Im93bC1kcmFnIixpdGVtQ2xhc3M6Im93bC1pdGVtIixzdGFnZUNsYXNzOiJvd2wtc3RhZ2UiLHN0YWdlT3V0ZXJDbGFzczoib3dsLXN0YWdlLW91dGVyIixncmFiQ2xhc3M6Im93bC1ncmFiIn0sZS5XaWR0aD17RGVmYXVsdDoiZGVmYXVsdCIsSW5uZXI6ImlubmVyIixPdXRlcjoib3V0ZXIifSxlLlR5cGU9e0V2ZW50OiJldmVudCIsU3RhdGU6InN0YXRlIn0sZS5QbHVnaW5zPXt9LGUuV29ya2Vycz1be2ZpbHRlcjpbIndpZHRoIiwic2V0dGluZ3MiXSxydW46ZnVuY3Rpb24oKXt0aGlzLl93aWR0aD10aGlzLiRlbGVtZW50LndpZHRoKCl9fSx7ZmlsdGVyOlsid2lkdGgiLCJpdGVtcyIsInNldHRpbmdzIl0scnVuOmZ1bmN0aW9uKGEpe2EuY3VycmVudD10aGlzLl9pdGVtcyYmdGhpcy5faXRlbXNbdGhpcy5yZWxhdGl2ZSh0aGlzLl9jdXJyZW50KV19fSx7ZmlsdGVyOlsiaXRlbXMiLCJzZXR0aW5ncyJdLHJ1bjpmdW5jdGlvbigpe3RoaXMuJHN0YWdlLmNoaWxkcmVuKCIuY2xvbmVkIikucmVtb3ZlKCl9fSx7ZmlsdGVyOlsid2lkdGgiLCJpdGVtcyIsInNldHRpbmdzIl0scnVuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc2V0dGluZ3MubWFyZ2lufHwiIixjPSF0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCxkPXRoaXMuc2V0dGluZ3MucnRsLGU9e3dpZHRoOiJhdXRvIiwibWFyZ2luLWxlZnQiOmQ/YjoiIiwibWFyZ2luLXJpZ2h0IjpkPyIiOmJ9OyFjJiZ0aGlzLiRzdGFnZS5jaGlsZHJlbigpLmNzcyhlKSxhLmNzcz1lfX0se2ZpbHRlcjpbIndpZHRoIiwiaXRlbXMiLCJzZXR0aW5ncyJdLHJ1bjpmdW5jdGlvbihhKXt2YXIgYj0odGhpcy53aWR0aCgpL3RoaXMuc2V0dGluZ3MuaXRlbXMpLnRvRml4ZWQoMyktdGhpcy5zZXR0aW5ncy5tYXJnaW4sYz1udWxsLGQ9dGhpcy5faXRlbXMubGVuZ3RoLGU9IXRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoLGY9W107Zm9yKGEuaXRlbXM9e21lcmdlOiExLHdpZHRoOmJ9O2QtLTspYz10aGlzLl9tZXJnZXJzW2RdLGM9dGhpcy5zZXR0aW5ncy5tZXJnZUZpdCYmTWF0aC5taW4oYyx0aGlzLnNldHRpbmdzLml0ZW1zKXx8YyxhLml0ZW1zLm1lcmdlPWM+MXx8YS5pdGVtcy5tZXJnZSxmW2RdPWU/YipjOnRoaXMuX2l0ZW1zW2RdLndpZHRoKCk7dGhpcy5fd2lkdGhzPWZ9fSx7ZmlsdGVyOlsiaXRlbXMiLCJzZXR0aW5ncyJdLHJ1bjpmdW5jdGlvbigpe3ZhciBiPVtdLGM9dGhpcy5faXRlbXMsZD10aGlzLnNldHRpbmdzLGU9TWF0aC5tYXgoMipkLml0ZW1zLDQpLGY9MipNYXRoLmNlaWwoYy5sZW5ndGgvMiksZz1kLmxvb3AmJmMubGVuZ3RoP2QucmV3aW5kP2U6TWF0aC5tYXgoZSxmKTowLGg9IiIsaT0iIjtmb3IoZy89MjtnPjA7KWIucHVzaCh0aGlzLm5vcm1hbGl6ZShiLmxlbmd0aC8yLCEwKSksaCs9Y1tiW2IubGVuZ3RoLTFdXVswXS5vdXRlckhUTUwsYi5wdXNoKHRoaXMubm9ybWFsaXplKGMubGVuZ3RoLTEtKGIubGVuZ3RoLTEpLzIsITApKSxpPWNbYltiLmxlbmd0aC0xXV1bMF0ub3V0ZXJIVE1MK2ksZy09MTt0aGlzLl9jbG9uZXM9YixhKGgpLmFkZENsYXNzKCJjbG9uZWQiKS5hcHBlbmRUbyh0aGlzLiRzdGFnZSksYShpKS5hZGRDbGFzcygiY2xvbmVkIikucHJlcGVuZFRvKHRoaXMuJHN0YWdlKX19LHtmaWx0ZXI6WyJ3aWR0aCIsIml0ZW1zIiwic2V0dGluZ3MiXSxydW46ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5zZXR0aW5ncy5ydGw/MTotMSxiPXRoaXMuX2Nsb25lcy5sZW5ndGgrdGhpcy5faXRlbXMubGVuZ3RoLGM9LTEsZD0wLGU9MCxmPVtdOysrYzxiOylkPWZbYy0xXXx8MCxlPXRoaXMuX3dpZHRoc1t0aGlzLnJlbGF0aXZlKGMpXSt0aGlzLnNldHRpbmdzLm1hcmdpbixmLnB1c2goZCtlKmEpO3RoaXMuX2Nvb3JkaW5hdGVzPWZ9fSx7ZmlsdGVyOlsid2lkdGgiLCJpdGVtcyIsInNldHRpbmdzIl0scnVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZXR0aW5ncy5zdGFnZVBhZGRpbmcsYj10aGlzLl9jb29yZGluYXRlcyxjPXt3aWR0aDpNYXRoLmNlaWwoTWF0aC5hYnMoYltiLmxlbmd0aC0xXSkpKzIqYSwicGFkZGluZy1sZWZ0IjphfHwiIiwicGFkZGluZy1yaWdodCI6YXx8IiJ9O3RoaXMuJHN0YWdlLmNzcyhjKX19LHtmaWx0ZXI6WyJ3aWR0aCIsIml0ZW1zIiwic2V0dGluZ3MiXSxydW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoLGM9IXRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoLGQ9dGhpcy4kc3RhZ2UuY2hpbGRyZW4oKTtpZihjJiZhLml0ZW1zLm1lcmdlKWZvcig7Yi0tOylhLmNzcy53aWR0aD10aGlzLl93aWR0aHNbdGhpcy5yZWxhdGl2ZShiKV0sZC5lcShiKS5jc3MoYS5jc3MpO2Vsc2UgYyYmKGEuY3NzLndpZHRoPWEuaXRlbXMud2lkdGgsZC5jc3MoYS5jc3MpKX19LHtmaWx0ZXI6WyJpdGVtcyJdLHJ1bjpmdW5jdGlvbigpe3RoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDwxJiZ0aGlzLiRzdGFnZS5yZW1vdmVBdHRyKCJzdHlsZSIpfX0se2ZpbHRlcjpbIndpZHRoIiwiaXRlbXMiLCJzZXR0aW5ncyJdLHJ1bjpmdW5jdGlvbihhKXthLmN1cnJlbnQ9YS5jdXJyZW50P3RoaXMuJHN0YWdlLmNoaWxkcmVuKCkuaW5kZXgoYS5jdXJyZW50KTowLGEuY3VycmVudD1NYXRoLm1heCh0aGlzLm1pbmltdW0oKSxNYXRoLm1pbih0aGlzLm1heGltdW0oKSxhLmN1cnJlbnQpKSx0aGlzLnJlc2V0KGEuY3VycmVudCl9fSx7ZmlsdGVyOlsicG9zaXRpb24iXSxydW46ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGUodGhpcy5jb29yZGluYXRlcyh0aGlzLl9jdXJyZW50KSl9fSx7ZmlsdGVyOlsid2lkdGgiLCJwb3NpdGlvbiIsIml0ZW1zIiwic2V0dGluZ3MiXSxydW46ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlPXRoaXMuc2V0dGluZ3MucnRsPzE6LTEsZj0yKnRoaXMuc2V0dGluZ3Muc3RhZ2VQYWRkaW5nLGc9dGhpcy5jb29yZGluYXRlcyh0aGlzLmN1cnJlbnQoKSkrZixoPWcrdGhpcy53aWR0aCgpKmUsaT1bXTtmb3IoYz0wLGQ9dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoO2M8ZDtjKyspYT10aGlzLl9jb29yZGluYXRlc1tjLTFdfHwwLGI9TWF0aC5hYnModGhpcy5fY29vcmRpbmF0ZXNbY10pK2YqZSwodGhpcy5vcChhLCI8PSIsZykmJnRoaXMub3AoYSwiPiIsaCl8fHRoaXMub3AoYiwiPCIsZykmJnRoaXMub3AoYiwiPiIsaCkpJiZpLnB1c2goYyk7dGhpcy4kc3RhZ2UuY2hpbGRyZW4oIi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIiksdGhpcy4kc3RhZ2UuY2hpbGRyZW4oIjplcSgiK2kuam9pbigiKSwgOmVxKCIpKyIpIikuYWRkQ2xhc3MoImFjdGl2ZSIpLHRoaXMuJHN0YWdlLmNoaWxkcmVuKCIuY2VudGVyIikucmVtb3ZlQ2xhc3MoImNlbnRlciIpLHRoaXMuc2V0dGluZ3MuY2VudGVyJiZ0aGlzLiRzdGFnZS5jaGlsZHJlbigpLmVxKHRoaXMuY3VycmVudCgpKS5hZGRDbGFzcygiY2VudGVyIil9fV0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZVN0YWdlPWZ1bmN0aW9uKCl7dGhpcy4kc3RhZ2U9dGhpcy4kZWxlbWVudC5maW5kKCIuIit0aGlzLnNldHRpbmdzLnN0YWdlQ2xhc3MpLHRoaXMuJHN0YWdlLmxlbmd0aHx8KHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmxvYWRpbmdDbGFzcyksdGhpcy4kc3RhZ2U9YSgiPCIrdGhpcy5zZXR0aW5ncy5zdGFnZUVsZW1lbnQrIj4iLHtjbGFzczp0aGlzLnNldHRpbmdzLnN0YWdlQ2xhc3N9KS53cmFwKGEoIjxkaXYvPiIse2NsYXNzOnRoaXMuc2V0dGluZ3Muc3RhZ2VPdXRlckNsYXNzfSkpLHRoaXMuJGVsZW1lbnQuYXBwZW5kKHRoaXMuJHN0YWdlLnBhcmVudCgpKSl9LGUucHJvdG90eXBlLmluaXRpYWxpemVJdGVtcz1mdW5jdGlvbigpe3ZhciBiPXRoaXMuJGVsZW1lbnQuZmluZCgiLm93bC1pdGVtIik7aWYoYi5sZW5ndGgpcmV0dXJuIHRoaXMuX2l0ZW1zPWIuZ2V0KCkubWFwKGZ1bmN0aW9uKGIpe3JldHVybiBhKGIpfSksdGhpcy5fbWVyZ2Vycz10aGlzLl9pdGVtcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gMX0pLHZvaWQgdGhpcy5yZWZyZXNoKCk7dGhpcy5yZXBsYWNlKHRoaXMuJGVsZW1lbnQuY2hpbGRyZW4oKS5ub3QodGhpcy4kc3RhZ2UucGFyZW50KCkpKSx0aGlzLmlzVmlzaWJsZSgpP3RoaXMucmVmcmVzaCgpOnRoaXMuaW52YWxpZGF0ZSgid2lkdGgiKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3MpLmFkZENsYXNzKHRoaXMub3B0aW9ucy5sb2FkZWRDbGFzcyl9LGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtpZih0aGlzLmVudGVyKCJpbml0aWFsaXppbmciKSx0aGlzLnRyaWdnZXIoImluaXRpYWxpemUiKSx0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKHRoaXMuc2V0dGluZ3MucnRsQ2xhc3MsdGhpcy5zZXR0aW5ncy5ydGwpLHRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoJiYhdGhpcy5pcygicHJlLWxvYWRpbmciKSl7dmFyIGEsYixjO2E9dGhpcy4kZWxlbWVudC5maW5kKCJpbWciKSxiPXRoaXMuc2V0dGluZ3MubmVzdGVkSXRlbVNlbGVjdG9yPyIuIit0aGlzLnNldHRpbmdzLm5lc3RlZEl0ZW1TZWxlY3RvcjpkLGM9dGhpcy4kZWxlbWVudC5jaGlsZHJlbihiKS53aWR0aCgpLGEubGVuZ3RoJiZjPD0wJiZ0aGlzLnByZWxvYWRBdXRvV2lkdGhJbWFnZXMoYSl9dGhpcy5pbml0aWFsaXplU3RhZ2UoKSx0aGlzLmluaXRpYWxpemVJdGVtcygpLHRoaXMucmVnaXN0ZXJFdmVudEhhbmRsZXJzKCksdGhpcy5sZWF2ZSgiaW5pdGlhbGl6aW5nIiksdGhpcy50cmlnZ2VyKCJpbml0aWFsaXplZCIpfSxlLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5zZXR0aW5ncy5jaGVja1Zpc2liaWxpdHl8fHRoaXMuJGVsZW1lbnQuaXMoIjp2aXNpYmxlIil9LGUucHJvdG90eXBlLnNldHVwPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWV3cG9ydCgpLGM9dGhpcy5vcHRpb25zLnJlc3BvbnNpdmUsZD0tMSxlPW51bGw7Yz8oYS5lYWNoKGMsZnVuY3Rpb24oYSl7YTw9YiYmYT5kJiYoZD1OdW1iZXIoYSkpfSksZT1hLmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMsY1tkXSksImZ1bmN0aW9uIj09dHlwZW9mIGUuc3RhZ2VQYWRkaW5nJiYoZS5zdGFnZVBhZGRpbmc9ZS5zdGFnZVBhZGRpbmcoKSksZGVsZXRlIGUucmVzcG9uc2l2ZSxlLnJlc3BvbnNpdmVDbGFzcyYmdGhpcy4kZWxlbWVudC5hdHRyKCJjbGFzcyIsdGhpcy4kZWxlbWVudC5hdHRyKCJjbGFzcyIpLnJlcGxhY2UobmV3IFJlZ0V4cCgiKCIrdGhpcy5vcHRpb25zLnJlc3BvbnNpdmVDbGFzcysiLSlcXFMrXFxzIiwiZyIpLCIkMSIrZCkpKTplPWEuZXh0ZW5kKHt9LHRoaXMub3B0aW9ucyksdGhpcy50cmlnZ2VyKCJjaGFuZ2UiLHtwcm9wZXJ0eTp7bmFtZToic2V0dGluZ3MiLHZhbHVlOmV9fSksdGhpcy5fYnJlYWtwb2ludD1kLHRoaXMuc2V0dGluZ3M9ZSx0aGlzLmludmFsaWRhdGUoInNldHRpbmdzIiksdGhpcy50cmlnZ2VyKCJjaGFuZ2VkIix7cHJvcGVydHk6e25hbWU6InNldHRpbmdzIix2YWx1ZTp0aGlzLnNldHRpbmdzfX0pfSxlLnByb3RvdHlwZS5vcHRpb25zTG9naWM9ZnVuY3Rpb24oKXt0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCYmKHRoaXMuc2V0dGluZ3Muc3RhZ2VQYWRkaW5nPSExLHRoaXMuc2V0dGluZ3MubWVyZ2U9ITEpfSxlLnByb3RvdHlwZS5wcmVwYXJlPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMudHJpZ2dlcigicHJlcGFyZSIse2NvbnRlbnQ6Yn0pO3JldHVybiBjLmRhdGF8fChjLmRhdGE9YSgiPCIrdGhpcy5zZXR0aW5ncy5pdGVtRWxlbWVudCsiLz4iKS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaXRlbUNsYXNzKS5hcHBlbmQoYikpLHRoaXMudHJpZ2dlcigicHJlcGFyZWQiLHtjb250ZW50OmMuZGF0YX0pLGMuZGF0YX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTAsYz10aGlzLl9waXBlLmxlbmd0aCxkPWEucHJveHkoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXNbYV19LHRoaXMuX2ludmFsaWRhdGVkKSxlPXt9O2I8YzspKHRoaXMuX2ludmFsaWRhdGVkLmFsbHx8YS5ncmVwKHRoaXMuX3BpcGVbYl0uZmlsdGVyLGQpLmxlbmd0aD4wKSYmdGhpcy5fcGlwZVtiXS5ydW4oZSksYisrO3RoaXMuX2ludmFsaWRhdGVkPXt9LCF0aGlzLmlzKCJ2YWxpZCIpJiZ0aGlzLmVudGVyKCJ2YWxpZCIpfSxlLnByb3RvdHlwZS53aWR0aD1mdW5jdGlvbihhKXtzd2l0Y2goYT1hfHxlLldpZHRoLkRlZmF1bHQpe2Nhc2UgZS5XaWR0aC5Jbm5lcjpjYXNlIGUuV2lkdGguT3V0ZXI6cmV0dXJuIHRoaXMuX3dpZHRoO2RlZmF1bHQ6cmV0dXJuIHRoaXMuX3dpZHRoLTIqdGhpcy5zZXR0aW5ncy5zdGFnZVBhZGRpbmcrdGhpcy5zZXR0aW5ncy5tYXJnaW59fSxlLnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7dGhpcy5lbnRlcigicmVmcmVzaGluZyIpLHRoaXMudHJpZ2dlcigicmVmcmVzaCIpLHRoaXMuc2V0dXAoKSx0aGlzLm9wdGlvbnNMb2dpYygpLHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLnJlZnJlc2hDbGFzcyksdGhpcy51cGRhdGUoKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5yZWZyZXNoQ2xhc3MpLHRoaXMubGVhdmUoInJlZnJlc2hpbmciKSx0aGlzLnRyaWdnZXIoInJlZnJlc2hlZCIpfSxlLnByb3RvdHlwZS5vblRocm90dGxlZFJlc2l6ZT1mdW5jdGlvbigpe2IuY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZXIpLHRoaXMucmVzaXplVGltZXI9Yi5zZXRUaW1lb3V0KHRoaXMuX2hhbmRsZXJzLm9uUmVzaXplLHRoaXMuc2V0dGluZ3MucmVzcG9uc2l2ZVJlZnJlc2hSYXRlKX0sZS5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX2l0ZW1zLmxlbmd0aCYmKHRoaXMuX3dpZHRoIT09dGhpcy4kZWxlbWVudC53aWR0aCgpJiYoISF0aGlzLmlzVmlzaWJsZSgpJiYodGhpcy5lbnRlcigicmVzaXppbmciKSx0aGlzLnRyaWdnZXIoInJlc2l6ZSIpLmlzRGVmYXVsdFByZXZlbnRlZCgpPyh0aGlzLmxlYXZlKCJyZXNpemluZyIpLCExKToodGhpcy5pbnZhbGlkYXRlKCJ3aWR0aCIpLHRoaXMucmVmcmVzaCgpLHRoaXMubGVhdmUoInJlc2l6aW5nIiksdm9pZCB0aGlzLnRyaWdnZXIoInJlc2l6ZWQiKSkpKSl9LGUucHJvdG90eXBlLnJlZ2lzdGVyRXZlbnRIYW5kbGVycz1mdW5jdGlvbigpe2Euc3VwcG9ydC50cmFuc2l0aW9uJiZ0aGlzLiRzdGFnZS5vbihhLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQrIi5vd2wuY29yZSIsYS5wcm94eSh0aGlzLm9uVHJhbnNpdGlvbkVuZCx0aGlzKSksITEhPT10aGlzLnNldHRpbmdzLnJlc3BvbnNpdmUmJnRoaXMub24oYiwicmVzaXplIix0aGlzLl9oYW5kbGVycy5vblRocm90dGxlZFJlc2l6ZSksdGhpcy5zZXR0aW5ncy5tb3VzZURyYWcmJih0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5kcmFnQ2xhc3MpLHRoaXMuJHN0YWdlLm9uKCJtb3VzZWRvd24ub3dsLmNvcmUiLGEucHJveHkodGhpcy5vbkRyYWdTdGFydCx0aGlzKSksdGhpcy4kc3RhZ2Uub24oImRyYWdzdGFydC5vd2wuY29yZSBzZWxlY3RzdGFydC5vd2wuY29yZSIsZnVuY3Rpb24oKXtyZXR1cm4hMX0pKSx0aGlzLnNldHRpbmdzLnRvdWNoRHJhZyYmKHRoaXMuJHN0YWdlLm9uKCJ0b3VjaHN0YXJ0Lm93bC5jb3JlIixhLnByb3h5KHRoaXMub25EcmFnU3RhcnQsdGhpcykpLHRoaXMuJHN0YWdlLm9uKCJ0b3VjaGNhbmNlbC5vd2wuY29yZSIsYS5wcm94eSh0aGlzLm9uRHJhZ0VuZCx0aGlzKSkpfSxlLnByb3RvdHlwZS5vbkRyYWdTdGFydD1mdW5jdGlvbihiKXt2YXIgZD1udWxsOzMhPT1iLndoaWNoJiYoYS5zdXBwb3J0LnRyYW5zZm9ybT8oZD10aGlzLiRzdGFnZS5jc3MoInRyYW5zZm9ybSIpLnJlcGxhY2UoLy4qXCh8XCl8IC9nLCIiKS5zcGxpdCgiLCIpLGQ9e3g6ZFsxNj09PWQubGVuZ3RoPzEyOjRdLHk6ZFsxNj09PWQubGVuZ3RoPzEzOjVdfSk6KGQ9dGhpcy4kc3RhZ2UucG9zaXRpb24oKSxkPXt4OnRoaXMuc2V0dGluZ3MucnRsP2QubGVmdCt0aGlzLiRzdGFnZS53aWR0aCgpLXRoaXMud2lkdGgoKSt0aGlzLnNldHRpbmdzLm1hcmdpbjpkLmxlZnQseTpkLnRvcH0pLHRoaXMuaXMoImFuaW1hdGluZyIpJiYoYS5zdXBwb3J0LnRyYW5zZm9ybT90aGlzLmFuaW1hdGUoZC54KTp0aGlzLiRzdGFnZS5zdG9wKCksdGhpcy5pbnZhbGlkYXRlKCJwb3NpdGlvbiIpKSx0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKHRoaXMub3B0aW9ucy5ncmFiQ2xhc3MsIm1vdXNlZG93biI9PT1iLnR5cGUpLHRoaXMuc3BlZWQoMCksdGhpcy5fZHJhZy50aW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuX2RyYWcudGFyZ2V0PWEoYi50YXJnZXQpLHRoaXMuX2RyYWcuc3RhZ2Uuc3RhcnQ9ZCx0aGlzLl9kcmFnLnN0YWdlLmN1cnJlbnQ9ZCx0aGlzLl9kcmFnLnBvaW50ZXI9dGhpcy5wb2ludGVyKGIpLGEoYykub24oIm1vdXNldXAub3dsLmNvcmUgdG91Y2hlbmQub3dsLmNvcmUiLGEucHJveHkodGhpcy5vbkRyYWdFbmQsdGhpcykpLGEoYykub25lKCJtb3VzZW1vdmUub3dsLmNvcmUgdG91Y2htb3ZlLm93bC5jb3JlIixhLnByb3h5KGZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuZGlmZmVyZW5jZSh0aGlzLl9kcmFnLnBvaW50ZXIsdGhpcy5wb2ludGVyKGIpKTthKGMpLm9uKCJtb3VzZW1vdmUub3dsLmNvcmUgdG91Y2htb3ZlLm93bC5jb3JlIixhLnByb3h5KHRoaXMub25EcmFnTW92ZSx0aGlzKSksTWF0aC5hYnMoZC54KTxNYXRoLmFicyhkLnkpJiZ0aGlzLmlzKCJ2YWxpZCIpfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuZW50ZXIoImRyYWdnaW5nIiksdGhpcy50cmlnZ2VyKCJkcmFnIikpfSx0aGlzKSkpfSxlLnByb3RvdHlwZS5vbkRyYWdNb3ZlPWZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGQ9bnVsbCxlPXRoaXMuZGlmZmVyZW5jZSh0aGlzLl9kcmFnLnBvaW50ZXIsdGhpcy5wb2ludGVyKGEpKSxmPXRoaXMuZGlmZmVyZW5jZSh0aGlzLl9kcmFnLnN0YWdlLnN0YXJ0LGUpO3RoaXMuaXMoImRyYWdnaW5nIikmJihhLnByZXZlbnREZWZhdWx0KCksdGhpcy5zZXR0aW5ncy5sb29wPyhiPXRoaXMuY29vcmRpbmF0ZXModGhpcy5taW5pbXVtKCkpLGM9dGhpcy5jb29yZGluYXRlcyh0aGlzLm1heGltdW0oKSsxKS1iLGYueD0oKGYueC1iKSVjK2MpJWMrYik6KGI9dGhpcy5zZXR0aW5ncy5ydGw/dGhpcy5jb29yZGluYXRlcyh0aGlzLm1heGltdW0oKSk6dGhpcy5jb29yZGluYXRlcyh0aGlzLm1pbmltdW0oKSksYz10aGlzLnNldHRpbmdzLnJ0bD90aGlzLmNvb3JkaW5hdGVzKHRoaXMubWluaW11bSgpKTp0aGlzLmNvb3JkaW5hdGVzKHRoaXMubWF4aW11bSgpKSxkPXRoaXMuc2V0dGluZ3MucHVsbERyYWc/LTEqZS54LzU6MCxmLng9TWF0aC5tYXgoTWF0aC5taW4oZi54LGIrZCksYytkKSksdGhpcy5fZHJhZy5zdGFnZS5jdXJyZW50PWYsdGhpcy5hbmltYXRlKGYueCkpfSxlLnByb3RvdHlwZS5vbkRyYWdFbmQ9ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5kaWZmZXJlbmNlKHRoaXMuX2RyYWcucG9pbnRlcix0aGlzLnBvaW50ZXIoYikpLGU9dGhpcy5fZHJhZy5zdGFnZS5jdXJyZW50LGY9ZC54PjBedGhpcy5zZXR0aW5ncy5ydGw/ImxlZnQiOiJyaWdodCI7YShjKS5vZmYoIi5vd2wuY29yZSIpLHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmdyYWJDbGFzcyksKDAhPT1kLngmJnRoaXMuaXMoImRyYWdnaW5nIil8fCF0aGlzLmlzKCJ2YWxpZCIpKSYmKHRoaXMuc3BlZWQodGhpcy5zZXR0aW5ncy5kcmFnRW5kU3BlZWR8fHRoaXMuc2V0dGluZ3Muc21hcnRTcGVlZCksdGhpcy5jdXJyZW50KHRoaXMuY2xvc2VzdChlLngsMCE9PWQueD9mOnRoaXMuX2RyYWcuZGlyZWN0aW9uKSksdGhpcy5pbnZhbGlkYXRlKCJwb3NpdGlvbiIpLHRoaXMudXBkYXRlKCksdGhpcy5fZHJhZy5kaXJlY3Rpb249ZiwoTWF0aC5hYnMoZC54KT4zfHwobmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9kcmFnLnRpbWU+MzAwKSYmdGhpcy5fZHJhZy50YXJnZXQub25lKCJjbGljay5vd2wuY29yZSIsZnVuY3Rpb24oKXtyZXR1cm4hMX0pKSx0aGlzLmlzKCJkcmFnZ2luZyIpJiYodGhpcy5sZWF2ZSgiZHJhZ2dpbmciKSx0aGlzLnRyaWdnZXIoImRyYWdnZWQiKSl9LGUucHJvdG90eXBlLmNsb3Nlc3Q9ZnVuY3Rpb24oYixjKXt2YXIgZT0tMSxmPTMwLGc9dGhpcy53aWR0aCgpLGg9dGhpcy5jb29yZGluYXRlcygpO3JldHVybiB0aGlzLnNldHRpbmdzLmZyZWVEcmFnfHxhLmVhY2goaCxhLnByb3h5KGZ1bmN0aW9uKGEsaSl7cmV0dXJuImxlZnQiPT09YyYmYj5pLWYmJmI8aStmP2U9YToicmlnaHQiPT09YyYmYj5pLWctZiYmYjxpLWcrZj9lPWErMTp0aGlzLm9wKGIsIjwiLGkpJiZ0aGlzLm9wKGIsIj4iLGhbYSsxXSE9PWQ/aFthKzFdOmktZykmJihlPSJsZWZ0Ij09PWM/YSsxOmEpLC0xPT09ZX0sdGhpcykpLHRoaXMuc2V0dGluZ3MubG9vcHx8KHRoaXMub3AoYiwiPiIsaFt0aGlzLm1pbmltdW0oKV0pP2U9Yj10aGlzLm1pbmltdW0oKTp0aGlzLm9wKGIsIjwiLGhbdGhpcy5tYXhpbXVtKCldKSYmKGU9Yj10aGlzLm1heGltdW0oKSkpLGV9LGUucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5zcGVlZCgpPjA7dGhpcy5pcygiYW5pbWF0aW5nIikmJnRoaXMub25UcmFuc2l0aW9uRW5kKCksYyYmKHRoaXMuZW50ZXIoImFuaW1hdGluZyIpLHRoaXMudHJpZ2dlcigidHJhbnNsYXRlIikpLGEuc3VwcG9ydC50cmFuc2Zvcm0zZCYmYS5zdXBwb3J0LnRyYW5zaXRpb24/dGhpcy4kc3RhZ2UuY3NzKHt0cmFuc2Zvcm06InRyYW5zbGF0ZTNkKCIrYisicHgsMHB4LDBweCkiLHRyYW5zaXRpb246dGhpcy5zcGVlZCgpLzFlMysicyIrKHRoaXMuc2V0dGluZ3Muc2xpZGVUcmFuc2l0aW9uPyIgIit0aGlzLnNldHRpbmdzLnNsaWRlVHJhbnNpdGlvbjoiIil9KTpjP3RoaXMuJHN0YWdlLmFuaW1hdGUoe2xlZnQ6YisicHgifSx0aGlzLnNwZWVkKCksdGhpcy5zZXR0aW5ncy5mYWxsYmFja0Vhc2luZyxhLnByb3h5KHRoaXMub25UcmFuc2l0aW9uRW5kLHRoaXMpKTp0aGlzLiRzdGFnZS5jc3Moe2xlZnQ6YisicHgifSl9LGUucHJvdG90eXBlLmlzPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zdGF0ZXMuY3VycmVudFthXSYmdGhpcy5fc3RhdGVzLmN1cnJlbnRbYV0+MH0sZS5wcm90b3R5cGUuY3VycmVudD1mdW5jdGlvbihhKXtpZihhPT09ZClyZXR1cm4gdGhpcy5fY3VycmVudDtpZigwPT09dGhpcy5faXRlbXMubGVuZ3RoKXJldHVybiBkO2lmKGE9dGhpcy5ub3JtYWxpemUoYSksdGhpcy5fY3VycmVudCE9PWEpe3ZhciBiPXRoaXMudHJpZ2dlcigiY2hhbmdlIix7cHJvcGVydHk6e25hbWU6InBvc2l0aW9uIix2YWx1ZTphfX0pO2IuZGF0YSE9PWQmJihhPXRoaXMubm9ybWFsaXplKGIuZGF0YSkpLHRoaXMuX2N1cnJlbnQ9YSx0aGlzLmludmFsaWRhdGUoInBvc2l0aW9uIiksdGhpcy50cmlnZ2VyKCJjaGFuZ2VkIix7cHJvcGVydHk6e25hbWU6InBvc2l0aW9uIix2YWx1ZTp0aGlzLl9jdXJyZW50fX0pfXJldHVybiB0aGlzLl9jdXJyZW50fSxlLnByb3RvdHlwZS5pbnZhbGlkYXRlPWZ1bmN0aW9uKGIpe3JldHVybiJzdHJpbmciPT09YS50eXBlKGIpJiYodGhpcy5faW52YWxpZGF0ZWRbYl09ITAsdGhpcy5pcygidmFsaWQiKSYmdGhpcy5sZWF2ZSgidmFsaWQiKSksYS5tYXAodGhpcy5faW52YWxpZGF0ZWQsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYn0pfSxlLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbihhKXsoYT10aGlzLm5vcm1hbGl6ZShhKSkhPT1kJiYodGhpcy5fc3BlZWQ9MCx0aGlzLl9jdXJyZW50PWEsdGhpcy5zdXBwcmVzcyhbInRyYW5zbGF0ZSIsInRyYW5zbGF0ZWQiXSksdGhpcy5hbmltYXRlKHRoaXMuY29vcmRpbmF0ZXMoYSkpLHRoaXMucmVsZWFzZShbInRyYW5zbGF0ZSIsInRyYW5zbGF0ZWQiXSkpfSxlLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9pdGVtcy5sZW5ndGgsZT1iPzA6dGhpcy5fY2xvbmVzLmxlbmd0aDtyZXR1cm4hdGhpcy5pc051bWVyaWMoYSl8fGM8MT9hPWQ6KGE8MHx8YT49YytlKSYmKGE9KChhLWUvMiklYytjKSVjK2UvMiksYX0sZS5wcm90b3R5cGUucmVsYXRpdmU9ZnVuY3Rpb24oYSl7cmV0dXJuIGEtPXRoaXMuX2Nsb25lcy5sZW5ndGgvMix0aGlzLm5vcm1hbGl6ZShhLCEwKX0sZS5wcm90b3R5cGUubWF4aW11bT1mdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzLnNldHRpbmdzLGY9dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoO2lmKGUubG9vcClmPXRoaXMuX2Nsb25lcy5sZW5ndGgvMit0aGlzLl9pdGVtcy5sZW5ndGgtMTtlbHNlIGlmKGUuYXV0b1dpZHRofHxlLm1lcmdlKXtpZihiPXRoaXMuX2l0ZW1zLmxlbmd0aClmb3IoYz10aGlzLl9pdGVtc1stLWJdLndpZHRoKCksZD10aGlzLiRlbGVtZW50LndpZHRoKCk7Yi0tJiYhKChjKz10aGlzLl9pdGVtc1tiXS53aWR0aCgpK3RoaXMuc2V0dGluZ3MubWFyZ2luKT5kKTspO2Y9YisxfWVsc2UgZj1lLmNlbnRlcj90aGlzLl9pdGVtcy5sZW5ndGgtMTp0aGlzLl9pdGVtcy5sZW5ndGgtZS5pdGVtcztyZXR1cm4gYSYmKGYtPXRoaXMuX2Nsb25lcy5sZW5ndGgvMiksTWF0aC5tYXgoZiwwKX0sZS5wcm90b3R5cGUubWluaW11bT1mdW5jdGlvbihhKXtyZXR1cm4gYT8wOnRoaXMuX2Nsb25lcy5sZW5ndGgvMn0sZS5wcm90b3R5cGUuaXRlbXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1kP3RoaXMuX2l0ZW1zLnNsaWNlKCk6KGE9dGhpcy5ub3JtYWxpemUoYSwhMCksdGhpcy5faXRlbXNbYV0pfSxlLnByb3RvdHlwZS5tZXJnZXJzPWZ1bmN0aW9uKGEpe3JldHVybiBhPT09ZD90aGlzLl9tZXJnZXJzLnNsaWNlKCk6KGE9dGhpcy5ub3JtYWxpemUoYSwhMCksdGhpcy5fbWVyZ2Vyc1thXSl9LGUucHJvdG90eXBlLmNsb25lcz1mdW5jdGlvbihiKXt2YXIgYz10aGlzLl9jbG9uZXMubGVuZ3RoLzIsZT1jK3RoaXMuX2l0ZW1zLmxlbmd0aCxmPWZ1bmN0aW9uKGEpe3JldHVybiBhJTI9PTA/ZSthLzI6Yy0oYSsxKS8yfTtyZXR1cm4gYj09PWQ/YS5tYXAodGhpcy5fY2xvbmVzLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGYoYil9KTphLm1hcCh0aGlzLl9jbG9uZXMsZnVuY3Rpb24oYSxjKXtyZXR1cm4gYT09PWI/ZihjKTpudWxsfSl9LGUucHJvdG90eXBlLnNwZWVkPWZ1bmN0aW9uKGEpe3JldHVybiBhIT09ZCYmKHRoaXMuX3NwZWVkPWEpLHRoaXMuX3NwZWVkfSxlLnByb3RvdHlwZS5jb29yZGluYXRlcz1mdW5jdGlvbihiKXt2YXIgYyxlPTEsZj1iLTE7cmV0dXJuIGI9PT1kP2EubWFwKHRoaXMuX2Nvb3JkaW5hdGVzLGEucHJveHkoZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5jb29yZGluYXRlcyhiKX0sdGhpcykpOih0aGlzLnNldHRpbmdzLmNlbnRlcj8odGhpcy5zZXR0aW5ncy5ydGwmJihlPS0xLGY9YisxKSxjPXRoaXMuX2Nvb3JkaW5hdGVzW2JdLGMrPSh0aGlzLndpZHRoKCktYysodGhpcy5fY29vcmRpbmF0ZXNbZl18fDApKS8yKmUpOmM9dGhpcy5fY29vcmRpbmF0ZXNbZl18fDAsYz1NYXRoLmNlaWwoYykpfSxlLnByb3RvdHlwZS5kdXJhdGlvbj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIDA9PT1jPzA6TWF0aC5taW4oTWF0aC5tYXgoTWF0aC5hYnMoYi1hKSwxKSw2KSpNYXRoLmFicyhjfHx0aGlzLnNldHRpbmdzLnNtYXJ0U3BlZWQpfSxlLnByb3RvdHlwZS50bz1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY3VycmVudCgpLGQ9bnVsbCxlPWEtdGhpcy5yZWxhdGl2ZShjKSxmPShlPjApLShlPDApLGc9dGhpcy5faXRlbXMubGVuZ3RoLGg9dGhpcy5taW5pbXVtKCksaT10aGlzLm1heGltdW0oKTt0aGlzLnNldHRpbmdzLmxvb3A/KCF0aGlzLnNldHRpbmdzLnJld2luZCYmTWF0aC5hYnMoZSk+Zy8yJiYoZSs9LTEqZipnKSxhPWMrZSwoZD0oKGEtaCklZytnKSVnK2gpIT09YSYmZC1lPD1pJiZkLWU+MCYmKGM9ZC1lLGE9ZCx0aGlzLnJlc2V0KGMpKSk6dGhpcy5zZXR0aW5ncy5yZXdpbmQ/KGkrPTEsYT0oYSVpK2kpJWkpOmE9TWF0aC5tYXgoaCxNYXRoLm1pbihpLGEpKSx0aGlzLnNwZWVkKHRoaXMuZHVyYXRpb24oYyxhLGIpKSx0aGlzLmN1cnJlbnQoYSksdGhpcy5pc1Zpc2libGUoKSYmdGhpcy51cGRhdGUoKX0sZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbihhKXthPWF8fCExLHRoaXMudG8odGhpcy5yZWxhdGl2ZSh0aGlzLmN1cnJlbnQoKSkrMSxhKX0sZS5wcm90b3R5cGUucHJldj1mdW5jdGlvbihhKXthPWF8fCExLHRoaXMudG8odGhpcy5yZWxhdGl2ZSh0aGlzLmN1cnJlbnQoKSktMSxhKX0sZS5wcm90b3R5cGUub25UcmFuc2l0aW9uRW5kPWZ1bmN0aW9uKGEpe2lmKGEhPT1kJiYoYS5zdG9wUHJvcGFnYXRpb24oKSwoYS50YXJnZXR8fGEuc3JjRWxlbWVudHx8YS5vcmlnaW5hbFRhcmdldCkhPT10aGlzLiRzdGFnZS5nZXQoMCkpKXJldHVybiExO3RoaXMubGVhdmUoImFuaW1hdGluZyIpLHRoaXMudHJpZ2dlcigidHJhbnNsYXRlZCIpfSxlLnByb3RvdHlwZS52aWV3cG9ydD1mdW5jdGlvbigpe3ZhciBkO3JldHVybiB0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZUJhc2VFbGVtZW50IT09Yj9kPWEodGhpcy5vcHRpb25zLnJlc3BvbnNpdmVCYXNlRWxlbWVudCkud2lkdGgoKTpiLmlubmVyV2lkdGg/ZD1iLmlubmVyV2lkdGg6Yy5kb2N1bWVudEVsZW1lbnQmJmMuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoP2Q9Yy5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6Y29uc29sZS53YXJuKCJDYW4gbm90IGRldGVjdCB2aWV3cG9ydCB3aWR0aC4iKSxkfSxlLnByb3RvdHlwZS5yZXBsYWNlPWZ1bmN0aW9uKGIpe3RoaXMuJHN0YWdlLmVtcHR5KCksdGhpcy5faXRlbXM9W10sYiYmKGI9YiBpbnN0YW5jZW9mIGpRdWVyeT9iOmEoYikpLHRoaXMuc2V0dGluZ3MubmVzdGVkSXRlbVNlbGVjdG9yJiYoYj1iLmZpbmQoIi4iK3RoaXMuc2V0dGluZ3MubmVzdGVkSXRlbVNlbGVjdG9yKSksYi5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMubm9kZVR5cGV9KS5lYWNoKGEucHJveHkoZnVuY3Rpb24oYSxiKXtiPXRoaXMucHJlcGFyZShiKSx0aGlzLiRzdGFnZS5hcHBlbmQoYiksdGhpcy5faXRlbXMucHVzaChiKSx0aGlzLl9tZXJnZXJzLnB1c2goMSpiLmZpbmQoIltkYXRhLW1lcmdlXSIpLmFkZEJhY2soIltkYXRhLW1lcmdlXSIpLmF0dHIoImRhdGEtbWVyZ2UiKXx8MSl9LHRoaXMpKSx0aGlzLnJlc2V0KHRoaXMuaXNOdW1lcmljKHRoaXMuc2V0dGluZ3Muc3RhcnRQb3NpdGlvbik/dGhpcy5zZXR0aW5ncy5zdGFydFBvc2l0aW9uOjApLHRoaXMuaW52YWxpZGF0ZSgiaXRlbXMiKX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGIsYyl7dmFyIGU9dGhpcy5yZWxhdGl2ZSh0aGlzLl9jdXJyZW50KTtjPWM9PT1kP3RoaXMuX2l0ZW1zLmxlbmd0aDp0aGlzLm5vcm1hbGl6ZShjLCEwKSxiPWIgaW5zdGFuY2VvZiBqUXVlcnk/YjphKGIpLHRoaXMudHJpZ2dlcigiYWRkIix7Y29udGVudDpiLHBvc2l0aW9uOmN9KSxiPXRoaXMucHJlcGFyZShiKSwwPT09dGhpcy5faXRlbXMubGVuZ3RofHxjPT09dGhpcy5faXRlbXMubGVuZ3RoPygwPT09dGhpcy5faXRlbXMubGVuZ3RoJiZ0aGlzLiRzdGFnZS5hcHBlbmQoYiksMCE9PXRoaXMuX2l0ZW1zLmxlbmd0aCYmdGhpcy5faXRlbXNbYy0xXS5hZnRlcihiKSx0aGlzLl9pdGVtcy5wdXNoKGIpLHRoaXMuX21lcmdlcnMucHVzaCgxKmIuZmluZCgiW2RhdGEtbWVyZ2VdIikuYWRkQmFjaygiW2RhdGEtbWVyZ2VdIikuYXR0cigiZGF0YS1tZXJnZSIpfHwxKSk6KHRoaXMuX2l0ZW1zW2NdLmJlZm9yZShiKSx0aGlzLl9pdGVtcy5zcGxpY2UoYywwLGIpLHRoaXMuX21lcmdlcnMuc3BsaWNlKGMsMCwxKmIuZmluZCgiW2RhdGEtbWVyZ2VdIikuYWRkQmFjaygiW2RhdGEtbWVyZ2VdIikuYXR0cigiZGF0YS1tZXJnZSIpfHwxKSksdGhpcy5faXRlbXNbZV0mJnRoaXMucmVzZXQodGhpcy5faXRlbXNbZV0uaW5kZXgoKSksdGhpcy5pbnZhbGlkYXRlKCJpdGVtcyIpLHRoaXMudHJpZ2dlcigiYWRkZWQiLHtjb250ZW50OmIscG9zaXRpb246Y30pfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oYSl7KGE9dGhpcy5ub3JtYWxpemUoYSwhMCkpIT09ZCYmKHRoaXMudHJpZ2dlcigicmVtb3ZlIix7Y29udGVudDp0aGlzLl9pdGVtc1thXSxwb3NpdGlvbjphfSksdGhpcy5faXRlbXNbYV0ucmVtb3ZlKCksdGhpcy5faXRlbXMuc3BsaWNlKGEsMSksdGhpcy5fbWVyZ2Vycy5zcGxpY2UoYSwxKSx0aGlzLmludmFsaWRhdGUoIml0ZW1zIiksdGhpcy50cmlnZ2VyKCJyZW1vdmVkIix7Y29udGVudDpudWxsLHBvc2l0aW9uOmF9KSl9LGUucHJvdG90eXBlLnByZWxvYWRBdXRvV2lkdGhJbWFnZXM9ZnVuY3Rpb24oYil7Yi5lYWNoKGEucHJveHkoZnVuY3Rpb24oYixjKXt0aGlzLmVudGVyKCJwcmUtbG9hZGluZyIpLGM9YShjKSxhKG5ldyBJbWFnZSkub25lKCJsb2FkIixhLnByb3h5KGZ1bmN0aW9uKGEpe2MuYXR0cigic3JjIixhLnRhcmdldC5zcmMpLGMuY3NzKCJvcGFjaXR5IiwxKSx0aGlzLmxlYXZlKCJwcmUtbG9hZGluZyIpLCF0aGlzLmlzKCJwcmUtbG9hZGluZyIpJiYhdGhpcy5pcygiaW5pdGlhbGl6aW5nIikmJnRoaXMucmVmcmVzaCgpfSx0aGlzKSkuYXR0cigic3JjIixjLmF0dHIoInNyYyIpfHxjLmF0dHIoImRhdGEtc3JjIil8fGMuYXR0cigiZGF0YS1zcmMtcmV0aW5hIikpfSx0aGlzKSl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50Lm9mZigiLm93bC5jb3JlIiksdGhpcy4kc3RhZ2Uub2ZmKCIub3dsLmNvcmUiKSxhKGMpLm9mZigiLm93bC5jb3JlIiksITEhPT10aGlzLnNldHRpbmdzLnJlc3BvbnNpdmUmJihiLmNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVyKSx0aGlzLm9mZihiLCJyZXNpemUiLHRoaXMuX2hhbmRsZXJzLm9uVGhyb3R0bGVkUmVzaXplKSk7Zm9yKHZhciBkIGluIHRoaXMuX3BsdWdpbnMpdGhpcy5fcGx1Z2luc1tkXS5kZXN0cm95KCk7dGhpcy4kc3RhZ2UuY2hpbGRyZW4oIi5jbG9uZWQiKS5yZW1vdmUoKSx0aGlzLiRzdGFnZS51bndyYXAoKSx0aGlzLiRzdGFnZS5jaGlsZHJlbigpLmNvbnRlbnRzKCkudW53cmFwKCksdGhpcy4kc3RhZ2UuY2hpbGRyZW4oKS51bndyYXAoKSx0aGlzLiRzdGFnZS5yZW1vdmUoKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5yZWZyZXNoQ2xhc3MpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3MpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sb2FkZWRDbGFzcykucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLnJ0bENsYXNzKS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuZHJhZ0NsYXNzKS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuZ3JhYkNsYXNzKS5hdHRyKCJjbGFzcyIsdGhpcy4kZWxlbWVudC5hdHRyKCJjbGFzcyIpLnJlcGxhY2UobmV3IFJlZ0V4cCh0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZUNsYXNzKyItXFxTK1xccyIsImciKSwiIikpLnJlbW92ZURhdGEoIm93bC5jYXJvdXNlbCIpfSxlLnByb3RvdHlwZS5vcD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5zZXR0aW5ncy5ydGw7c3dpdGNoKGIpe2Nhc2UiPCI6cmV0dXJuIGQ/YT5jOmE8YztjYXNlIj4iOnJldHVybiBkP2E8YzphPmM7Y2FzZSI+PSI6cmV0dXJuIGQ/YTw9YzphPj1jO2Nhc2UiPD0iOnJldHVybiBkP2E+PWM6YTw9Y319LGUucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGEsYixjLGQpe2EuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLGQpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitiLGMpfSxlLnByb3RvdHlwZS5vZmY9ZnVuY3Rpb24oYSxiLGMsZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyP2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsZCk6YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYyl9LGUucHJvdG90eXBlLnRyaWdnZXI9ZnVuY3Rpb24oYixjLGQsZixnKXt2YXIgaD17aXRlbTp7Y291bnQ6dGhpcy5faXRlbXMubGVuZ3RoLGluZGV4OnRoaXMuY3VycmVudCgpfX0saT1hLmNhbWVsQ2FzZShhLmdyZXAoWyJvbiIsYixkXSxmdW5jdGlvbihhKXtyZXR1cm4gYX0pLmpvaW4oIi0iKS50b0xvd2VyQ2FzZSgpKSxqPWEuRXZlbnQoW2IsIm93bCIsZHx8ImNhcm91c2VsIl0uam9pbigiLiIpLnRvTG93ZXJDYXNlKCksYS5leHRlbmQoe3JlbGF0ZWRUYXJnZXQ6dGhpc30saCxjKSk7cmV0dXJuIHRoaXMuX3N1cHJlc3NbYl18fChhLmVhY2godGhpcy5fcGx1Z2lucyxmdW5jdGlvbihhLGIpe2Iub25UcmlnZ2VyJiZiLm9uVHJpZ2dlcihqKX0pLHRoaXMucmVnaXN0ZXIoe3R5cGU6ZS5UeXBlLkV2ZW50LG5hbWU6Yn0pLHRoaXMuJGVsZW1lbnQudHJpZ2dlcihqKSx0aGlzLnNldHRpbmdzJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5zZXR0aW5nc1tpXSYmdGhpcy5zZXR0aW5nc1tpXS5jYWxsKHRoaXMsaikpLGp9LGUucHJvdG90eXBlLmVudGVyPWZ1bmN0aW9uKGIpe2EuZWFjaChbYl0uY29uY2F0KHRoaXMuX3N0YXRlcy50YWdzW2JdfHxbXSksYS5wcm94eShmdW5jdGlvbihhLGIpe3RoaXMuX3N0YXRlcy5jdXJyZW50W2JdPT09ZCYmKHRoaXMuX3N0YXRlcy5jdXJyZW50W2JdPTApLHRoaXMuX3N0YXRlcy5jdXJyZW50W2JdKyt9LHRoaXMpKX0sZS5wcm90b3R5cGUubGVhdmU9ZnVuY3Rpb24oYil7YS5lYWNoKFtiXS5jb25jYXQodGhpcy5fc3RhdGVzLnRhZ3NbYl18fFtdKSxhLnByb3h5KGZ1bmN0aW9uKGEsYil7dGhpcy5fc3RhdGVzLmN1cnJlbnRbYl0tLX0sdGhpcykpfSxlLnByb3RvdHlwZS5yZWdpc3Rlcj1mdW5jdGlvbihiKXtpZihiLnR5cGU9PT1lLlR5cGUuRXZlbnQpe2lmKGEuZXZlbnQuc3BlY2lhbFtiLm5hbWVdfHwoYS5ldmVudC5zcGVjaWFsW2IubmFtZV09e30pLCFhLmV2ZW50LnNwZWNpYWxbYi5uYW1lXS5vd2wpe3ZhciBjPWEuZXZlbnQuc3BlY2lhbFtiLm5hbWVdLl9kZWZhdWx0O2EuZXZlbnQuc3BlY2lhbFtiLm5hbWVdLl9kZWZhdWx0PWZ1bmN0aW9uKGEpe3JldHVybiFjfHwhYy5hcHBseXx8YS5uYW1lc3BhY2UmJi0xIT09YS5uYW1lc3BhY2UuaW5kZXhPZigib3dsIik/YS5uYW1lc3BhY2UmJmEubmFtZXNwYWNlLmluZGV4T2YoIm93bCIpPi0xOmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhLmV2ZW50LnNwZWNpYWxbYi5uYW1lXS5vd2w9ITB9fWVsc2UgYi50eXBlPT09ZS5UeXBlLlN0YXRlJiYodGhpcy5fc3RhdGVzLnRhZ3NbYi5uYW1lXT90aGlzLl9zdGF0ZXMudGFnc1tiLm5hbWVdPXRoaXMuX3N0YXRlcy50YWdzW2IubmFtZV0uY29uY2F0KGIudGFncyk6dGhpcy5fc3RhdGVzLnRhZ3NbYi5uYW1lXT1iLnRhZ3MsdGhpcy5fc3RhdGVzLnRhZ3NbYi5uYW1lXT1hLmdyZXAodGhpcy5fc3RhdGVzLnRhZ3NbYi5uYW1lXSxhLnByb3h5KGZ1bmN0aW9uKGMsZCl7cmV0dXJuIGEuaW5BcnJheShjLHRoaXMuX3N0YXRlcy50YWdzW2IubmFtZV0pPT09ZH0sdGhpcykpKX0sZS5wcm90b3R5cGUuc3VwcHJlc3M9ZnVuY3Rpb24oYil7YS5lYWNoKGIsYS5wcm94eShmdW5jdGlvbihhLGIpe3RoaXMuX3N1cHJlc3NbYl09ITB9LHRoaXMpKX0sZS5wcm90b3R5cGUucmVsZWFzZT1mdW5jdGlvbihiKXthLmVhY2goYixhLnByb3h5KGZ1bmN0aW9uKGEsYil7ZGVsZXRlIHRoaXMuX3N1cHJlc3NbYl19LHRoaXMpKX0sZS5wcm90b3R5cGUucG9pbnRlcj1mdW5jdGlvbihhKXt2YXIgYz17eDpudWxsLHk6bnVsbH07cmV0dXJuIGE9YS5vcmlnaW5hbEV2ZW50fHxhfHxiLmV2ZW50LGE9YS50b3VjaGVzJiZhLnRvdWNoZXMubGVuZ3RoP2EudG91Y2hlc1swXTphLmNoYW5nZWRUb3VjaGVzJiZhLmNoYW5nZWRUb3VjaGVzLmxlbmd0aD9hLmNoYW5nZWRUb3VjaGVzWzBdOmEsYS5wYWdlWD8oYy54PWEucGFnZVgsYy55PWEucGFnZVkpOihjLng9YS5jbGllbnRYLGMueT1hLmNsaWVudFkpLGN9LGUucHJvdG90eXBlLmlzTnVtZXJpYz1mdW5jdGlvbihhKXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdChhKSl9LGUucHJvdG90eXBlLmRpZmZlcmVuY2U9ZnVuY3Rpb24oYSxiKXtyZXR1cm57eDphLngtYi54LHk6YS55LWIueX19LGEuZm4ub3dsQ2Fyb3VzZWw9ZnVuY3Rpb24oYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hKHRoaXMpLGY9ZC5kYXRhKCJvd2wuY2Fyb3VzZWwiKTtmfHwoZj1uZXcgZSh0aGlzLCJvYmplY3QiPT10eXBlb2YgYiYmYiksZC5kYXRhKCJvd2wuY2Fyb3VzZWwiLGYpLGEuZWFjaChbIm5leHQiLCJwcmV2IiwidG8iLCJkZXN0cm95IiwicmVmcmVzaCIsInJlcGxhY2UiLCJhZGQiLCJyZW1vdmUiXSxmdW5jdGlvbihiLGMpe2YucmVnaXN0ZXIoe3R5cGU6ZS5UeXBlLkV2ZW50LG5hbWU6Y30pLGYuJGVsZW1lbnQub24oYysiLm93bC5jYXJvdXNlbC5jb3JlIixhLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZhLnJlbGF0ZWRUYXJnZXQhPT10aGlzJiYodGhpcy5zdXBwcmVzcyhbY10pLGZbY10uYXBwbHkodGhpcyxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSksdGhpcy5yZWxlYXNlKFtjXSkpfSxmKSl9KSksInN0cmluZyI9PXR5cGVvZiBiJiYiXyIhPT1iLmNoYXJBdCgwKSYmZltiXS5hcHBseShmLGMpfSl9LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3I9ZX0od2luZG93LlplcHRvfHx3aW5kb3cualF1ZXJ5LHdpbmRvdyxkb2N1bWVudCksZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYil7dGhpcy5fY29yZT1iLHRoaXMuX2ludGVydmFsPW51bGwsdGhpcy5fdmlzaWJsZT1udWxsLHRoaXMuX2hhbmRsZXJzPXsiaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9SZWZyZXNoJiZ0aGlzLndhdGNoKCl9LHRoaXMpfSx0aGlzLl9jb3JlLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyx0aGlzLl9jb3JlLm9wdGlvbnMpLHRoaXMuX2NvcmUuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpfTtlLkRlZmF1bHRzPXthdXRvUmVmcmVzaDohMCxhdXRvUmVmcmVzaEludGVydmFsOjUwMH0sZS5wcm90b3R5cGUud2F0Y2g9ZnVuY3Rpb24oKXt0aGlzLl9pbnRlcnZhbHx8KHRoaXMuX3Zpc2libGU9dGhpcy5fY29yZS5pc1Zpc2libGUoKSx0aGlzLl9pbnRlcnZhbD1iLnNldEludGVydmFsKGEucHJveHkodGhpcy5yZWZyZXNoLHRoaXMpLHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b1JlZnJlc2hJbnRlcnZhbCkpfSxlLnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7dGhpcy5fY29yZS5pc1Zpc2libGUoKSE9PXRoaXMuX3Zpc2libGUmJih0aGlzLl92aXNpYmxlPSF0aGlzLl92aXNpYmxlLHRoaXMuX2NvcmUuJGVsZW1lbnQudG9nZ2xlQ2xhc3MoIm93bC1oaWRkZW4iLCF0aGlzLl92aXNpYmxlKSx0aGlzLl92aXNpYmxlJiZ0aGlzLl9jb3JlLmludmFsaWRhdGUoIndpZHRoIikmJnRoaXMuX2NvcmUucmVmcmVzaCgpKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhLGM7Yi5jbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKTtmb3IoYSBpbiB0aGlzLl9oYW5kbGVycyl0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihhLHRoaXMuX2hhbmRsZXJzW2FdKTtmb3IoYyBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkiZnVuY3Rpb24iIT10eXBlb2YgdGhpc1tjXSYmKHRoaXNbY109bnVsbCl9LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5BdXRvUmVmcmVzaD1lfSh3aW5kb3cuWmVwdG98fHdpbmRvdy5qUXVlcnksd2luZG93LGRvY3VtZW50KSxmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mdW5jdGlvbihiKXt0aGlzLl9jb3JlPWIsdGhpcy5fbG9hZGVkPVtdLHRoaXMuX2hhbmRsZXJzPXsiaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsIGNoYW5nZS5vd2wuY2Fyb3VzZWwgcmVzaXplZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYil7aWYoYi5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuc2V0dGluZ3MmJnRoaXMuX2NvcmUuc2V0dGluZ3MubGF6eUxvYWQmJihiLnByb3BlcnR5JiYicG9zaXRpb24iPT1iLnByb3BlcnR5Lm5hbWV8fCJpbml0aWFsaXplZCI9PWIudHlwZSkpe3ZhciBjPXRoaXMuX2NvcmUuc2V0dGluZ3MsZT1jLmNlbnRlciYmTWF0aC5jZWlsKGMuaXRlbXMvMil8fGMuaXRlbXMsZj1jLmNlbnRlciYmLTEqZXx8MCxnPShiLnByb3BlcnR5JiZiLnByb3BlcnR5LnZhbHVlIT09ZD9iLnByb3BlcnR5LnZhbHVlOnRoaXMuX2NvcmUuY3VycmVudCgpKStmLGg9dGhpcy5fY29yZS5jbG9uZXMoKS5sZW5ndGgsaT1hLnByb3h5KGZ1bmN0aW9uKGEsYil7dGhpcy5sb2FkKGIpfSx0aGlzKTtmb3IoYy5sYXp5TG9hZEVhZ2VyPjAmJihlKz1jLmxhenlMb2FkRWFnZXIsYy5sb29wJiYoZy09Yy5sYXp5TG9hZEVhZ2VyLGUrKykpO2YrKzxlOyl0aGlzLmxvYWQoaC8yK3RoaXMuX2NvcmUucmVsYXRpdmUoZykpLGgmJmEuZWFjaCh0aGlzLl9jb3JlLmNsb25lcyh0aGlzLl9jb3JlLnJlbGF0aXZlKGcpKSxpKSxnKyt9fSx0aGlzKX0sdGhpcy5fY29yZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuRGVmYXVsdHMsdGhpcy5fY29yZS5vcHRpb25zKSx0aGlzLl9jb3JlLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKX07ZS5EZWZhdWx0cz17bGF6eUxvYWQ6ITEsbGF6eUxvYWRFYWdlcjowfSxlLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGMpe3ZhciBkPXRoaXMuX2NvcmUuJHN0YWdlLmNoaWxkcmVuKCkuZXEoYyksZT1kJiZkLmZpbmQoIi5vd2wtbGF6eSIpOyFlfHxhLmluQXJyYXkoZC5nZXQoMCksdGhpcy5fbG9hZGVkKT4tMXx8KGUuZWFjaChhLnByb3h5KGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hKGQpLGc9Yi5kZXZpY2VQaXhlbFJhdGlvPjEmJmYuYXR0cigiZGF0YS1zcmMtcmV0aW5hIil8fGYuYXR0cigiZGF0YS1zcmMiKXx8Zi5hdHRyKCJkYXRhLXNyY3NldCIpO3RoaXMuX2NvcmUudHJpZ2dlcigibG9hZCIse2VsZW1lbnQ6Zix1cmw6Z30sImxhenkiKSxmLmlzKCJpbWciKT9mLm9uZSgibG9hZC5vd2wubGF6eSIsYS5wcm94eShmdW5jdGlvbigpe2YuY3NzKCJvcGFjaXR5IiwxKSx0aGlzLl9jb3JlLnRyaWdnZXIoImxvYWRlZCIse2VsZW1lbnQ6Zix1cmw6Z30sImxhenkiKX0sdGhpcykpLmF0dHIoInNyYyIsZyk6Zi5pcygic291cmNlIik/Zi5vbmUoImxvYWQub3dsLmxhenkiLGEucHJveHkoZnVuY3Rpb24oKXt0aGlzLl9jb3JlLnRyaWdnZXIoImxvYWRlZCIse2VsZW1lbnQ6Zix1cmw6Z30sImxhenkiKX0sdGhpcykpLmF0dHIoInNyY3NldCIsZyk6KGU9bmV3IEltYWdlLGUub25sb2FkPWEucHJveHkoZnVuY3Rpb24oKXtmLmNzcyh7ImJhY2tncm91bmQtaW1hZ2UiOid1cmwoIicrZysnIiknLG9wYWNpdHk6IjEifSksdGhpcy5fY29yZS50cmlnZ2VyKCJsb2FkZWQiLHtlbGVtZW50OmYsdXJsOmd9LCJsYXp5Iil9LHRoaXMpLGUuc3JjPWcpfSx0aGlzKSksdGhpcy5fbG9hZGVkLnB1c2goZC5nZXQoMCkpKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhLGI7Zm9yKGEgaW4gdGhpcy5oYW5kbGVycyl0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihhLHRoaXMuaGFuZGxlcnNbYV0pO2ZvcihiIGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzW2JdJiYodGhpc1tiXT1udWxsKX0sYS5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLkxhenk9ZX0od2luZG93LlplcHRvfHx3aW5kb3cualF1ZXJ5LHdpbmRvdyxkb2N1bWVudCksZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYyl7dGhpcy5fY29yZT1jLHRoaXMuX3ByZXZpb3VzSGVpZ2h0PW51bGwsdGhpcy5faGFuZGxlcnM9eyJpbml0aWFsaXplZC5vd2wuY2Fyb3VzZWwgcmVmcmVzaGVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvSGVpZ2h0JiZ0aGlzLnVwZGF0ZSgpfSx0aGlzKSwiY2hhbmdlZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b0hlaWdodCYmInBvc2l0aW9uIj09PWEucHJvcGVydHkubmFtZSYmdGhpcy51cGRhdGUoKX0sdGhpcyksImxvYWRlZC5vd2wubGF6eSI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvSGVpZ2h0JiZhLmVsZW1lbnQuY2xvc2VzdCgiLiIrdGhpcy5fY29yZS5zZXR0aW5ncy5pdGVtQ2xhc3MpLmluZGV4KCk9PT10aGlzLl9jb3JlLmN1cnJlbnQoKSYmdGhpcy51cGRhdGUoKX0sdGhpcyl9LHRoaXMuX2NvcmUub3B0aW9ucz1hLmV4dGVuZCh7fSxlLkRlZmF1bHRzLHRoaXMuX2NvcmUub3B0aW9ucyksdGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyksdGhpcy5faW50ZXJ2YWxJZD1udWxsO3ZhciBkPXRoaXM7YShiKS5vbigibG9hZCIsZnVuY3Rpb24oKXtkLl9jb3JlLnNldHRpbmdzLmF1dG9IZWlnaHQmJmQudXBkYXRlKCl9KSxhKGIpLnJlc2l6ZShmdW5jdGlvbigpe2QuX2NvcmUuc2V0dGluZ3MuYXV0b0hlaWdodCYmKG51bGwhPWQuX2ludGVydmFsSWQmJmNsZWFyVGltZW91dChkLl9pbnRlcnZhbElkKSxkLl9pbnRlcnZhbElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtkLnVwZGF0ZSgpfSwyNTApKX0pfTtlLkRlZmF1bHRzPXthdXRvSGVpZ2h0OiExLGF1dG9IZWlnaHRDbGFzczoib3dsLWhlaWdodCJ9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBiPXRoaXMuX2NvcmUuX2N1cnJlbnQsYz1iK3RoaXMuX2NvcmUuc2V0dGluZ3MuaXRlbXMsZD10aGlzLl9jb3JlLnNldHRpbmdzLmxhenlMb2FkLGU9dGhpcy5fY29yZS4kc3RhZ2UuY2hpbGRyZW4oKS50b0FycmF5KCkuc2xpY2UoYixjKSxmPVtdLGc9MDthLmVhY2goZSxmdW5jdGlvbihiLGMpe2YucHVzaChhKGMpLmhlaWdodCgpKX0pLGc9TWF0aC5tYXguYXBwbHkobnVsbCxmKSxnPD0xJiZkJiZ0aGlzLl9wcmV2aW91c0hlaWdodCYmKGc9dGhpcy5fcHJldmlvdXNIZWlnaHQpLHRoaXMuX3ByZXZpb3VzSGVpZ2h0PWcsdGhpcy5fY29yZS4kc3RhZ2UucGFyZW50KCkuaGVpZ2h0KGcpLmFkZENsYXNzKHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b0hlaWdodENsYXNzKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhLGI7Zm9yKGEgaW4gdGhpcy5faGFuZGxlcnMpdGhpcy5fY29yZS4kZWxlbWVudC5vZmYoYSx0aGlzLl9oYW5kbGVyc1thXSk7Zm9yKGIgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXNbYl0mJih0aGlzW2JdPW51bGwpfSxhLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuQXV0b0hlaWdodD1lfSh3aW5kb3cuWmVwdG98fHdpbmRvdy5qUXVlcnksd2luZG93LGRvY3VtZW50KSxmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mdW5jdGlvbihiKXt0aGlzLl9jb3JlPWIsdGhpcy5fdmlkZW9zPXt9LHRoaXMuX3BsYXlpbmc9bnVsbCx0aGlzLl9oYW5kbGVycz17ImluaXRpYWxpemVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5fY29yZS5yZWdpc3Rlcih7dHlwZToic3RhdGUiLG5hbWU6InBsYXlpbmciLHRhZ3M6WyJpbnRlcmFjdGluZyJdfSl9LHRoaXMpLCJyZXNpemUub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLnZpZGVvJiZ0aGlzLmlzSW5GdWxsU2NyZWVuKCkmJmEucHJldmVudERlZmF1bHQoKX0sdGhpcyksInJlZnJlc2hlZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuaXMoInJlc2l6aW5nIikmJnRoaXMuX2NvcmUuJHN0YWdlLmZpbmQoIi5jbG9uZWQgLm93bC12aWRlby1mcmFtZSIpLnJlbW92ZSgpfSx0aGlzKSwiY2hhbmdlZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJiJwb3NpdGlvbiI9PT1hLnByb3BlcnR5Lm5hbWUmJnRoaXMuX3BsYXlpbmcmJnRoaXMuc3RvcCgpfSx0aGlzKSwicHJlcGFyZWQub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGIpe2lmKGIubmFtZXNwYWNlKXt2YXIgYz1hKGIuY29udGVudCkuZmluZCgiLm93bC12aWRlbyIpO2MubGVuZ3RoJiYoYy5jc3MoImRpc3BsYXkiLCJub25lIiksdGhpcy5mZXRjaChjLGEoYi5jb250ZW50KSkpfX0sdGhpcyl9LHRoaXMuX2NvcmUub3B0aW9ucz1hLmV4dGVuZCh7fSxlLkRlZmF1bHRzLHRoaXMuX2NvcmUub3B0aW9ucyksdGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyksdGhpcy5fY29yZS4kZWxlbWVudC5vbigiY2xpY2sub3dsLnZpZGVvIiwiLm93bC12aWRlby1wbGF5LWljb24iLGEucHJveHkoZnVuY3Rpb24oYSl7dGhpcy5wbGF5KGEpfSx0aGlzKSl9O2UuRGVmYXVsdHM9e3ZpZGVvOiExLHZpZGVvSGVpZ2h0OiExLHZpZGVvV2lkdGg6ITF9LGUucHJvdG90eXBlLmZldGNoPWZ1bmN0aW9uKGEsYil7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hdHRyKCJkYXRhLXZpbWVvLWlkIik/InZpbWVvIjphLmF0dHIoImRhdGEtdnphYXItaWQiKT8idnphYXIiOiJ5b3V0dWJlIn0oKSxkPWEuYXR0cigiZGF0YS12aW1lby1pZCIpfHxhLmF0dHIoImRhdGEteW91dHViZS1pZCIpfHxhLmF0dHIoImRhdGEtdnphYXItaWQiKSxlPWEuYXR0cigiZGF0YS13aWR0aCIpfHx0aGlzLl9jb3JlLnNldHRpbmdzLnZpZGVvV2lkdGgsZj1hLmF0dHIoImRhdGEtaGVpZ2h0Iil8fHRoaXMuX2NvcmUuc2V0dGluZ3MudmlkZW9IZWlnaHQsZz1hLmF0dHIoImhyZWYiKTtpZighZyl0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgdmlkZW8gVVJMLiIpO2lmKGQ9Zy5tYXRjaCgvKGh0dHA6fGh0dHBzOnwpXC9cLyhwbGF5ZXIufHd3dy58YXBwLik/KHZpbWVvXC5jb218eW91dHUoYmVcLmNvbXxcLmJlfGJlXC5nb29nbGVhcGlzXC5jb218YmVcLW5vY29va2llXC5jb20pfHZ6YWFyXC5jb20pXC8odmlkZW9cL3x2aWRlb3NcL3xlbWJlZFwvfGNoYW5uZWxzXC8uK1wvfGdyb3Vwc1wvLitcL3x3YXRjaFw/dj18dlwvKT8oW0EtWmEtejAtOS5fJS1dKikoXCZcUyspPy8pLGRbM10uaW5kZXhPZigieW91dHUiKT4tMSljPSJ5b3V0dWJlIjtlbHNlIGlmKGRbM10uaW5kZXhPZigidmltZW8iKT4tMSljPSJ2aW1lbyI7ZWxzZXtpZighKGRbM10uaW5kZXhPZigidnphYXIiKT4tMSkpdGhyb3cgbmV3IEVycm9yKCJWaWRlbyBVUkwgbm90IHN1cHBvcnRlZC4iKTtjPSJ2emFhciJ9ZD1kWzZdLHRoaXMuX3ZpZGVvc1tnXT17dHlwZTpjLGlkOmQsd2lkdGg6ZSxoZWlnaHQ6Zn0sYi5hdHRyKCJkYXRhLXZpZGVvIixnKSx0aGlzLnRodW1ibmFpbChhLHRoaXMuX3ZpZGVvc1tnXSl9LGUucHJvdG90eXBlLnRodW1ibmFpbD1mdW5jdGlvbihiLGMpe3ZhciBkLGUsZixnPWMud2lkdGgmJmMuaGVpZ2h0PyJ3aWR0aDoiK2Mud2lkdGgrInB4O2hlaWdodDoiK2MuaGVpZ2h0KyJweDsiOiIiLGg9Yi5maW5kKCJpbWciKSxpPSJzcmMiLGo9IiIsaz10aGlzLl9jb3JlLnNldHRpbmdzLGw9ZnVuY3Rpb24oYyl7ZT0nPGRpdiBjbGFzcz0ib3dsLXZpZGVvLXBsYXktaWNvbiI+PC9kaXY+JyxkPWsubGF6eUxvYWQ/YSgiPGRpdi8+Iix7Y2xhc3M6Im93bC12aWRlby10biAiK2osc3JjVHlwZTpjfSk6YSgiPGRpdi8+Iix7Y2xhc3M6Im93bC12aWRlby10biIsc3R5bGU6Im9wYWNpdHk6MTtiYWNrZ3JvdW5kLWltYWdlOnVybCgiK2MrIikifSksYi5hZnRlcihkKSxiLmFmdGVyKGUpfTtpZihiLndyYXAoYSgiPGRpdi8+Iix7Y2xhc3M6Im93bC12aWRlby13cmFwcGVyIixzdHlsZTpnfSkpLHRoaXMuX2NvcmUuc2V0dGluZ3MubGF6eUxvYWQmJihpPSJkYXRhLXNyYyIsaj0ib3dsLWxhenkiKSxoLmxlbmd0aClyZXR1cm4gbChoLmF0dHIoaSkpLGgucmVtb3ZlKCksITE7InlvdXR1YmUiPT09Yy50eXBlPyhmPSIvL2ltZy55b3V0dWJlLmNvbS92aS8iK2MuaWQrIi9ocWRlZmF1bHQuanBnIixsKGYpKToidmltZW8iPT09Yy50eXBlP2EuYWpheCh7dHlwZToiR0VUIix1cmw6Ii8vdmltZW8uY29tL2FwaS92Mi92aWRlby8iK2MuaWQrIi5qc29uIixqc29ucDoiY2FsbGJhY2siLGRhdGFUeXBlOiJqc29ucCIsc3VjY2VzczpmdW5jdGlvbihhKXtmPWFbMF0udGh1bWJuYWlsX2xhcmdlLGwoZil9fSk6InZ6YWFyIj09PWMudHlwZSYmYS5hamF4KHt0eXBlOiJHRVQiLHVybDoiLy92emFhci5jb20vYXBpL3ZpZGVvcy8iK2MuaWQrIi5qc29uIixqc29ucDoiY2FsbGJhY2siLGRhdGFUeXBlOiJqc29ucCIsc3VjY2VzczpmdW5jdGlvbihhKXtmPWEuZnJhbWVncmFiX3VybCxsKGYpfX0pfSxlLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5fY29yZS50cmlnZ2VyKCJzdG9wIixudWxsLCJ2aWRlbyIpLHRoaXMuX3BsYXlpbmcuZmluZCgiLm93bC12aWRlby1mcmFtZSIpLnJlbW92ZSgpLHRoaXMuX3BsYXlpbmcucmVtb3ZlQ2xhc3MoIm93bC12aWRlby1wbGF5aW5nIiksdGhpcy5fcGxheWluZz1udWxsLHRoaXMuX2NvcmUubGVhdmUoInBsYXlpbmciKSx0aGlzLl9jb3JlLnRyaWdnZXIoInN0b3BwZWQiLG51bGwsInZpZGVvIil9LGUucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oYil7dmFyIGMsZD1hKGIudGFyZ2V0KSxlPWQuY2xvc2VzdCgiLiIrdGhpcy5fY29yZS5zZXR0aW5ncy5pdGVtQ2xhc3MpLGY9dGhpcy5fdmlkZW9zW2UuYXR0cigiZGF0YS12aWRlbyIpXSxnPWYud2lkdGh8fCIxMDAlIixoPWYuaGVpZ2h0fHx0aGlzLl9jb3JlLiRzdGFnZS5oZWlnaHQoKTt0aGlzLl9wbGF5aW5nfHwodGhpcy5fY29yZS5lbnRlcigicGxheWluZyIpLHRoaXMuX2NvcmUudHJpZ2dlcigicGxheSIsbnVsbCwidmlkZW8iKSxlPXRoaXMuX2NvcmUuaXRlbXModGhpcy5fY29yZS5yZWxhdGl2ZShlLmluZGV4KCkpKSx0aGlzLl9jb3JlLnJlc2V0KGUuaW5kZXgoKSksYz1hKCc8aWZyYW1lIGZyYW1lYm9yZGVyPSIwIiBhbGxvd2Z1bGxzY3JlZW4gbW96YWxsb3dmdWxsc2NyZWVuIHdlYmtpdEFsbG93RnVsbFNjcmVlbiA+PC9pZnJhbWU+JyksYy5hdHRyKCJoZWlnaHQiLGgpLGMuYXR0cigid2lkdGgiLGcpLCJ5b3V0dWJlIj09PWYudHlwZT9jLmF0dHIoInNyYyIsIi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyIrZi5pZCsiP2F1dG9wbGF5PTEmcmVsPTAmdj0iK2YuaWQpOiJ2aW1lbyI9PT1mLnR5cGU/Yy5hdHRyKCJzcmMiLCIvL3BsYXllci52aW1lby5jb20vdmlkZW8vIitmLmlkKyI/YXV0b3BsYXk9MSIpOiJ2emFhciI9PT1mLnR5cGUmJmMuYXR0cigic3JjIiwiLy92aWV3LnZ6YWFyLmNvbS8iK2YuaWQrIi9wbGF5ZXI/YXV0b3BsYXk9dHJ1ZSIpLGEoYykud3JhcCgnPGRpdiBjbGFzcz0ib3dsLXZpZGVvLWZyYW1lIiAvPicpLmluc2VydEFmdGVyKGUuZmluZCgiLm93bC12aWRlbyIpKSx0aGlzLl9wbGF5aW5nPWUuYWRkQ2xhc3MoIm93bC12aWRlby1wbGF5aW5nIikpfSxlLnByb3RvdHlwZS5pc0luRnVsbFNjcmVlbj1mdW5jdGlvbigpe3ZhciBiPWMuZnVsbHNjcmVlbkVsZW1lbnR8fGMubW96RnVsbFNjcmVlbkVsZW1lbnR8fGMud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQ7cmV0dXJuIGImJmEoYikucGFyZW50KCkuaGFzQ2xhc3MoIm93bC12aWRlby1mcmFtZSIpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGEsYjt0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZigiY2xpY2sub3dsLnZpZGVvIik7Zm9yKGEgaW4gdGhpcy5faGFuZGxlcnMpdGhpcy5fY29yZS4kZWxlbWVudC5vZmYoYSx0aGlzLl9oYW5kbGVyc1thXSk7Zm9yKGIgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXNbYl0mJih0aGlzW2JdPW51bGwpfSxhLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuVmlkZW89ZX0od2luZG93LlplcHRvfHx3aW5kb3cualF1ZXJ5LHdpbmRvdyxkb2N1bWVudCksZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYil7dGhpcy5jb3JlPWIsdGhpcy5jb3JlLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyx0aGlzLmNvcmUub3B0aW9ucyksdGhpcy5zd2FwcGluZz0hMCx0aGlzLnByZXZpb3VzPWQsdGhpcy5uZXh0PWQsdGhpcy5oYW5kbGVycz17ImNoYW5nZS5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJiJwb3NpdGlvbiI9PWEucHJvcGVydHkubmFtZSYmKHRoaXMucHJldmlvdXM9dGhpcy5jb3JlLmN1cnJlbnQoKSx0aGlzLm5leHQ9YS5wcm9wZXJ0eS52YWx1ZSl9LHRoaXMpLCJkcmFnLm93bC5jYXJvdXNlbCBkcmFnZ2VkLm93bC5jYXJvdXNlbCB0cmFuc2xhdGVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmKHRoaXMuc3dhcHBpbmc9InRyYW5zbGF0ZWQiPT1hLnR5cGUpfSx0aGlzKSwidHJhbnNsYXRlLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5zd2FwcGluZyYmKHRoaXMuY29yZS5vcHRpb25zLmFuaW1hdGVPdXR8fHRoaXMuY29yZS5vcHRpb25zLmFuaW1hdGVJbikmJnRoaXMuc3dhcCgpfSx0aGlzKX0sdGhpcy5jb3JlLiRlbGVtZW50Lm9uKHRoaXMuaGFuZGxlcnMpfTtlLkRlZmF1bHRzPXthbmltYXRlT3V0OiExLGFuaW1hdGVJbjohMX0sZS5wcm90b3R5cGUuc3dhcD1mdW5jdGlvbigpe2lmKDE9PT10aGlzLmNvcmUuc2V0dGluZ3MuaXRlbXMmJmEuc3VwcG9ydC5hbmltYXRpb24mJmEuc3VwcG9ydC50cmFuc2l0aW9uKXt0aGlzLmNvcmUuc3BlZWQoMCk7dmFyIGIsYz1hLnByb3h5KHRoaXMuY2xlYXIsdGhpcyksZD10aGlzLmNvcmUuJHN0YWdlLmNoaWxkcmVuKCkuZXEodGhpcy5wcmV2aW91cyksZT10aGlzLmNvcmUuJHN0YWdlLmNoaWxkcmVuKCkuZXEodGhpcy5uZXh0KSxmPXRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlSW4sZz10aGlzLmNvcmUuc2V0dGluZ3MuYW5pbWF0ZU91dDt0aGlzLmNvcmUuY3VycmVudCgpIT09dGhpcy5wcmV2aW91cyYmKGcmJihiPXRoaXMuY29yZS5jb29yZGluYXRlcyh0aGlzLnByZXZpb3VzKS10aGlzLmNvcmUuY29vcmRpbmF0ZXModGhpcy5uZXh0KSxkLm9uZShhLnN1cHBvcnQuYW5pbWF0aW9uLmVuZCxjKS5jc3Moe2xlZnQ6YisicHgifSkuYWRkQ2xhc3MoImFuaW1hdGVkIG93bC1hbmltYXRlZC1vdXQiKS5hZGRDbGFzcyhnKSksZiYmZS5vbmUoYS5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsYykuYWRkQ2xhc3MoImFuaW1hdGVkIG93bC1hbmltYXRlZC1pbiIpLmFkZENsYXNzKGYpKX19LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKGIpe2EoYi50YXJnZXQpLmNzcyh7bGVmdDoiIn0pLnJlbW92ZUNsYXNzKCJhbmltYXRlZCBvd2wtYW5pbWF0ZWQtb3V0IG93bC1hbmltYXRlZC1pbiIpLnJlbW92ZUNsYXNzKHRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlSW4pLnJlbW92ZUNsYXNzKHRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlT3V0KSx0aGlzLmNvcmUub25UcmFuc2l0aW9uRW5kKCl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYSxiO2ZvcihhIGluIHRoaXMuaGFuZGxlcnMpdGhpcy5jb3JlLiRlbGVtZW50Lm9mZihhLHRoaXMuaGFuZGxlcnNbYV0pO2ZvcihiIGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzW2JdJiYodGhpc1tiXT1udWxsKX0sYS5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLkFuaW1hdGU9ZX0od2luZG93LlplcHRvfHx3aW5kb3cualF1ZXJ5LHdpbmRvdyxkb2N1bWVudCksZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYil7dGhpcy5fY29yZT1iLHRoaXMuX2NhbGw9bnVsbCx0aGlzLl90aW1lPTAsdGhpcy5fdGltZW91dD0wLHRoaXMuX3BhdXNlZD0hMCx0aGlzLl9oYW5kbGVycz17ImNoYW5nZWQub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiYic2V0dGluZ3MiPT09YS5wcm9wZXJ0eS5uYW1lP3RoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXk/dGhpcy5wbGF5KCk6dGhpcy5zdG9wKCk6YS5uYW1lc3BhY2UmJiJwb3NpdGlvbiI9PT1hLnByb3BlcnR5Lm5hbWUmJnRoaXMuX3BhdXNlZCYmKHRoaXMuX3RpbWU9MCl9LHRoaXMpLCJpbml0aWFsaXplZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXkmJnRoaXMucGxheSgpfSx0aGlzKSwicGxheS5vd2wuYXV0b3BsYXkiOmEucHJveHkoZnVuY3Rpb24oYSxiLGMpe2EubmFtZXNwYWNlJiZ0aGlzLnBsYXkoYixjKX0sdGhpcyksInN0b3Aub3dsLmF1dG9wbGF5IjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLnN0b3AoKX0sdGhpcyksIm1vdXNlb3Zlci5vd2wuYXV0b3BsYXkiOmEucHJveHkoZnVuY3Rpb24oKXt0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5SG92ZXJQYXVzZSYmdGhpcy5fY29yZS5pcygicm90YXRpbmciKSYmdGhpcy5wYXVzZSgpfSx0aGlzKSwibW91c2VsZWF2ZS5vd2wuYXV0b3BsYXkiOmEucHJveHkoZnVuY3Rpb24oKXt0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5SG92ZXJQYXVzZSYmdGhpcy5fY29yZS5pcygicm90YXRpbmciKSYmdGhpcy5wbGF5KCl9LHRoaXMpLCJ0b3VjaHN0YXJ0Lm93bC5jb3JlIjphLnByb3h5KGZ1bmN0aW9uKCl7dGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheUhvdmVyUGF1c2UmJnRoaXMuX2NvcmUuaXMoInJvdGF0aW5nIikmJnRoaXMucGF1c2UoKX0sdGhpcyksInRvdWNoZW5kLm93bC5jb3JlIjphLnByb3h5KGZ1bmN0aW9uKCl7dGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheUhvdmVyUGF1c2UmJnRoaXMucGxheSgpfSx0aGlzKX0sdGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyksdGhpcy5fY29yZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuRGVmYXVsdHMsdGhpcy5fY29yZS5vcHRpb25zKX07ZS5EZWZhdWx0cz17YXV0b3BsYXk6ITEsYXV0b3BsYXlUaW1lb3V0OjVlMyxhdXRvcGxheUhvdmVyUGF1c2U6ITEsYXV0b3BsYXlTcGVlZDohMX0sZS5wcm90b3R5cGUuX25leHQ9ZnVuY3Rpb24oZCl7dGhpcy5fY2FsbD1iLnNldFRpbWVvdXQoYS5wcm94eSh0aGlzLl9uZXh0LHRoaXMsZCksdGhpcy5fdGltZW91dCooTWF0aC5yb3VuZCh0aGlzLnJlYWQoKS90aGlzLl90aW1lb3V0KSsxKS10aGlzLnJlYWQoKSksdGhpcy5fY29yZS5pcygiaW50ZXJhY3RpbmciKXx8Yy5oaWRkZW58fHRoaXMuX2NvcmUubmV4dChkfHx0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5U3BlZWQpfSxlLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fdGltZX0sZS5wcm90b3R5cGUucGxheT1mdW5jdGlvbihjLGQpe3ZhciBlO3RoaXMuX2NvcmUuaXMoInJvdGF0aW5nIil8fHRoaXMuX2NvcmUuZW50ZXIoInJvdGF0aW5nIiksYz1jfHx0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5VGltZW91dCxlPU1hdGgubWluKHRoaXMuX3RpbWUlKHRoaXMuX3RpbWVvdXR8fGMpLGMpLHRoaXMuX3BhdXNlZD8odGhpcy5fdGltZT10aGlzLnJlYWQoKSx0aGlzLl9wYXVzZWQ9ITEpOmIuY2xlYXJUaW1lb3V0KHRoaXMuX2NhbGwpLHRoaXMuX3RpbWUrPXRoaXMucmVhZCgpJWMtZSx0aGlzLl90aW1lb3V0PWMsdGhpcy5fY2FsbD1iLnNldFRpbWVvdXQoYS5wcm94eSh0aGlzLl9uZXh0LHRoaXMsZCksYy1lKX0sZS5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbigpe3RoaXMuX2NvcmUuaXMoInJvdGF0aW5nIikmJih0aGlzLl90aW1lPTAsdGhpcy5fcGF1c2VkPSEwLGIuY2xlYXJUaW1lb3V0KHRoaXMuX2NhbGwpLHRoaXMuX2NvcmUubGVhdmUoInJvdGF0aW5nIikpfSxlLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuX2NvcmUuaXMoInJvdGF0aW5nIikmJiF0aGlzLl9wYXVzZWQmJih0aGlzLl90aW1lPXRoaXMucmVhZCgpLHRoaXMuX3BhdXNlZD0hMCxiLmNsZWFyVGltZW91dCh0aGlzLl9jYWxsKSl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYSxiO3RoaXMuc3RvcCgpO2ZvcihhIGluIHRoaXMuX2hhbmRsZXJzKXRoaXMuX2NvcmUuJGVsZW1lbnQub2ZmKGEsdGhpcy5faGFuZGxlcnNbYV0pO2ZvcihiIGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzW2JdJiYodGhpc1tiXT1udWxsKX0sYS5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLmF1dG9wbGF5PWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1mdW5jdGlvbihiKXt0aGlzLl9jb3JlPWIsdGhpcy5faW5pdGlhbGl6ZWQ9ITEsdGhpcy5fcGFnZXM9W10sdGhpcy5fY29udHJvbHM9e30sdGhpcy5fdGVtcGxhdGVzPVtdLHRoaXMuJGVsZW1lbnQ9dGhpcy5fY29yZS4kZWxlbWVudCx0aGlzLl9vdmVycmlkZXM9e25leHQ6dGhpcy5fY29yZS5uZXh0LHByZXY6dGhpcy5fY29yZS5wcmV2LHRvOnRoaXMuX2NvcmUudG99LHRoaXMuX2hhbmRsZXJzPXsicHJlcGFyZWQub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGIpe2IubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLmRvdHNEYXRhJiZ0aGlzLl90ZW1wbGF0ZXMucHVzaCgnPGRpdiBjbGFzcz0iJyt0aGlzLl9jb3JlLnNldHRpbmdzLmRvdENsYXNzKyciPicrYShiLmNvbnRlbnQpLmZpbmQoIltkYXRhLWRvdF0iKS5hZGRCYWNrKCJbZGF0YS1kb3RdIikuYXR0cigiZGF0YS1kb3QiKSsiPC9kaXY+Iil9LHRoaXMpLCJhZGRlZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuc2V0dGluZ3MuZG90c0RhdGEmJnRoaXMuX3RlbXBsYXRlcy5zcGxpY2UoYS5wb3NpdGlvbiwwLHRoaXMuX3RlbXBsYXRlcy5wb3AoKSl9LHRoaXMpLCJyZW1vdmUub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLmRvdHNEYXRhJiZ0aGlzLl90ZW1wbGF0ZXMuc3BsaWNlKGEucG9zaXRpb24sMSl9LHRoaXMpLCJjaGFuZ2VkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmInBvc2l0aW9uIj09YS5wcm9wZXJ0eS5uYW1lJiZ0aGlzLmRyYXcoKX0sdGhpcyksImluaXRpYWxpemVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmIXRoaXMuX2luaXRpYWxpemVkJiYodGhpcy5fY29yZS50cmlnZ2VyKCJpbml0aWFsaXplIixudWxsLCJuYXZpZ2F0aW9uIiksdGhpcy5pbml0aWFsaXplKCksdGhpcy51cGRhdGUoKSx0aGlzLmRyYXcoKSx0aGlzLl9pbml0aWFsaXplZD0hMCx0aGlzLl9jb3JlLnRyaWdnZXIoImluaXRpYWxpemVkIixudWxsLCJuYXZpZ2F0aW9uIikpfSx0aGlzKSwicmVmcmVzaGVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5faW5pdGlhbGl6ZWQmJih0aGlzLl9jb3JlLnRyaWdnZXIoInJlZnJlc2giLG51bGwsIm5hdmlnYXRpb24iKSx0aGlzLnVwZGF0ZSgpLHRoaXMuZHJhdygpLHRoaXMuX2NvcmUudHJpZ2dlcigicmVmcmVzaGVkIixudWxsLCJuYXZpZ2F0aW9uIikpfSx0aGlzKX0sdGhpcy5fY29yZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuRGVmYXVsdHMsdGhpcy5fY29yZS5vcHRpb25zKSx0aGlzLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKX07ZS5EZWZhdWx0cz17bmF2OiExLG5hdlRleHQ6Wyc8c3BhbiBhcmlhLWxhYmVsPSJQcmV2aW91cyI+JiN4MjAzOTs8L3NwYW4+JywnPHNwYW4gYXJpYS1sYWJlbD0iTmV4dCI+JiN4MjAzYTs8L3NwYW4+J10sbmF2U3BlZWQ6ITEsbmF2RWxlbWVudDonYnV0dG9uIHR5cGU9ImJ1dHRvbiIgcm9sZT0icHJlc2VudGF0aW9uIicsbmF2Q29udGFpbmVyOiExLG5hdkNvbnRhaW5lckNsYXNzOiJvd2wtbmF2IixuYXZDbGFzczpbIm93bC1wcmV2Iiwib3dsLW5leHQiXSxzbGlkZUJ5OjEsZG90Q2xhc3M6Im93bC1kb3QiLGRvdHNDbGFzczoib3dsLWRvdHMiLGRvdHM6ITAsZG90c0VhY2g6ITEsZG90c0RhdGE6ITEsZG90c1NwZWVkOiExLGRvdHNDb250YWluZXI6ITF9LGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXt2YXIgYixjPXRoaXMuX2NvcmUuc2V0dGluZ3M7dGhpcy5fY29udHJvbHMuJHJlbGF0aXZlPShjLm5hdkNvbnRhaW5lcj9hKGMubmF2Q29udGFpbmVyKTphKCI8ZGl2PiIpLmFkZENsYXNzKGMubmF2Q29udGFpbmVyQ2xhc3MpLmFwcGVuZFRvKHRoaXMuJGVsZW1lbnQpKS5hZGRDbGFzcygiZGlzYWJsZWQiKSx0aGlzLl9jb250cm9scy4kcHJldmlvdXM9YSgiPCIrYy5uYXZFbGVtZW50KyI+IikuYWRkQ2xhc3MoYy5uYXZDbGFzc1swXSkuaHRtbChjLm5hdlRleHRbMF0pLnByZXBlbmRUbyh0aGlzLl9jb250cm9scy4kcmVsYXRpdmUpLm9uKCJjbGljayIsYS5wcm94eShmdW5jdGlvbihhKXt0aGlzLnByZXYoYy5uYXZTcGVlZCl9LHRoaXMpKSx0aGlzLl9jb250cm9scy4kbmV4dD1hKCI8IitjLm5hdkVsZW1lbnQrIj4iKS5hZGRDbGFzcyhjLm5hdkNsYXNzWzFdKS5odG1sKGMubmF2VGV4dFsxXSkuYXBwZW5kVG8odGhpcy5fY29udHJvbHMuJHJlbGF0aXZlKS5vbigiY2xpY2siLGEucHJveHkoZnVuY3Rpb24oYSl7dGhpcy5uZXh0KGMubmF2U3BlZWQpfSx0aGlzKSksYy5kb3RzRGF0YXx8KHRoaXMuX3RlbXBsYXRlcz1bYSgnPGJ1dHRvbiByb2xlPSJidXR0b24iPicpLmFkZENsYXNzKGMuZG90Q2xhc3MpLmFwcGVuZChhKCI8c3Bhbj4iKSkucHJvcCgib3V0ZXJIVE1MIildKSx0aGlzLl9jb250cm9scy4kYWJzb2x1dGU9KGMuZG90c0NvbnRhaW5lcj9hKGMuZG90c0NvbnRhaW5lcik6YSgiPGRpdj4iKS5hZGRDbGFzcyhjLmRvdHNDbGFzcykuYXBwZW5kVG8odGhpcy4kZWxlbWVudCkpLmFkZENsYXNzKCJkaXNhYmxlZCIpLHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5vbigiY2xpY2siLCJidXR0b24iLGEucHJveHkoZnVuY3Rpb24oYil7dmFyIGQ9YShiLnRhcmdldCkucGFyZW50KCkuaXModGhpcy5fY29udHJvbHMuJGFic29sdXRlKT9hKGIudGFyZ2V0KS5pbmRleCgpOmEoYi50YXJnZXQpLnBhcmVudCgpLmluZGV4KCk7Yi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMudG8oZCxjLmRvdHNTcGVlZCl9LHRoaXMpKTtmb3IoYiBpbiB0aGlzLl9vdmVycmlkZXMpdGhpcy5fY29yZVtiXT1hLnByb3h5KHRoaXNbYl0sdGhpcyl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlO2U9dGhpcy5fY29yZS5zZXR0aW5ncztmb3IoYSBpbiB0aGlzLl9oYW5kbGVycyl0aGlzLiRlbGVtZW50Lm9mZihhLHRoaXMuX2hhbmRsZXJzW2FdKTtmb3IoYiBpbiB0aGlzLl9jb250cm9scykiJHJlbGF0aXZlIj09PWImJmUubmF2Q29udGFpbmVyP3RoaXMuX2NvbnRyb2xzW2JdLmh0bWwoIiIpOnRoaXMuX2NvbnRyb2xzW2JdLnJlbW92ZSgpO2ZvcihkIGluIHRoaXMub3ZlcmlkZXMpdGhpcy5fY29yZVtkXT10aGlzLl9vdmVycmlkZXNbZF07Zm9yKGMgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXNbY10mJih0aGlzW2NdPW51bGwpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZD10aGlzLl9jb3JlLmNsb25lcygpLmxlbmd0aC8yLGU9ZCt0aGlzLl9jb3JlLml0ZW1zKCkubGVuZ3RoLGY9dGhpcy5fY29yZS5tYXhpbXVtKCEwKSxnPXRoaXMuX2NvcmUuc2V0dGluZ3MsaD1nLmNlbnRlcnx8Zy5hdXRvV2lkdGh8fGcuZG90c0RhdGE/MTpnLmRvdHNFYWNofHxnLml0ZW1zO2lmKCJwYWdlIiE9PWcuc2xpZGVCeSYmKGcuc2xpZGVCeT1NYXRoLm1pbihnLnNsaWRlQnksZy5pdGVtcykpLGcuZG90c3x8InBhZ2UiPT1nLnNsaWRlQnkpZm9yKHRoaXMuX3BhZ2VzPVtdLGE9ZCxiPTAsYz0wO2E8ZTthKyspe2lmKGI+PWh8fDA9PT1iKXtpZih0aGlzLl9wYWdlcy5wdXNoKHtzdGFydDpNYXRoLm1pbihmLGEtZCksZW5kOmEtZCtoLTF9KSxNYXRoLm1pbihmLGEtZCk9PT1mKWJyZWFrO2I9MCwrK2N9Yis9dGhpcy5fY29yZS5tZXJnZXJzKHRoaXMuX2NvcmUucmVsYXRpdmUoYSkpfX0sZS5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbigpe3ZhciBiLGM9dGhpcy5fY29yZS5zZXR0aW5ncyxkPXRoaXMuX2NvcmUuaXRlbXMoKS5sZW5ndGg8PWMuaXRlbXMsZT10aGlzLl9jb3JlLnJlbGF0aXZlKHRoaXMuX2NvcmUuY3VycmVudCgpKSxmPWMubG9vcHx8Yy5yZXdpbmQ7dGhpcy5fY29udHJvbHMuJHJlbGF0aXZlLnRvZ2dsZUNsYXNzKCJkaXNhYmxlZCIsIWMubmF2fHxkKSxjLm5hdiYmKHRoaXMuX2NvbnRyb2xzLiRwcmV2aW91cy50b2dnbGVDbGFzcygiZGlzYWJsZWQiLCFmJiZlPD10aGlzLl9jb3JlLm1pbmltdW0oITApKSx0aGlzLl9jb250cm9scy4kbmV4dC50b2dnbGVDbGFzcygiZGlzYWJsZWQiLCFmJiZlPj10aGlzLl9jb3JlLm1heGltdW0oITApKSksdGhpcy5fY29udHJvbHMuJGFic29sdXRlLnRvZ2dsZUNsYXNzKCJkaXNhYmxlZCIsIWMuZG90c3x8ZCksYy5kb3RzJiYoYj10aGlzLl9wYWdlcy5sZW5ndGgtdGhpcy5fY29udHJvbHMuJGFic29sdXRlLmNoaWxkcmVuKCkubGVuZ3RoLGMuZG90c0RhdGEmJjAhPT1iP3RoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5odG1sKHRoaXMuX3RlbXBsYXRlcy5qb2luKCIiKSk6Yj4wP3RoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5hcHBlbmQobmV3IEFycmF5KGIrMSkuam9pbih0aGlzLl90ZW1wbGF0ZXNbMF0pKTpiPDAmJnRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5jaGlsZHJlbigpLnNsaWNlKGIpLnJlbW92ZSgpLHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5maW5kKCIuYWN0aXZlIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5jaGlsZHJlbigpLmVxKGEuaW5BcnJheSh0aGlzLmN1cnJlbnQoKSx0aGlzLl9wYWdlcykpLmFkZENsYXNzKCJhY3RpdmUiKSl9LGUucHJvdG90eXBlLm9uVHJpZ2dlcj1mdW5jdGlvbihiKXt2YXIgYz10aGlzLl9jb3JlLnNldHRpbmdzO2IucGFnZT17aW5kZXg6YS5pbkFycmF5KHRoaXMuY3VycmVudCgpLHRoaXMuX3BhZ2VzKSxjb3VudDp0aGlzLl9wYWdlcy5sZW5ndGgsc2l6ZTpjJiYoYy5jZW50ZXJ8fGMuYXV0b1dpZHRofHxjLmRvdHNEYXRhPzE6Yy5kb3RzRWFjaHx8Yy5pdGVtcyl9fSxlLnByb3RvdHlwZS5jdXJyZW50PWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fY29yZS5yZWxhdGl2ZSh0aGlzLl9jb3JlLmN1cnJlbnQoKSk7cmV0dXJuIGEuZ3JlcCh0aGlzLl9wYWdlcyxhLnByb3h5KGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuc3RhcnQ8PWImJmEuZW5kPj1ifSx0aGlzKSkucG9wKCl9LGUucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKGIpe3ZhciBjLGQsZT10aGlzLl9jb3JlLnNldHRpbmdzO3JldHVybiJwYWdlIj09ZS5zbGlkZUJ5PyhjPWEuaW5BcnJheSh0aGlzLmN1cnJlbnQoKSx0aGlzLl9wYWdlcyksZD10aGlzLl9wYWdlcy5sZW5ndGgsYj8rK2M6LS1jLGM9dGhpcy5fcGFnZXNbKGMlZCtkKSVkXS5zdGFydCk6KGM9dGhpcy5fY29yZS5yZWxhdGl2ZSh0aGlzLl9jb3JlLmN1cnJlbnQoKSksZD10aGlzLl9jb3JlLml0ZW1zKCkubGVuZ3RoLGI/Yys9ZS5zbGlkZUJ5OmMtPWUuc2xpZGVCeSksY30sZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbihiKXthLnByb3h5KHRoaXMuX292ZXJyaWRlcy50byx0aGlzLl9jb3JlKSh0aGlzLmdldFBvc2l0aW9uKCEwKSxiKX0sZS5wcm90b3R5cGUucHJldj1mdW5jdGlvbihiKXthLnByb3h5KHRoaXMuX292ZXJyaWRlcy50byx0aGlzLl9jb3JlKSh0aGlzLmdldFBvc2l0aW9uKCExKSxiKX0sZS5wcm90b3R5cGUudG89ZnVuY3Rpb24oYixjLGQpe3ZhciBlOyFkJiZ0aGlzLl9wYWdlcy5sZW5ndGg/KGU9dGhpcy5fcGFnZXMubGVuZ3RoLGEucHJveHkodGhpcy5fb3ZlcnJpZGVzLnRvLHRoaXMuX2NvcmUpKHRoaXMuX3BhZ2VzWyhiJWUrZSklZV0uc3RhcnQsYykpOmEucHJveHkodGhpcy5fb3ZlcnJpZGVzLnRvLHRoaXMuX2NvcmUpKGIsYyl9LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5OYXZpZ2F0aW9uPWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1mdW5jdGlvbihjKXt0aGlzLl9jb3JlPWMsdGhpcy5faGFzaGVzPXt9LHRoaXMuJGVsZW1lbnQ9dGhpcy5fY29yZS4kZWxlbWVudCx0aGlzLl9oYW5kbGVycz17ImluaXRpYWxpemVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihjKXtjLm5hbWVzcGFjZSYmIlVSTEhhc2giPT09dGhpcy5fY29yZS5zZXR0aW5ncy5zdGFydFBvc2l0aW9uJiZhKGIpLnRyaWdnZXIoImhhc2hjaGFuZ2Uub3dsLm5hdmlnYXRpb24iKX0sdGhpcyksInByZXBhcmVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihiKXtpZihiLm5hbWVzcGFjZSl7dmFyIGM9YShiLmNvbnRlbnQpLmZpbmQoIltkYXRhLWhhc2hdIikuYWRkQmFjaygiW2RhdGEtaGFzaF0iKS5hdHRyKCJkYXRhLWhhc2giKTtpZighYylyZXR1cm47dGhpcy5faGFzaGVzW2NdPWIuY29udGVudH19LHRoaXMpLCJjaGFuZ2VkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihjKXtpZihjLm5hbWVzcGFjZSYmInBvc2l0aW9uIj09PWMucHJvcGVydHkubmFtZSl7dmFyIGQ9dGhpcy5fY29yZS5pdGVtcyh0aGlzLl9jb3JlLnJlbGF0aXZlKHRoaXMuX2NvcmUuY3VycmVudCgpKSksZT1hLm1hcCh0aGlzLl9oYXNoZXMsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWQ/YjpudWxsfSkuam9pbigpO2lmKCFlfHxiLmxvY2F0aW9uLmhhc2guc2xpY2UoMSk9PT1lKXJldHVybjtiLmxvY2F0aW9uLmhhc2g9ZX19LHRoaXMpfSx0aGlzLl9jb3JlLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyx0aGlzLl9jb3JlLm9wdGlvbnMpLHRoaXMuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpLGEoYikub24oImhhc2hjaGFuZ2Uub3dsLm5hdmlnYXRpb24iLGEucHJveHkoZnVuY3Rpb24oYSl7dmFyIGM9Yi5sb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSxlPXRoaXMuX2NvcmUuJHN0YWdlLmNoaWxkcmVuKCksZj10aGlzLl9oYXNoZXNbY10mJmUuaW5kZXgodGhpcy5faGFzaGVzW2NdKTtmIT09ZCYmZiE9PXRoaXMuX2NvcmUuY3VycmVudCgpJiZ0aGlzLl9jb3JlLnRvKHRoaXMuX2NvcmUucmVsYXRpdmUoZiksITEsITApfSx0aGlzKSl9O2UuRGVmYXVsdHM9e1VSTGhhc2hMaXN0ZW5lcjohMX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBjLGQ7YShiKS5vZmYoImhhc2hjaGFuZ2Uub3dsLm5hdmlnYXRpb24iKTtmb3IoYyBpbiB0aGlzLl9oYW5kbGVycyl0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihjLHRoaXMuX2hhbmRsZXJzW2NdKTtmb3IoZCBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkiZnVuY3Rpb24iIT10eXBlb2YgdGhpc1tkXSYmKHRoaXNbZF09bnVsbCl9LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5IYXNoPWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGUoYixjKXt2YXIgZT0hMSxmPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKTtyZXR1cm4gYS5lYWNoKChiKyIgIitoLmpvaW4oZisiICIpK2YpLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtpZihnW2JdIT09ZClyZXR1cm4gZT0hY3x8YiwhMX0pLGV9ZnVuY3Rpb24gZihhKXtyZXR1cm4gZShhLCEwKX12YXIgZz1hKCI8c3VwcG9ydD4iKS5nZXQoMCkuc3R5bGUsaD0iV2Via2l0IE1veiBPIG1zIi5zcGxpdCgiICIpLGk9e3RyYW5zaXRpb246e2VuZDp7V2Via2l0VHJhbnNpdGlvbjoid2Via2l0VHJhbnNpdGlvbkVuZCIsTW96VHJhbnNpdGlvbjoidHJhbnNpdGlvbmVuZCIsT1RyYW5zaXRpb246Im9UcmFuc2l0aW9uRW5kIix0cmFuc2l0aW9uOiJ0cmFuc2l0aW9uZW5kIn19LGFuaW1hdGlvbjp7ZW5kOntXZWJraXRBbmltYXRpb246IndlYmtpdEFuaW1hdGlvbkVuZCIsTW96QW5pbWF0aW9uOiJhbmltYXRpb25lbmQiLE9BbmltYXRpb246Im9BbmltYXRpb25FbmQiLGFuaW1hdGlvbjoiYW5pbWF0aW9uZW5kIn19fSxqPXtjc3N0cmFuc2Zvcm1zOmZ1bmN0aW9uKCl7cmV0dXJuISFlKCJ0cmFuc2Zvcm0iKX0sY3NzdHJhbnNmb3JtczNkOmZ1bmN0aW9uKCl7cmV0dXJuISFlKCJwZXJzcGVjdGl2ZSIpfSxjc3N0cmFuc2l0aW9uczpmdW5jdGlvbigpe3JldHVybiEhZSgidHJhbnNpdGlvbiIpfSxjc3NhbmltYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuISFlKCJhbmltYXRpb24iKX19O2ouY3NzdHJhbnNpdGlvbnMoKSYmKGEuc3VwcG9ydC50cmFuc2l0aW9uPW5ldyBTdHJpbmcoZigidHJhbnNpdGlvbiIpKSxhLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQ9aS50cmFuc2l0aW9uLmVuZFthLnN1cHBvcnQudHJhbnNpdGlvbl0pLGouY3NzYW5pbWF0aW9ucygpJiYoYS5zdXBwb3J0LmFuaW1hdGlvbj1uZXcgU3RyaW5nKGYoImFuaW1hdGlvbiIpKSxhLnN1cHBvcnQuYW5pbWF0aW9uLmVuZD1pLmFuaW1hdGlvbi5lbmRbYS5zdXBwb3J0LmFuaW1hdGlvbl0pLGouY3NzdHJhbnNmb3JtcygpJiYoYS5zdXBwb3J0LnRyYW5zZm9ybT1uZXcgU3RyaW5nKGYoInRyYW5zZm9ybSIpKSxhLnN1cHBvcnQudHJhbnNmb3JtM2Q9ai5jc3N0cmFuc2Zvcm1zM2QoKSl9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpO3ZhciB3aW5kb3dXaWR0aD13aW5kb3cuaW5uZXJXaWR0aDt2YXIgYmxvZ1Bvc3RNZXRhQXRCb3R0b209ITE7JChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXtwbGFjZUJsb2dQb3N0TWV0YSgpOyQod2luZG93KS5vbigncmVzaXplJyxmdW5jdGlvbigpe3dpbmRvd1dpZHRoPXdpbmRvdy5pbm5lcldpZHRoO3BsYWNlQmxvZ1Bvc3RNZXRhKCl9KX0pO2Z1bmN0aW9uIHBsYWNlQmxvZ1Bvc3RNZXRhKCl7dmFyIGJsb2dNZXRhQm94PSQoJyNibG9nLXBvc3QtbWV0YScpO2lmKGJsb2dNZXRhQm94Lmxlbmd0aD4wKXtpZih3aW5kb3dXaWR0aDw5OTIpe2lmKGJsb2dQb3N0TWV0YUF0Qm90dG9tPT09ITEpeyQoJyNibG9nLXBvc3QtbWV0YS1jb250YWluZXItbW9iaWxlJykuYXBwZW5kKGJsb2dNZXRhQm94KTtibG9nUG9zdE1ldGFBdEJvdHRvbT0hMH19ZWxzZXtpZihibG9nUG9zdE1ldGFBdEJvdHRvbT09PSEwKXskKCcjYmxvZy1wb3N0LW1ldGEtY29udGFpbmVyJykuYXBwZW5kKGJsb2dNZXRhQm94KTtibG9nUG9zdE1ldGFBdEJvdHRvbT0hMX19fX07JChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXt2YXIgcmVmYnk9JCgnaW5wdXRbbmFtZT1yZWZieV0nKTtpZihyZWZieS5sZW5ndGg+MCl7cmVmYnkudmFsKGRvY3VtZW50LnJlZmVycmVyKX19KTsoZnVuY3Rpb24oJCl7JC5mbG9hdFRoZWFkPSQuZmxvYXRUaGVhZHx8e307JC5mbG9hdFRoZWFkLmRlZmF1bHRzPXtoZWFkZXJDZWxsU2VsZWN0b3I6J3RyOnZpc2libGU6Zmlyc3Q+Kjp2aXNpYmxlJyx6SW5kZXg6MTAwMSxwb3NpdGlvbjonYXV0bycsdG9wOjAsYm90dG9tOjAsc2Nyb2xsQ29udGFpbmVyOmZ1bmN0aW9uKCR0YWJsZSl7cmV0dXJuICQoW10pfSxyZXNwb25zaXZlQ29udGFpbmVyOmZ1bmN0aW9uKCR0YWJsZSl7cmV0dXJuICQoW10pfSxnZXRTaXppbmdSb3c6ZnVuY3Rpb24oJHRhYmxlLCRjb2xzLCRmdGhDZWxscyl7cmV0dXJuICR0YWJsZS5maW5kKCd0Ym9keSB0cjp2aXNpYmxlOmZpcnN0Pio6dmlzaWJsZScpfSxmbG9hdFRhYmxlQ2xhc3M6J2Zsb2F0VGhlYWQtdGFibGUnLGZsb2F0V3JhcHBlckNsYXNzOidmbG9hdFRoZWFkLXdyYXBwZXInLGZsb2F0Q29udGFpbmVyQ2xhc3M6J2Zsb2F0VGhlYWQtY29udGFpbmVyJyxjb3B5VGFibGVDbGFzczohMCxlbmFibGVBcmlhOiExLGF1dG9SZWZsb3c6ITEsZGVidWc6ITEsc3VwcG9ydDp7Ym9vdHN0cmFwOiEwLGRhdGF0YWJsZXM6ITAsanF1ZXJ5VUk6ITAscGVyZmVjdFNjcm9sbGJhcjohMH19O3ZhciB1dGlsPXdpbmRvdy5fO3ZhciBjYW5PYnNlcnZlTXV0YXRpb25zPXR5cGVvZiBNdXRhdGlvbk9ic2VydmVyIT09J3VuZGVmaW5lZCc7dmFyIGllVmVyc2lvbj1mdW5jdGlvbigpe2Zvcih2YXIgYT0zLGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYiIpLGM9Yi5hbGx8fFtdO2E9MSthLGIuaW5uZXJIVE1MPSI8IS0tW2lmIGd0IElFICIrYSsiXT48aT48IVtlbmRpZl0tLT4iLGNbMF07KTtyZXR1cm4gNDxhP2E6ZG9jdW1lbnQuZG9jdW1lbnRNb2RlfSgpO3ZhciBpc0ZGPS9HZWNrb1wvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO3ZhciBpc1dlYmtpdD0vV2ViS2l0XC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoIShpZVZlcnNpb258fGlzRkZ8fGlzV2Via2l0KSl7aWVWZXJzaW9uPTExfQp2YXIgaXNUYWJsZVdpZHRoQnVnPWZ1bmN0aW9uKCl7aWYoaXNXZWJraXQpe3ZhciAkdGVzdD0kKCc8ZGl2IHN0eWxlPSJ3aWR0aDowcHgiPjx0YWJsZSBzdHlsZT0ibWF4LXdpZHRoOjEwMCUiPjx0cj48dGg+PGRpdiBzdHlsZT0ibWluLXdpZHRoOjEwMHB4OyI+WDwvZGl2PjwvdGg+PC90cj48L3RhYmxlPjwvZGl2PicpOyQoImJvZHkiKS5hcHBlbmQoJHRlc3QpO3ZhciByZXQ9KCR0ZXN0LmZpbmQoInRhYmxlIikud2lkdGgoKT09MCk7JHRlc3QucmVtb3ZlKCk7cmV0dXJuIHJldH0KcmV0dXJuITF9O3ZhciBjcmVhdGVFbGVtZW50cz0haXNGRiYmIWllVmVyc2lvbjt2YXIgJHdpbmRvdz0kKHdpbmRvdyk7aWYoIXdpbmRvdy5tYXRjaE1lZGlhKXt2YXIgX2JlZm9yZVByaW50PXdpbmRvdy5vbmJlZm9yZXByaW50O3ZhciBfYWZ0ZXJQcmludD13aW5kb3cub25hZnRlcnByaW50O3dpbmRvdy5vbmJlZm9yZXByaW50PWZ1bmN0aW9uKCl7X2JlZm9yZVByaW50JiZfYmVmb3JlUHJpbnQoKTskd2luZG93LnRyaWdnZXJIYW5kbGVyKCJiZWZvcmVwcmludCIpfTt3aW5kb3cub25hZnRlcnByaW50PWZ1bmN0aW9uKCl7X2FmdGVyUHJpbnQmJl9hZnRlclByaW50KCk7JHdpbmRvdy50cmlnZ2VySGFuZGxlcigiYWZ0ZXJwcmludCIpfX0KZnVuY3Rpb24gd2luZG93UmVzaXplKGV2ZW50TmFtZSxjYil7aWYoaWVWZXJzaW9uPT04KXt2YXIgd2luV2lkdGg9JHdpbmRvdy53aWR0aCgpO3ZhciBkZWJvdW5jZWRDYj11dGlsLmRlYm91bmNlKGZ1bmN0aW9uKCl7dmFyIHdpbldpZHRoTmV3PSR3aW5kb3cud2lkdGgoKTtpZih3aW5XaWR0aCE9d2luV2lkdGhOZXcpe3dpbldpZHRoPXdpbldpZHRoTmV3O2NiKCl9fSwxKTskd2luZG93Lm9uKGV2ZW50TmFtZSxkZWJvdW5jZWRDYil9ZWxzZXskd2luZG93Lm9uKGV2ZW50TmFtZSx1dGlsLmRlYm91bmNlKGNiLDEpKX19CmZ1bmN0aW9uIGdldENsb3Nlc3RTY3JvbGxDb250YWluZXIoJGVsZW0pe3ZhciBlbGVtPSRlbGVtWzBdO3ZhciBwYXJlbnQ9ZWxlbS5wYXJlbnRFbGVtZW50O2Rve3ZhciBwb3M9d2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdvdmVyZmxvdycpO2lmKHBvcyE9J3Zpc2libGUnKWJyZWFrfXdoaWxlKHBhcmVudD1wYXJlbnQucGFyZW50RWxlbWVudCk7aWYocGFyZW50PT1kb2N1bWVudC5ib2R5KXtyZXR1cm4gJChbXSl9CnJldHVybiAkKHBhcmVudCl9CmZ1bmN0aW9uIGRlYnVnKHN0cil7d2luZG93JiZ3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUuZXJyb3ImJndpbmRvdy5jb25zb2xlLmVycm9yKCJqUXVlcnkuZmxvYXRUaGVhZDogIitzdHIpfQpmdW5jdGlvbiBnZXRPZmZzZXRXaWR0aChlbCl7dmFyIHJlY3Q9ZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHJlY3Qud2lkdGh8fHJlY3QucmlnaHQtcmVjdC5sZWZ0fQpmdW5jdGlvbiBzY3JvbGxiYXJXaWR0aCgpe3ZhciAkZGl2PSQoJzxkaXYgc3R5bGU9IndpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3cteTpzY3JvbGw7JysncG9zaXRpb246YWJzb2x1dGU7dG9wOi0yMDBweDtsZWZ0Oi0yMDBweDsiPjxkaXYgc3R5bGU9ImhlaWdodDoxMDBweDt3aWR0aDoxMDAlIj4nKyc8L2Rpdj4nKTskKCdib2R5JykuYXBwZW5kKCRkaXYpO3ZhciB3MT0kZGl2LmlubmVyV2lkdGgoKTt2YXIgdzI9JCgnZGl2JywkZGl2KS5pbm5lcldpZHRoKCk7JGRpdi5yZW1vdmUoKTtyZXR1cm4gdzEtdzJ9CmZ1bmN0aW9uIGlzRGF0YXRhYmxlKCR0YWJsZSl7aWYoJHRhYmxlLmRhdGFUYWJsZVNldHRpbmdzKXtmb3IodmFyIGk9MDtpPCR0YWJsZS5kYXRhVGFibGVTZXR0aW5ncy5sZW5ndGg7aSsrKXt2YXIgdGFibGU9JHRhYmxlLmRhdGFUYWJsZVNldHRpbmdzW2ldLm5UYWJsZTtpZigkdGFibGVbMF09PXRhYmxlKXtyZXR1cm4hMH19fQpyZXR1cm4hMX0KZnVuY3Rpb24gdGFibGVXaWR0aCgkdGFibGUsJGZ0aENlbGxzLGlzT3V0ZXIpe3ZhciBmbj1pc091dGVyPyJvdXRlcldpZHRoIjoid2lkdGgiO2lmKGlzVGFibGVXaWR0aEJ1ZyYmJHRhYmxlLmNzcygibWF4LXdpZHRoIikpe3ZhciB3PTA7aWYoaXNPdXRlcil7dys9cGFyc2VJbnQoJHRhYmxlLmNzcygiYm9yZGVyTGVmdCIpLDEwKTt3Kz1wYXJzZUludCgkdGFibGUuY3NzKCJib3JkZXJSaWdodCIpLDEwKX0KZm9yKHZhciBpPTA7aTwkZnRoQ2VsbHMubGVuZ3RoO2krKyl7dys9JGZ0aENlbGxzLmdldChpKS5vZmZzZXRXaWR0aH0KcmV0dXJuIHd9ZWxzZXtyZXR1cm4gJHRhYmxlW2ZuXSgpfX0KJC5mbi5mbG9hdFRoZWFkPWZ1bmN0aW9uKG1hcCl7bWFwPW1hcHx8e307aWYoIXV0aWwpe3V0aWw9d2luZG93Ll98fCQuZmxvYXRUaGVhZC5fO2lmKCF1dGlsKXt0aHJvdyBuZXcgRXJyb3IoImpxdWVyeS5mbG9hdFRoZWFkLXNsaW0uanMgcmVxdWlyZXMgdW5kZXJzY29yZS4gWW91IHNob3VsZCB1c2UgdGhlIG5vbi1saXRlIHZlcnNpb24gc2luY2UgeW91IGRvIG5vdCBoYXZlIHVuZGVyc2NvcmUuIil9fQppZihpZVZlcnNpb248OCl7cmV0dXJuIHRoaXN9CnZhciBtT2JzPW51bGw7aWYodXRpbC5pc0Z1bmN0aW9uKGlzVGFibGVXaWR0aEJ1Zykpe2lzVGFibGVXaWR0aEJ1Zz1pc1RhYmxlV2lkdGhCdWcoKX0KaWYodXRpbC5pc1N0cmluZyhtYXApKXt2YXIgY29tbWFuZD1tYXA7dmFyIHJldD10aGlzO3RoaXMuZmlsdGVyKCd0YWJsZScpLmVhY2goZnVuY3Rpb24oKXt2YXIgJHRoaXM9JCh0aGlzKTt2YXIgb3B0cz0kdGhpcy5kYXRhKCdmbG9hdFRoZWFkLWxhenknKTtpZihvcHRzKXskdGhpcy5mbG9hdFRoZWFkKG9wdHMpfQp2YXIgb2JqPSR0aGlzLmRhdGEoJ2Zsb2F0VGhlYWQtYXR0YWNoZWQnKTtpZihvYmomJnV0aWwuaXNGdW5jdGlvbihvYmpbY29tbWFuZF0pKXt2YXIgcj1vYmpbY29tbWFuZF0oKTtpZih0eXBlb2YgciE9PSd1bmRlZmluZWQnKXtyZXQ9cn19fSk7cmV0dXJuIHJldH0KdmFyIG9wdHM9JC5leHRlbmQoe30sJC5mbG9hdFRoZWFkLmRlZmF1bHRzfHx7fSxtYXApOyQuZWFjaChtYXAsZnVuY3Rpb24oa2V5LHZhbCl7aWYoKCEoa2V5IGluICQuZmxvYXRUaGVhZC5kZWZhdWx0cykpJiZvcHRzLmRlYnVnKXtkZWJ1ZygiVXNlZCBbIitrZXkrIl0ga2V5IHRvIGluaXQgcGx1Z2luLCBidXQgdGhhdCBwYXJhbSBpcyBub3QgYW4gb3B0aW9uIGZvciB0aGUgcGx1Z2luLiBWYWxpZCBvcHRpb25zIGFyZTogIisodXRpbC5rZXlzKCQuZmxvYXRUaGVhZC5kZWZhdWx0cykpLmpvaW4oJywgJykpfX0pO2lmKG9wdHMuZGVidWcpe3ZhciB2PSQuZm4uanF1ZXJ5LnNwbGl0KCIuIik7aWYocGFyc2VJbnQodlswXSwxMCk9PTEmJnBhcnNlSW50KHZbMV0sMTApPD03KXtkZWJ1ZygialF1ZXJ5IHZlcnNpb24gIiskLmZuLmpxdWVyeSsiIGRldGVjdGVkISBUaGlzIHBsdWdpbiBzdXBwb3J0cyAxLjggb3IgYmV0dGVyLCBvciAxLjcueCB3aXRoIGpRdWVyeSBVSSAxLjguMjQgLT4gaHR0cDovL2pxdWVyeXVpLmNvbS9yZXNvdXJjZXMvZG93bmxvYWQvanF1ZXJ5LXVpLTEuOC4yNC56aXAiKX19CnRoaXMuZmlsdGVyKCc6bm90KC4nK29wdHMuZmxvYXRUYWJsZUNsYXNzKycpJykuZWFjaChmdW5jdGlvbigpe3ZhciBmbG9hdFRoZWFkSWQ9dXRpbC51bmlxdWVJZCgpO3ZhciAkdGFibGU9JCh0aGlzKTtpZigkdGFibGUuZGF0YSgnZmxvYXRUaGVhZC1hdHRhY2hlZCcpKXtyZXR1cm4hMH0KaWYoISR0YWJsZS5pcygndGFibGUnKSl7dGhyb3cgbmV3IEVycm9yKCdqUXVlcnkuZmxvYXRUaGVhZCBtdXN0IGJlIHJ1biBvbiBhIHRhYmxlIGVsZW1lbnQuIGV4OiAkKCJ0YWJsZSIpLmZsb2F0VGhlYWQoKTsnKX0KY2FuT2JzZXJ2ZU11dGF0aW9ucz1vcHRzLmF1dG9SZWZsb3cmJmNhbk9ic2VydmVNdXRhdGlvbnM7dmFyICRoZWFkZXI9JHRhYmxlLmNoaWxkcmVuKCd0aGVhZDpmaXJzdCcpO3ZhciAkdGJvZHk9JHRhYmxlLmNoaWxkcmVuKCd0Ym9keTpmaXJzdCcpO2lmKCRoZWFkZXIubGVuZ3RoPT0wfHwkdGJvZHkubGVuZ3RoPT0wKXskdGFibGUuZGF0YSgnZmxvYXRUaGVhZC1sYXp5JyxvcHRzKTskdGFibGUudW5iaW5kKCJyZWZsb3ciKS5vbmUoJ3JlZmxvdycsZnVuY3Rpb24oKXskdGFibGUuZmxvYXRUaGVhZChvcHRzKX0pO3JldHVybn0KaWYoJHRhYmxlLmRhdGEoJ2Zsb2F0VGhlYWQtbGF6eScpKXskdGFibGUudW5iaW5kKCJyZWZsb3ciKX0KJHRhYmxlLmRhdGEoJ2Zsb2F0VGhlYWQtbGF6eScsITEpO3ZhciBoZWFkZXJGbG9hdGVkPSEwO3ZhciBzY3JvbGxpbmdUb3Asc2Nyb2xsaW5nQm90dG9tO3ZhciBzY3JvbGxiYXJPZmZzZXQ9e3ZlcnRpY2FsOjAsaG9yaXpvbnRhbDowfTt2YXIgc2NXaWR0aD1zY3JvbGxiYXJXaWR0aCgpO3ZhciBsYXN0Q29sdW1uQ291bnQ9MDtpZihvcHRzLnNjcm9sbENvbnRhaW5lcj09PSEwKXtvcHRzLnNjcm9sbENvbnRhaW5lcj1nZXRDbG9zZXN0U2Nyb2xsQ29udGFpbmVyfQp2YXIgJHNjcm9sbENvbnRhaW5lcj1vcHRzLnNjcm9sbENvbnRhaW5lcigkdGFibGUpfHwkKFtdKTt2YXIgbG9ja2VkPSRzY3JvbGxDb250YWluZXIubGVuZ3RoPjA7dmFyICRyZXNwb25zaXZlQ29udGFpbmVyPWxvY2tlZD8kKFtdKTpvcHRzLnJlc3BvbnNpdmVDb250YWluZXIoJHRhYmxlKXx8JChbXSk7dmFyIHJlc3BvbnNpdmU9aXNSZXNwb25zaXZlQ29udGFpbmVyQWN0aXZlKCk7dmFyIHVzZUFic29sdXRlUG9zaXRpb25pbmc9bnVsbDtpZih0eXBlb2Ygb3B0cy51c2VBYnNvbHV0ZVBvc2l0aW9uaW5nIT09J3VuZGVmaW5lZCcpe29wdHMucG9zaXRpb249J2F1dG8nO2lmKG9wdHMudXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7b3B0cy5wb3NpdGlvbj1vcHRzLnVzZUFic29sdXRlUG9zaXRpb25pbmc/J2Fic29sdXRlJzonZml4ZWQnfQpkZWJ1Zygib3B0aW9uICd1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nJyBoYXMgYmVlbiByZW1vdmVkIGluIHYxLjMuMCwgdXNlIGBwb3NpdGlvbjonIitvcHRzLnBvc2l0aW9uKyInYCBpbnN0ZWFkLiBTZWUgZG9jcyBmb3IgbW9yZSBpbmZvOiBodHRwOi8vbWtvcnlhay5naXRodWIuaW8vZmxvYXRUaGVhZC8jb3B0aW9ucyIpfQppZih0eXBlb2Ygb3B0cy5zY3JvbGxpbmdUb3AhPT0ndW5kZWZpbmVkJyl7b3B0cy50b3A9b3B0cy5zY3JvbGxpbmdUb3A7ZGVidWcoIm9wdGlvbiAnc2Nyb2xsaW5nVG9wJyBoYXMgYmVlbiByZW5hbWVkIHRvICd0b3AnIGluIHYxLjMuMC4gU2VlIGRvY3MgZm9yIG1vcmUgaW5mbzogaHR0cDovL21rb3J5YWsuZ2l0aHViLmlvL2Zsb2F0VGhlYWQvI29wdGlvbnMiKX0KaWYodHlwZW9mIG9wdHMuc2Nyb2xsaW5nQm90dG9tIT09J3VuZGVmaW5lZCcpe29wdHMuYm90dG9tPW9wdHMuc2Nyb2xsaW5nQm90dG9tO2RlYnVnKCJvcHRpb24gJ3Njcm9sbGluZ0JvdHRvbScgaGFzIGJlZW4gcmVuYW1lZCB0byAnYm90dG9tJyBpbiB2MS4zLjAuIFNlZSBkb2NzIGZvciBtb3JlIGluZm86IGh0dHA6Ly9ta29yeWFrLmdpdGh1Yi5pby9mbG9hdFRoZWFkLyNvcHRpb25zIil9CmlmKG9wdHMucG9zaXRpb249PSdhdXRvJyl7dXNlQWJzb2x1dGVQb3NpdGlvbmluZz1udWxsfWVsc2UgaWYob3B0cy5wb3NpdGlvbj09J2ZpeGVkJyl7dXNlQWJzb2x1dGVQb3NpdGlvbmluZz0hMX1lbHNlIGlmKG9wdHMucG9zaXRpb249PSdhYnNvbHV0ZScpe3VzZUFic29sdXRlUG9zaXRpb25pbmc9ITB9ZWxzZSBpZihvcHRzLmRlYnVnKXtkZWJ1ZygnSW52YWxpZCB2YWx1ZSBnaXZlbiB0byAicG9zaXRpb24iIG9wdGlvbiwgdmFsaWQgaXMgImZpeGVkIiwgImFic29sdXRlIiBhbmQgImF1dG8iLiBZb3UgcGFzc2VkOiAnLG9wdHMucG9zaXRpb24pfQppZih1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nPT1udWxsKXt1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nPWxvY2tlZH0KdmFyICRjYXB0aW9uPSR0YWJsZS5maW5kKCJjYXB0aW9uIik7dmFyIGhhdmVDYXB0aW9uPSRjYXB0aW9uLmxlbmd0aD09MTtpZihoYXZlQ2FwdGlvbil7dmFyIGNhcHRpb25BbGlnblRvcD0oJGNhcHRpb24uY3NzKCJjYXB0aW9uLXNpZGUiKXx8JGNhcHRpb24uYXR0cigiYWxpZ24iKXx8InRvcCIpPT09InRvcCJ9CnZhciAkZnRoR3JwPSQoJzxmdGhmb290IHN0eWxlPSJkaXNwbGF5OnRhYmxlLWZvb3Rlci1ncm91cDtib3JkZXItc3BhY2luZzowO2hlaWdodDowO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTt2aXNpYmlsaXR5OmhpZGRlbiIvPicpO3ZhciB3cmFwcGVkQ29udGFpbmVyPSExO3ZhciAkd3JhcHBlcj0kKFtdKTt2YXIgYWJzb2x1dGVUb0ZpeGVkT25TY3JvbGw9aWVWZXJzaW9uPD05JiYhbG9ja2VkJiZ1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nO3ZhciAkZmxvYXRUYWJsZT0kKCI8dGFibGUvPiIpO3ZhciAkZmxvYXRDb2xHcm91cD0kKCI8Y29sZ3JvdXAvPiIpO3ZhciAkdGFibGVDb2xHcm91cD0kdGFibGUuY2hpbGRyZW4oJ2NvbGdyb3VwOmZpcnN0Jyk7dmFyIGV4aXN0aW5nQ29sR3JvdXA9ITA7aWYoJHRhYmxlQ29sR3JvdXAubGVuZ3RoPT0wKXskdGFibGVDb2xHcm91cD0kKCI8Y29sZ3JvdXAvPiIpO2V4aXN0aW5nQ29sR3JvdXA9ITF9CnZhciAkZnRoUm93PSQoJzxmdGh0ciBzdHlsZT0iZGlzcGxheTp0YWJsZS1yb3c7Ym9yZGVyLXNwYWNpbmc6MDtoZWlnaHQ6MDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2UiLz4nKTt2YXIgJGZsb2F0Q29udGFpbmVyPSQoJzxkaXYgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW47IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9kaXY+Jyk7dmFyIGZsb2F0VGFibGVIaWRkZW49ITE7dmFyICRuZXdIZWFkZXI9JCgiPHRoZWFkLz4iKTt2YXIgJHNpemVyUm93PSQoJzx0ciBjbGFzcz0ic2l6ZS1yb3ciLz4nKTt2YXIgJHNpemVyQ2VsbHM9JChbXSk7dmFyICR0YWJsZUNlbGxzPSQoW10pO3ZhciAkaGVhZGVyQ2VsbHM9JChbXSk7dmFyICRmdGhDZWxscz0kKFtdKTskbmV3SGVhZGVyLmFwcGVuZCgkc2l6ZXJSb3cpOyR0YWJsZS5wcmVwZW5kKCR0YWJsZUNvbEdyb3VwKTtpZihjcmVhdGVFbGVtZW50cyl7JGZ0aEdycC5hcHBlbmQoJGZ0aFJvdyk7JHRhYmxlLmFwcGVuZCgkZnRoR3JwKX0KJGZsb2F0VGFibGUuYXBwZW5kKCRmbG9hdENvbEdyb3VwKTskZmxvYXRDb250YWluZXIuYXBwZW5kKCRmbG9hdFRhYmxlKTtpZihvcHRzLmNvcHlUYWJsZUNsYXNzKXskZmxvYXRUYWJsZS5hdHRyKCdjbGFzcycsJHRhYmxlLmF0dHIoJ2NsYXNzJykpfQokZmxvYXRUYWJsZS5hdHRyKHsnY2VsbHBhZGRpbmcnOiR0YWJsZS5hdHRyKCdjZWxscGFkZGluZycpLCdjZWxsc3BhY2luZyc6JHRhYmxlLmF0dHIoJ2NlbGxzcGFjaW5nJyksJ2JvcmRlcic6JHRhYmxlLmF0dHIoJ2JvcmRlcicpfSk7dmFyIHRhYmxlRGlzcGxheUNzcz0kdGFibGUuY3NzKCdkaXNwbGF5Jyk7JGZsb2F0VGFibGUuY3NzKHsnYm9yZGVyQ29sbGFwc2UnOiR0YWJsZS5jc3MoJ2JvcmRlckNvbGxhcHNlJyksJ2JvcmRlcic6JHRhYmxlLmNzcygnYm9yZGVyJyksJ2Rpc3BsYXknOnRhYmxlRGlzcGxheUNzc30pO2lmKCFsb2NrZWQpeyRmbG9hdFRhYmxlLmNzcygnd2lkdGgnLCdhdXRvJyl9CmlmKHRhYmxlRGlzcGxheUNzcz09J25vbmUnKXtmbG9hdFRhYmxlSGlkZGVuPSEwfQokZmxvYXRUYWJsZS5hZGRDbGFzcyhvcHRzLmZsb2F0VGFibGVDbGFzcykuY3NzKHsnbWFyZ2luJzowLCdib3JkZXItYm90dG9tLXdpZHRoJzowfSk7aWYodXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7dmFyIG1ha2VSZWxhdGl2ZT1mdW5jdGlvbigkY29udGFpbmVyLGFsd2F5c1dyYXApe3ZhciBwb3NpdGlvbkNzcz0kY29udGFpbmVyLmNzcygncG9zaXRpb24nKTt2YXIgcmVsYXRpdmVUb1Njcm9sbENvbnRhaW5lcj0ocG9zaXRpb25Dc3M9PSJyZWxhdGl2ZSJ8fHBvc2l0aW9uQ3NzPT0iYWJzb2x1dGUiKTt2YXIgJGNvbnRhaW5lcldyYXA9JGNvbnRhaW5lcjtpZighcmVsYXRpdmVUb1Njcm9sbENvbnRhaW5lcnx8YWx3YXlzV3JhcCl7dmFyIGNzcz17InBhZGRpbmdMZWZ0IjokY29udGFpbmVyLmNzcygncGFkZGluZ0xlZnQnKSwicGFkZGluZ1JpZ2h0IjokY29udGFpbmVyLmNzcygncGFkZGluZ1JpZ2h0Jyl9OyRmbG9hdENvbnRhaW5lci5jc3MoY3NzKTskY29udGFpbmVyV3JhcD0kY29udGFpbmVyLmRhdGEoJ2Zsb2F0VGhlYWQtY29udGFpbmVyV3JhcCcpfHwkY29udGFpbmVyLndyYXAoIjxkaXYgY2xhc3M9JyIrb3B0cy5mbG9hdFdyYXBwZXJDbGFzcysiJyBzdHlsZT0ncG9zaXRpb246IHJlbGF0aXZlOyBjbGVhcjpib3RoOyc+PC9kaXY+IikucGFyZW50KCk7JGNvbnRhaW5lci5kYXRhKCdmbG9hdFRoZWFkLWNvbnRhaW5lcldyYXAnLCRjb250YWluZXJXcmFwKTt3cmFwcGVkQ29udGFpbmVyPSEwfQpyZXR1cm4gJGNvbnRhaW5lcldyYXB9O2lmKGxvY2tlZCl7JHdyYXBwZXI9bWFrZVJlbGF0aXZlKCRzY3JvbGxDb250YWluZXIsITApOyR3cmFwcGVyLnByZXBlbmQoJGZsb2F0Q29udGFpbmVyKX1lbHNleyR3cmFwcGVyPW1ha2VSZWxhdGl2ZSgkdGFibGUpOyR0YWJsZS5iZWZvcmUoJGZsb2F0Q29udGFpbmVyKX19ZWxzZXskdGFibGUuYmVmb3JlKCRmbG9hdENvbnRhaW5lcil9CiRmbG9hdENvbnRhaW5lci5jc3Moe3Bvc2l0aW9uOnVzZUFic29sdXRlUG9zaXRpb25pbmc/J2Fic29sdXRlJzonZml4ZWQnLG1hcmdpblRvcDowLHRvcDp1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nPzA6J2F1dG8nLHpJbmRleDpvcHRzLnpJbmRleH0pOyRmbG9hdENvbnRhaW5lci5hZGRDbGFzcyhvcHRzLmZsb2F0Q29udGFpbmVyQ2xhc3MpO3VwZGF0ZVNjcm9sbGluZ09mZnNldHMoKTt2YXIgbGF5b3V0Rml4ZWQ9eyd0YWJsZS1sYXlvdXQnOidmaXhlZCd9O3ZhciBsYXlvdXRBdXRvPXsndGFibGUtbGF5b3V0JzokdGFibGUuY3NzKCd0YWJsZUxheW91dCcpfHwnYXV0byd9O3ZhciBvcmlnaW5hbFRhYmxlV2lkdGg9JHRhYmxlWzBdLnN0eWxlLndpZHRofHwiIjt2YXIgb3JpZ2luYWxUYWJsZU1pbldpZHRoPSR0YWJsZS5jc3MoJ21pbldpZHRoJyl8fCIiO2Z1bmN0aW9uIGV2ZW50TmFtZShuYW1lKXtyZXR1cm4gbmFtZSsnLmZ0aC0nK2Zsb2F0VGhlYWRJZCsnLmZsb2F0VEhlYWQnfQpmdW5jdGlvbiBzZXRIZWFkZXJIZWlnaHQoKXt2YXIgaGVhZGVySGVpZ2h0PTA7JGhlYWRlci5jaGlsZHJlbigidHI6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24oKXtoZWFkZXJIZWlnaHQrPSQodGhpcykub3V0ZXJIZWlnaHQoITApfSk7aWYoJHRhYmxlLmNzcygnYm9yZGVyLWNvbGxhcHNlJyk9PSdjb2xsYXBzZScpe3ZhciB0YWJsZUJvcmRlclRvcEhlaWdodD1wYXJzZUludCgkdGFibGUuY3NzKCdib3JkZXItdG9wLXdpZHRoJyksMTApO3ZhciBjZWxsQm9yZGVyVG9wSGVpZ2h0PXBhcnNlSW50KCR0YWJsZS5maW5kKCJ0aGVhZCB0cjpmaXJzdCIpLmZpbmQoIj4qOmZpcnN0IikuY3NzKCdib3JkZXItdG9wLXdpZHRoJyksMTApO2lmKHRhYmxlQm9yZGVyVG9wSGVpZ2h0PmNlbGxCb3JkZXJUb3BIZWlnaHQpe2hlYWRlckhlaWdodC09KHRhYmxlQm9yZGVyVG9wSGVpZ2h0LzIpfX0KJHNpemVyUm93Lm91dGVySGVpZ2h0KGhlYWRlckhlaWdodCk7JHNpemVyQ2VsbHMub3V0ZXJIZWlnaHQoaGVhZGVySGVpZ2h0KX0KZnVuY3Rpb24gc2V0RmxvYXRXaWR0aCgpe3ZhciB0dz10YWJsZVdpZHRoKCR0YWJsZSwkZnRoQ2VsbHMsITApO3ZhciAkY29udGFpbmVyPXJlc3BvbnNpdmU/JHJlc3BvbnNpdmVDb250YWluZXI6JHNjcm9sbENvbnRhaW5lcjt2YXIgd2lkdGg9JGNvbnRhaW5lci53aWR0aCgpfHx0dzt2YXIgZmxvYXRDb250YWluZXJXaWR0aD0kY29udGFpbmVyLmNzcygib3ZlcmZsb3cteSIpIT0naGlkZGVuJz93aWR0aC1zY3JvbGxiYXJPZmZzZXQudmVydGljYWw6d2lkdGg7JGZsb2F0Q29udGFpbmVyLndpZHRoKGZsb2F0Q29udGFpbmVyV2lkdGgpO2lmKGxvY2tlZCl7dmFyIHBlcmNlbnQ9MTAwKnR3LyhmbG9hdENvbnRhaW5lcldpZHRoKTskZmxvYXRUYWJsZS5jc3MoJ3dpZHRoJyxwZXJjZW50KyclJyl9ZWxzZXskZmxvYXRUYWJsZS5vdXRlcldpZHRoKHR3KX19CmZ1bmN0aW9uIHVwZGF0ZVNjcm9sbGluZ09mZnNldHMoKXtzY3JvbGxpbmdUb3A9KHV0aWwuaXNGdW5jdGlvbihvcHRzLnRvcCk/b3B0cy50b3AoJHRhYmxlKTpvcHRzLnRvcCl8fDA7c2Nyb2xsaW5nQm90dG9tPSh1dGlsLmlzRnVuY3Rpb24ob3B0cy5ib3R0b20pP29wdHMuYm90dG9tKCR0YWJsZSk6b3B0cy5ib3R0b20pfHwwfQpmdW5jdGlvbiBjb2x1bW5OdW0oKXt2YXIgY291bnQ7dmFyICRoZWFkZXJDb2x1bW5zPSRoZWFkZXIuZmluZChvcHRzLmhlYWRlckNlbGxTZWxlY3Rvcik7aWYoZXhpc3RpbmdDb2xHcm91cCl7Y291bnQ9JHRhYmxlQ29sR3JvdXAuZmluZCgnY29sJykubGVuZ3RofWVsc2V7Y291bnQ9MDskaGVhZGVyQ29sdW1ucy5lYWNoKGZ1bmN0aW9uKCl7Y291bnQrPXBhcnNlSW50KCgkKHRoaXMpLmF0dHIoJ2NvbHNwYW4nKXx8MSksMTApfSl9CmlmKGNvdW50IT1sYXN0Q29sdW1uQ291bnQpe2xhc3RDb2x1bW5Db3VudD1jb3VudDt2YXIgY2VsbHM9W10sY29scz1bXSxwc3VlZG89W10sY29udGVudDtmb3IodmFyIHg9MDt4PGNvdW50O3grKyl7aWYob3B0cy5lbmFibGVBcmlhJiYoY29udGVudD0kaGVhZGVyQ29sdW1ucy5lcSh4KS50ZXh0KCkpKXtjZWxscy5wdXNoKCc8dGggc2NvcGU9ImNvbCIgY2xhc3M9ImZsb2F0VGhlYWQtY29sIj4nK2NvbnRlbnQrJzwvdGg+Jyl9ZWxzZXtjZWxscy5wdXNoKCc8dGggY2xhc3M9ImZsb2F0VGhlYWQtY29sIi8+Jyl9CmNvbHMucHVzaCgnPGNvbC8+Jyk7cHN1ZWRvLnB1c2goIjxmdGh0ZCBzdHlsZT0nZGlzcGxheTp0YWJsZS1jZWxsO2hlaWdodDowO3dpZHRoOmF1dG87Jy8+Iil9CmNvbHM9Y29scy5qb2luKCcnKTtjZWxscz1jZWxscy5qb2luKCcnKTtpZihjcmVhdGVFbGVtZW50cyl7cHN1ZWRvPXBzdWVkby5qb2luKCcnKTskZnRoUm93Lmh0bWwocHN1ZWRvKTskZnRoQ2VsbHM9JGZ0aFJvdy5maW5kKCdmdGh0ZCcpfQokc2l6ZXJSb3cuaHRtbChjZWxscyk7JHNpemVyQ2VsbHM9JHNpemVyUm93LmZpbmQoInRoIik7aWYoIWV4aXN0aW5nQ29sR3JvdXApeyR0YWJsZUNvbEdyb3VwLmh0bWwoY29scyl9CiR0YWJsZUNlbGxzPSR0YWJsZUNvbEdyb3VwLmZpbmQoJ2NvbCcpOyRmbG9hdENvbEdyb3VwLmh0bWwoY29scyk7JGhlYWRlckNlbGxzPSRmbG9hdENvbEdyb3VwLmZpbmQoImNvbCIpfQpyZXR1cm4gY291bnR9CmZ1bmN0aW9uIHJlZmxvYXQoKXtpZighaGVhZGVyRmxvYXRlZCl7aGVhZGVyRmxvYXRlZD0hMDtpZih1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nKXt2YXIgdHc9dGFibGVXaWR0aCgkdGFibGUsJGZ0aENlbGxzLCEwKTt2YXIgd3JhcHBlcldpZHRoPSR3cmFwcGVyLndpZHRoKCk7aWYodHc+d3JhcHBlcldpZHRoKXskdGFibGUuY3NzKCdtaW5XaWR0aCcsdHcpfX0KJHRhYmxlLmNzcyhsYXlvdXRGaXhlZCk7JGZsb2F0VGFibGUuY3NzKGxheW91dEZpeGVkKTskZmxvYXRUYWJsZS5hcHBlbmQoJGhlYWRlcik7JHRib2R5LmJlZm9yZSgkbmV3SGVhZGVyKTtzZXRIZWFkZXJIZWlnaHQoKX19CmZ1bmN0aW9uIHVuZmxvYXQoKXtpZihoZWFkZXJGbG9hdGVkKXtoZWFkZXJGbG9hdGVkPSExO2lmKHVzZUFic29sdXRlUG9zaXRpb25pbmcpeyR0YWJsZS53aWR0aChvcmlnaW5hbFRhYmxlV2lkdGgpfQokbmV3SGVhZGVyLmRldGFjaCgpOyR0YWJsZS5wcmVwZW5kKCRoZWFkZXIpOyR0YWJsZS5jc3MobGF5b3V0QXV0byk7JGZsb2F0VGFibGUuY3NzKGxheW91dEF1dG8pOyR0YWJsZS5jc3MoJ21pbldpZHRoJyxvcmlnaW5hbFRhYmxlTWluV2lkdGgpOyR0YWJsZS5jc3MoJ21pbldpZHRoJyx0YWJsZVdpZHRoKCR0YWJsZSwkZnRoQ2VsbHMpKX19CnZhciBpc0hlYWRlckZsb2F0aW5nTG9naWNhbD0hMTtmdW5jdGlvbiB0cmlnZ2VyRmxvYXRFdmVudChpc0Zsb2F0aW5nKXtpZihpc0hlYWRlckZsb2F0aW5nTG9naWNhbCE9aXNGbG9hdGluZyl7aXNIZWFkZXJGbG9hdGluZ0xvZ2ljYWw9aXNGbG9hdGluZzskdGFibGUudHJpZ2dlckhhbmRsZXIoImZsb2F0VGhlYWQiLFtpc0Zsb2F0aW5nLCRmbG9hdENvbnRhaW5lcl0pfX0KZnVuY3Rpb24gY2hhbmdlUG9zaXRpb25pbmcoaXNBYnNvbHV0ZSl7aWYodXNlQWJzb2x1dGVQb3NpdGlvbmluZyE9aXNBYnNvbHV0ZSl7dXNlQWJzb2x1dGVQb3NpdGlvbmluZz1pc0Fic29sdXRlOyRmbG9hdENvbnRhaW5lci5jc3Moe3Bvc2l0aW9uOnVzZUFic29sdXRlUG9zaXRpb25pbmc/J2Fic29sdXRlJzonZml4ZWQnfSl9fQpmdW5jdGlvbiBnZXRTaXppbmdSb3coJHRhYmxlLCRjb2xzLCRmdGhDZWxscyxpZVZlcnNpb24pe2lmKGNyZWF0ZUVsZW1lbnRzKXtyZXR1cm4gJGZ0aENlbGxzfWVsc2UgaWYoaWVWZXJzaW9uKXtyZXR1cm4gb3B0cy5nZXRTaXppbmdSb3coJHRhYmxlLCRjb2xzLCRmdGhDZWxscyl9ZWxzZXtyZXR1cm4gJGNvbHN9fQpmdW5jdGlvbiByZWZsb3coKXt2YXIgaTt2YXIgbnVtQ29scz1jb2x1bW5OdW0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgc2Nyb2xsTGVmdD0kZmxvYXRDb250YWluZXIuc2Nyb2xsTGVmdCgpOyR0YWJsZUNlbGxzPSR0YWJsZUNvbEdyb3VwLmZpbmQoJ2NvbCcpO3ZhciAkcm93Q2VsbHM9Z2V0U2l6aW5nUm93KCR0YWJsZSwkdGFibGVDZWxscywkZnRoQ2VsbHMsaWVWZXJzaW9uKTtpZigkcm93Q2VsbHMubGVuZ3RoPT1udW1Db2xzJiZudW1Db2xzPjApe2lmKCFleGlzdGluZ0NvbEdyb3VwKXtmb3IoaT0wO2k8bnVtQ29scztpKyspeyR0YWJsZUNlbGxzLmVxKGkpLmNzcygnd2lkdGgnLCcnKX19CnVuZmxvYXQoKTt2YXIgd2lkdGhzPVtdO2ZvcihpPTA7aTxudW1Db2xzO2krKyl7d2lkdGhzW2ldPWdldE9mZnNldFdpZHRoKCRyb3dDZWxscy5nZXQoaSkpfQpmb3IoaT0wO2k8bnVtQ29scztpKyspeyRoZWFkZXJDZWxscy5lcShpKS53aWR0aCh3aWR0aHNbaV0pOyR0YWJsZUNlbGxzLmVxKGkpLndpZHRoKHdpZHRoc1tpXSl9CnJlZmxvYXQoKX1lbHNleyRmbG9hdFRhYmxlLmFwcGVuZCgkaGVhZGVyKTskdGFibGUuY3NzKGxheW91dEF1dG8pOyRmbG9hdFRhYmxlLmNzcyhsYXlvdXRBdXRvKTtzZXRIZWFkZXJIZWlnaHQoKX0KJGZsb2F0Q29udGFpbmVyLnNjcm9sbExlZnQoc2Nyb2xsTGVmdCk7JHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJyZWZsb3dlZCIsWyRmbG9hdENvbnRhaW5lcl0pfX0KZnVuY3Rpb24gZmxvYXRDb250YWluZXJCb3JkZXJXaWR0aChzaWRlKXt2YXIgYm9yZGVyPSRzY3JvbGxDb250YWluZXIuY3NzKCJib3JkZXItIitzaWRlKyItd2lkdGgiKTt2YXIgdz0wO2lmKGJvcmRlciYmfmJvcmRlci5pbmRleE9mKCdweCcpKXt3PXBhcnNlSW50KGJvcmRlciwxMCl9CnJldHVybiB3fQpmdW5jdGlvbiBpc1Jlc3BvbnNpdmVDb250YWluZXJBY3RpdmUoKXtyZXR1cm4gJHJlc3BvbnNpdmVDb250YWluZXIuY3NzKCJvdmVyZmxvdy14Iik9PSdhdXRvJ30KZnVuY3Rpb24gY2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3NGbigpe3ZhciBzY3JvbGxpbmdDb250YWluZXJUb3A9JHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AoKTt2YXIgZmxvYXRFbmQ7dmFyIHRhYmxlQ29udGFpbmVyR2FwPTA7dmFyIGNhcHRpb25IZWlnaHQ9aGF2ZUNhcHRpb24/JGNhcHRpb24ub3V0ZXJIZWlnaHQoITApOjA7dmFyIGNhcHRpb25TY3JvbGxPZmZzZXQ9Y2FwdGlvbkFsaWduVG9wP2NhcHRpb25IZWlnaHQ6LWNhcHRpb25IZWlnaHQ7dmFyIGZsb2F0Q29udGFpbmVySGVpZ2h0PSRmbG9hdENvbnRhaW5lci5oZWlnaHQoKTt2YXIgdGFibGVPZmZzZXQ9JHRhYmxlLm9mZnNldCgpO3ZhciB0YWJsZUxlZnRHYXA9MDt2YXIgdGFibGVUb3BHYXA9MDtpZihsb2NrZWQpe3ZhciBjb250YWluZXJPZmZzZXQ9JHNjcm9sbENvbnRhaW5lci5vZmZzZXQoKTt0YWJsZUNvbnRhaW5lckdhcD10YWJsZU9mZnNldC50b3AtY29udGFpbmVyT2Zmc2V0LnRvcCtzY3JvbGxpbmdDb250YWluZXJUb3A7aWYoaGF2ZUNhcHRpb24mJmNhcHRpb25BbGlnblRvcCl7dGFibGVDb250YWluZXJHYXArPWNhcHRpb25IZWlnaHR9CnRhYmxlTGVmdEdhcD1mbG9hdENvbnRhaW5lckJvcmRlcldpZHRoKCdsZWZ0Jyk7dGFibGVUb3BHYXA9ZmxvYXRDb250YWluZXJCb3JkZXJXaWR0aCgndG9wJyk7dGFibGVDb250YWluZXJHYXAtPXRhYmxlVG9wR2FwfWVsc2V7ZmxvYXRFbmQ9dGFibGVPZmZzZXQudG9wLXNjcm9sbGluZ1RvcC1mbG9hdENvbnRhaW5lckhlaWdodCtzY3JvbGxpbmdCb3R0b20rc2Nyb2xsYmFyT2Zmc2V0Lmhvcml6b250YWx9CnZhciB3aW5kb3dUb3A9JHdpbmRvdy5zY3JvbGxUb3AoKTt2YXIgd2luZG93TGVmdD0kd2luZG93LnNjcm9sbExlZnQoKTt2YXIgc2Nyb2xsQ29udGFpbmVyTGVmdD0oaXNSZXNwb25zaXZlQ29udGFpbmVyQWN0aXZlKCk/JHJlc3BvbnNpdmVDb250YWluZXI6JHNjcm9sbENvbnRhaW5lcikuc2Nyb2xsTGVmdCgpO3JldHVybiBmdW5jdGlvbihldmVudFR5cGUpe3Jlc3BvbnNpdmU9aXNSZXNwb25zaXZlQ29udGFpbmVyQWN0aXZlKCk7dmFyIGlzVGFibGVIaWRkZW49JHRhYmxlWzBdLm9mZnNldFdpZHRoPD0wJiYkdGFibGVbMF0ub2Zmc2V0SGVpZ2h0PD0wO2lmKCFpc1RhYmxlSGlkZGVuJiZmbG9hdFRhYmxlSGlkZGVuKXtmbG9hdFRhYmxlSGlkZGVuPSExO3NldFRpbWVvdXQoZnVuY3Rpb24oKXskdGFibGUudHJpZ2dlckhhbmRsZXIoInJlZmxvdyIpfSwxKTtyZXR1cm4gbnVsbH0KaWYoaXNUYWJsZUhpZGRlbil7ZmxvYXRUYWJsZUhpZGRlbj0hMDtpZighdXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7cmV0dXJuIG51bGx9fQppZihldmVudFR5cGU9PSd3aW5kb3dTY3JvbGwnKXt3aW5kb3dUb3A9JHdpbmRvdy5zY3JvbGxUb3AoKTt3aW5kb3dMZWZ0PSR3aW5kb3cuc2Nyb2xsTGVmdCgpfWVsc2UgaWYoZXZlbnRUeXBlPT0nY29udGFpbmVyU2Nyb2xsJyl7aWYoJHJlc3BvbnNpdmVDb250YWluZXIubGVuZ3RoKXtpZighcmVzcG9uc2l2ZSl7cmV0dXJufQpzY3JvbGxDb250YWluZXJMZWZ0PSRyZXNwb25zaXZlQ29udGFpbmVyLnNjcm9sbExlZnQoKX1lbHNle3Njcm9sbGluZ0NvbnRhaW5lclRvcD0kc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCgpO3Njcm9sbENvbnRhaW5lckxlZnQ9JHNjcm9sbENvbnRhaW5lci5zY3JvbGxMZWZ0KCl9fWVsc2UgaWYoZXZlbnRUeXBlIT0naW5pdCcpe3dpbmRvd1RvcD0kd2luZG93LnNjcm9sbFRvcCgpO3dpbmRvd0xlZnQ9JHdpbmRvdy5zY3JvbGxMZWZ0KCk7c2Nyb2xsaW5nQ29udGFpbmVyVG9wPSRzY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wKCk7c2Nyb2xsQ29udGFpbmVyTGVmdD0ocmVzcG9uc2l2ZT8kcmVzcG9uc2l2ZUNvbnRhaW5lcjokc2Nyb2xsQ29udGFpbmVyKS5zY3JvbGxMZWZ0KCl9CmlmKGlzV2Via2l0JiYod2luZG93VG9wPDB8fHdpbmRvd0xlZnQ8MCkpe3JldHVybn0KaWYoYWJzb2x1dGVUb0ZpeGVkT25TY3JvbGwpe2lmKGV2ZW50VHlwZT09J3dpbmRvd1Njcm9sbERvbmUnKXtjaGFuZ2VQb3NpdGlvbmluZyghMCl9ZWxzZXtjaGFuZ2VQb3NpdGlvbmluZyghMSl9fWVsc2UgaWYoZXZlbnRUeXBlPT0nd2luZG93U2Nyb2xsRG9uZScpe3JldHVybiBudWxsfQp0YWJsZU9mZnNldD0kdGFibGUub2Zmc2V0KCk7aWYoaGF2ZUNhcHRpb24mJmNhcHRpb25BbGlnblRvcCl7dGFibGVPZmZzZXQudG9wKz1jYXB0aW9uSGVpZ2h0fQp2YXIgdG9wLGxlZnQ7dmFyIHRhYmxlSGVpZ2h0PSR0YWJsZS5vdXRlckhlaWdodCgpO2lmKGxvY2tlZCYmdXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7aWYodGFibGVDb250YWluZXJHYXA+PXNjcm9sbGluZ0NvbnRhaW5lclRvcCl7dmFyIGdhcD10YWJsZUNvbnRhaW5lckdhcC1zY3JvbGxpbmdDb250YWluZXJUb3ArdGFibGVUb3BHYXA7dG9wPWdhcD4wP2dhcDowO3RyaWdnZXJGbG9hdEV2ZW50KCExKX1lbHNle3RvcD13cmFwcGVkQ29udGFpbmVyP3RhYmxlVG9wR2FwOnNjcm9sbGluZ0NvbnRhaW5lclRvcDt0cmlnZ2VyRmxvYXRFdmVudCghMCl9CmxlZnQ9dGFibGVMZWZ0R2FwfWVsc2UgaWYoIWxvY2tlZCYmdXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7aWYod2luZG93VG9wPmZsb2F0RW5kK3RhYmxlSGVpZ2h0K2NhcHRpb25TY3JvbGxPZmZzZXQpe3RvcD10YWJsZUhlaWdodC1mbG9hdENvbnRhaW5lckhlaWdodCtjYXB0aW9uU2Nyb2xsT2Zmc2V0fWVsc2UgaWYodGFibGVPZmZzZXQudG9wPj13aW5kb3dUb3Arc2Nyb2xsaW5nVG9wKXt0b3A9MDt1bmZsb2F0KCk7dHJpZ2dlckZsb2F0RXZlbnQoITEpfWVsc2V7dG9wPXNjcm9sbGluZ1RvcCt3aW5kb3dUb3AtdGFibGVPZmZzZXQudG9wK3RhYmxlQ29udGFpbmVyR2FwKyhjYXB0aW9uQWxpZ25Ub3A/Y2FwdGlvbkhlaWdodDowKTtyZWZsb2F0KCk7dHJpZ2dlckZsb2F0RXZlbnQoITApfQpsZWZ0PXNjcm9sbENvbnRhaW5lckxlZnR9ZWxzZSBpZihsb2NrZWQmJiF1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nKXtpZih0YWJsZUNvbnRhaW5lckdhcD5zY3JvbGxpbmdDb250YWluZXJUb3B8fHNjcm9sbGluZ0NvbnRhaW5lclRvcC10YWJsZUNvbnRhaW5lckdhcD50YWJsZUhlaWdodCl7dG9wPXRhYmxlT2Zmc2V0LnRvcC13aW5kb3dUb3A7dW5mbG9hdCgpO3RyaWdnZXJGbG9hdEV2ZW50KCExKX1lbHNle3RvcD10YWJsZU9mZnNldC50b3Arc2Nyb2xsaW5nQ29udGFpbmVyVG9wLXdpbmRvd1RvcC10YWJsZUNvbnRhaW5lckdhcDtyZWZsb2F0KCk7dHJpZ2dlckZsb2F0RXZlbnQoITApfQpsZWZ0PXRhYmxlT2Zmc2V0LmxlZnQrc2Nyb2xsQ29udGFpbmVyTGVmdC13aW5kb3dMZWZ0fWVsc2UgaWYoIWxvY2tlZCYmIXVzZUFic29sdXRlUG9zaXRpb25pbmcpe2lmKHdpbmRvd1RvcD5mbG9hdEVuZCt0YWJsZUhlaWdodCtjYXB0aW9uU2Nyb2xsT2Zmc2V0KXt0b3A9dGFibGVIZWlnaHQrc2Nyb2xsaW5nVG9wLXdpbmRvd1RvcCtmbG9hdEVuZCtjYXB0aW9uU2Nyb2xsT2Zmc2V0fWVsc2UgaWYodGFibGVPZmZzZXQudG9wPndpbmRvd1RvcCtzY3JvbGxpbmdUb3Ape3RvcD10YWJsZU9mZnNldC50b3Atd2luZG93VG9wO3JlZmxvYXQoKTt0cmlnZ2VyRmxvYXRFdmVudCghMSl9ZWxzZXt0b3A9c2Nyb2xsaW5nVG9wO3RyaWdnZXJGbG9hdEV2ZW50KCEwKX0KbGVmdD10YWJsZU9mZnNldC5sZWZ0K3Njcm9sbENvbnRhaW5lckxlZnQtd2luZG93TGVmdH0KcmV0dXJue3RvcDp0b3AsbGVmdDpsZWZ0fX19CmZ1bmN0aW9uIHJlcG9zaXRpb25GbG9hdENvbnRhaW5lckZuKCl7dmFyIG9sZFRvcD1udWxsO3ZhciBvbGRMZWZ0PW51bGw7dmFyIG9sZFNjcm9sbExlZnQ9bnVsbDtyZXR1cm4gZnVuY3Rpb24ocG9zLHNldFdpZHRoLHNldEhlaWdodCl7aWYocG9zIT1udWxsJiYob2xkVG9wIT1wb3MudG9wfHxvbGRMZWZ0IT1wb3MubGVmdCkpeyRmbG9hdENvbnRhaW5lci5jc3Moe3RvcDpwb3MudG9wLGxlZnQ6cG9zLmxlZnR9KTtvbGRUb3A9cG9zLnRvcDtvbGRMZWZ0PXBvcy5sZWZ0fQppZihzZXRXaWR0aCl7c2V0RmxvYXRXaWR0aCgpfQppZihzZXRIZWlnaHQpe3NldEhlYWRlckhlaWdodCgpfQp2YXIgc2Nyb2xsTGVmdD0ocmVzcG9uc2l2ZT8kcmVzcG9uc2l2ZUNvbnRhaW5lcjokc2Nyb2xsQ29udGFpbmVyKS5zY3JvbGxMZWZ0KCk7aWYoIXVzZUFic29sdXRlUG9zaXRpb25pbmd8fG9sZFNjcm9sbExlZnQhPXNjcm9sbExlZnQpeyRmbG9hdENvbnRhaW5lci5zY3JvbGxMZWZ0KHNjcm9sbExlZnQpO29sZFNjcm9sbExlZnQ9c2Nyb2xsTGVmdH19fQpmdW5jdGlvbiBjYWxjdWxhdGVTY3JvbGxCYXJTaXplKCl7aWYoJHNjcm9sbENvbnRhaW5lci5sZW5ndGgpe2lmKG9wdHMuc3VwcG9ydCYmb3B0cy5zdXBwb3J0LnBlcmZlY3RTY3JvbGxiYXImJiRzY3JvbGxDb250YWluZXIuZGF0YSgpLnBlcmZlY3RTY3JvbGxiYXIpe3Njcm9sbGJhck9mZnNldD17aG9yaXpvbnRhbDowLHZlcnRpY2FsOjB9fWVsc2V7aWYoJHNjcm9sbENvbnRhaW5lci5jc3MoJ292ZXJmbG93LXgnKT09J3Njcm9sbCcpe3Njcm9sbGJhck9mZnNldC5ob3Jpem9udGFsPXNjV2lkdGh9ZWxzZXt2YXIgc3c9JHNjcm9sbENvbnRhaW5lci53aWR0aCgpLHR3PXRhYmxlV2lkdGgoJHRhYmxlLCRmdGhDZWxscyk7dmFyIG9mZnNldHY9c2g8dGg/c2NXaWR0aDowO3Njcm9sbGJhck9mZnNldC5ob3Jpem9udGFsPXN3LW9mZnNldHY8dHc/c2NXaWR0aDowfQppZigkc2Nyb2xsQ29udGFpbmVyLmNzcygnb3ZlcmZsb3cteScpPT0nc2Nyb2xsJyl7c2Nyb2xsYmFyT2Zmc2V0LnZlcnRpY2FsPXNjV2lkdGh9ZWxzZXt2YXIgc2g9JHNjcm9sbENvbnRhaW5lci5oZWlnaHQoKSx0aD0kdGFibGUuaGVpZ2h0KCk7dmFyIG9mZnNldGg9c3c8dHc/c2NXaWR0aDowO3Njcm9sbGJhck9mZnNldC52ZXJ0aWNhbD1zaC1vZmZzZXRoPHRoP3NjV2lkdGg6MH19fX0KY2FsY3VsYXRlU2Nyb2xsQmFyU2l6ZSgpO3ZhciBmbG93O3ZhciBlbnN1cmVSZWZsb3c9ZnVuY3Rpb24oKXtmbG93PXJlZmxvdygpO2Zsb3coKX07ZW5zdXJlUmVmbG93KCk7dmFyIGNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zPWNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zRm4oKTt2YXIgcmVwb3NpdGlvbkZsb2F0Q29udGFpbmVyPXJlcG9zaXRpb25GbG9hdENvbnRhaW5lckZuKCk7cmVwb3NpdGlvbkZsb2F0Q29udGFpbmVyKGNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zKCdpbml0JyksITApO3ZhciB3aW5kb3dTY3JvbGxEb25lRXZlbnQ9dXRpbC5kZWJvdW5jZShmdW5jdGlvbigpe3JlcG9zaXRpb25GbG9hdENvbnRhaW5lcihjYWxjdWxhdGVGbG9hdENvbnRhaW5lclBvcygnd2luZG93U2Nyb2xsRG9uZScpLCExKX0sMSk7dmFyIHdpbmRvd1Njcm9sbEV2ZW50PWZ1bmN0aW9uKCl7cmVwb3NpdGlvbkZsb2F0Q29udGFpbmVyKGNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zKCd3aW5kb3dTY3JvbGwnKSwhMSk7aWYoYWJzb2x1dGVUb0ZpeGVkT25TY3JvbGwpe3dpbmRvd1Njcm9sbERvbmVFdmVudCgpfX07dmFyIGNvbnRhaW5lclNjcm9sbEV2ZW50PWZ1bmN0aW9uKCl7cmVwb3NpdGlvbkZsb2F0Q29udGFpbmVyKGNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zKCdjb250YWluZXJTY3JvbGwnKSwhMSl9O3ZhciB3aW5kb3dSZXNpemVFdmVudD1mdW5jdGlvbigpe2lmKCR0YWJsZS5pcygiOmhpZGRlbiIpKXtyZXR1cm59CnVwZGF0ZVNjcm9sbGluZ09mZnNldHMoKTtjYWxjdWxhdGVTY3JvbGxCYXJTaXplKCk7ZW5zdXJlUmVmbG93KCk7Y2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3M9Y2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3NGbigpO3JlcG9zaXRpb25GbG9hdENvbnRhaW5lcj1yZXBvc2l0aW9uRmxvYXRDb250YWluZXJGbigpO3JlcG9zaXRpb25GbG9hdENvbnRhaW5lcihjYWxjdWxhdGVGbG9hdENvbnRhaW5lclBvcygncmVzaXplJyksITAsITApfTt2YXIgcmVmbG93RXZlbnQ9dXRpbC5kZWJvdW5jZShmdW5jdGlvbigpe2lmKCR0YWJsZS5pcygiOmhpZGRlbiIpKXtyZXR1cm59CmNhbGN1bGF0ZVNjcm9sbEJhclNpemUoKTt1cGRhdGVTY3JvbGxpbmdPZmZzZXRzKCk7ZW5zdXJlUmVmbG93KCk7Y2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3M9Y2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3NGbigpO3JlcG9zaXRpb25GbG9hdENvbnRhaW5lcihjYWxjdWxhdGVGbG9hdENvbnRhaW5lclBvcygncmVmbG93JyksITApfSwxKTt2YXIgYmVmb3JlUHJpbnQ9ZnVuY3Rpb24oKXskdGFibGUuZmxvYXRUaGVhZCgnZGVzdHJveScsWyEwXSl9O3ZhciBhZnRlclByaW50PWZ1bmN0aW9uKCl7JHRhYmxlLmZsb2F0VGhlYWQob3B0cyl9O3ZhciBwcmludEV2ZW50PWZ1bmN0aW9uKG1xbCl7aWYobXFsLm1hdGNoZXMpe2JlZm9yZVByaW50KCl9ZWxzZXthZnRlclByaW50KCl9fTtpZih3aW5kb3cubWF0Y2hNZWRpYSl7d2luZG93Lm1hdGNoTWVkaWEoInByaW50IikuYWRkTGlzdGVuZXIocHJpbnRFdmVudCl9ZWxzZXskd2luZG93Lm9uKCdiZWZvcmVwcmludCcsYmVmb3JlUHJpbnQpOyR3aW5kb3cub24oJ2FmdGVycHJpbnQnLGFmdGVyUHJpbnQpfQppZihsb2NrZWQpe2lmKHVzZUFic29sdXRlUG9zaXRpb25pbmcpeyRzY3JvbGxDb250YWluZXIub24oZXZlbnROYW1lKCdzY3JvbGwnKSxjb250YWluZXJTY3JvbGxFdmVudCl9ZWxzZXskc2Nyb2xsQ29udGFpbmVyLm9uKGV2ZW50TmFtZSgnc2Nyb2xsJyksY29udGFpbmVyU2Nyb2xsRXZlbnQpOyR3aW5kb3cub24oZXZlbnROYW1lKCdzY3JvbGwnKSx3aW5kb3dTY3JvbGxFdmVudCl9fWVsc2V7JHJlc3BvbnNpdmVDb250YWluZXIub24oZXZlbnROYW1lKCdzY3JvbGwnKSxjb250YWluZXJTY3JvbGxFdmVudCk7JHdpbmRvdy5vbihldmVudE5hbWUoJ3Njcm9sbCcpLHdpbmRvd1Njcm9sbEV2ZW50KX0KJHdpbmRvdy5vbihldmVudE5hbWUoJ2xvYWQnKSxyZWZsb3dFdmVudCk7d2luZG93UmVzaXplKGV2ZW50TmFtZSgncmVzaXplJyksd2luZG93UmVzaXplRXZlbnQpOyR0YWJsZS5vbigncmVmbG93JyxyZWZsb3dFdmVudCk7aWYob3B0cy5zdXBwb3J0JiZvcHRzLnN1cHBvcnQuZGF0YXRhYmxlcyYmaXNEYXRhdGFibGUoJHRhYmxlKSl7JHRhYmxlLm9uKCdmaWx0ZXInLHJlZmxvd0V2ZW50KS5vbignc29ydCcscmVmbG93RXZlbnQpLm9uKCdwYWdlJyxyZWZsb3dFdmVudCl9CmlmKG9wdHMuc3VwcG9ydCYmb3B0cy5zdXBwb3J0LmJvb3RzdHJhcCl7JHdpbmRvdy5vbihldmVudE5hbWUoJ3Nob3duLmJzLnRhYicpLHJlZmxvd0V2ZW50KX0KaWYob3B0cy5zdXBwb3J0JiZvcHRzLnN1cHBvcnQuanF1ZXJ5VUkpeyR3aW5kb3cub24oZXZlbnROYW1lKCd0YWJzYWN0aXZhdGUnKSxyZWZsb3dFdmVudCl9CmlmKGNhbk9ic2VydmVNdXRhdGlvbnMpe3ZhciBtdXRhdGlvbkVsZW1lbnQ9bnVsbDtpZih1dGlsLmlzRnVuY3Rpb24ob3B0cy5hdXRvUmVmbG93KSl7bXV0YXRpb25FbGVtZW50PW9wdHMuYXV0b1JlZmxvdygkdGFibGUsJHNjcm9sbENvbnRhaW5lcil9CmlmKCFtdXRhdGlvbkVsZW1lbnQpe211dGF0aW9uRWxlbWVudD0kc2Nyb2xsQ29udGFpbmVyLmxlbmd0aD8kc2Nyb2xsQ29udGFpbmVyWzBdOiR0YWJsZVswXX0KbU9icz1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihlKXt2YXIgd2FzVGFibGVSZWxhdGVkPWZ1bmN0aW9uKG5vZGVzKXtyZXR1cm4gbm9kZXMmJm5vZGVzWzBdJiYobm9kZXNbMF0ubm9kZU5hbWU9PSJUSEVBRCJ8fG5vZGVzWzBdLm5vZGVOYW1lPT0iVEQifHxub2Rlc1swXS5ub2RlTmFtZT09IlRIIil9O2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXtpZighKHdhc1RhYmxlUmVsYXRlZChlW2ldLmFkZGVkTm9kZXMpfHx3YXNUYWJsZVJlbGF0ZWQoZVtpXS5yZW1vdmVkTm9kZXMpKSl7cmVmbG93RXZlbnQoKTticmVha319fSk7bU9icy5vYnNlcnZlKG11dGF0aW9uRWxlbWVudCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KX0KJHRhYmxlLmRhdGEoJ2Zsb2F0VGhlYWQtYXR0YWNoZWQnLHtkZXN0cm95OmZ1bmN0aW9uKGUsaXNQcmludEV2ZW50KXt2YXIgbnM9Jy5mdGgtJytmbG9hdFRoZWFkSWQ7dW5mbG9hdCgpOyR0YWJsZS5jc3MobGF5b3V0QXV0byk7JHRhYmxlQ29sR3JvdXAucmVtb3ZlKCk7Y3JlYXRlRWxlbWVudHMmJiRmdGhHcnAucmVtb3ZlKCk7aWYoJG5ld0hlYWRlci5wYXJlbnQoKS5sZW5ndGgpeyRuZXdIZWFkZXIucmVwbGFjZVdpdGgoJGhlYWRlcil9CnRyaWdnZXJGbG9hdEV2ZW50KCExKTtpZihjYW5PYnNlcnZlTXV0YXRpb25zKXttT2JzLmRpc2Nvbm5lY3QoKTttT2JzPW51bGx9CiR0YWJsZS5vZmYoJ3JlZmxvdyByZWZsb3dlZCcpOyRzY3JvbGxDb250YWluZXIub2ZmKG5zKTskcmVzcG9uc2l2ZUNvbnRhaW5lci5vZmYobnMpO2lmKHdyYXBwZWRDb250YWluZXIpe2lmKCRzY3JvbGxDb250YWluZXIubGVuZ3RoKXskc2Nyb2xsQ29udGFpbmVyLnVud3JhcCgpfQplbHNleyR0YWJsZS51bndyYXAoKX19CmlmKGxvY2tlZCl7JHNjcm9sbENvbnRhaW5lci5kYXRhKCdmbG9hdFRoZWFkLWNvbnRhaW5lcldyYXAnLCExKX1lbHNleyR0YWJsZS5kYXRhKCdmbG9hdFRoZWFkLWNvbnRhaW5lcldyYXAnLCExKX0KJHRhYmxlLmNzcygnbWluV2lkdGgnLG9yaWdpbmFsVGFibGVNaW5XaWR0aCk7JGZsb2F0Q29udGFpbmVyLnJlbW92ZSgpOyR0YWJsZS5kYXRhKCdmbG9hdFRoZWFkLWF0dGFjaGVkJywhMSk7JHdpbmRvdy5vZmYobnMpO2lmKCFpc1ByaW50RXZlbnQpe3dpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgicHJpbnQiKS5yZW1vdmVMaXN0ZW5lcihwcmludEV2ZW50KTtiZWZvcmVQcmludD1hZnRlclByaW50PWZ1bmN0aW9uKCl7fX19LHJlZmxvdzpmdW5jdGlvbigpe3JlZmxvd0V2ZW50KCl9LHNldEhlYWRlckhlaWdodDpmdW5jdGlvbigpe3NldEhlYWRlckhlaWdodCgpfSxnZXRGbG9hdENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiAkZmxvYXRDb250YWluZXJ9LGdldFJvd0dyb3VwczpmdW5jdGlvbigpe2lmKGhlYWRlckZsb2F0ZWQpe3JldHVybiAkZmxvYXRDb250YWluZXIuZmluZCgnPnRhYmxlPnRoZWFkJykuYWRkKCR0YWJsZS5jaGlsZHJlbigidGJvZHksdGZvb3QiKSl9ZWxzZXtyZXR1cm4gJHRhYmxlLmNoaWxkcmVuKCJ0aGVhZCx0Ym9keSx0Zm9vdCIpfX19KX0pO3JldHVybiB0aGlzfX0pKGpRdWVyeSk7KGZ1bmN0aW9uKCQpeyQuZmxvYXRUaGVhZD0kLmZsb2F0VGhlYWR8fHt9OyQuZmxvYXRUaGVhZC5fPXdpbmRvdy5ffHwoZnVuY3Rpb24oKXt2YXIgdGhhdD17fTt2YXIgaGFzT3duUHJvcGVydHk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxpc1RoaW5ncz1bJ0FyZ3VtZW50cycsJ0Z1bmN0aW9uJywnU3RyaW5nJywnTnVtYmVyJywnRGF0ZScsJ1JlZ0V4cCddO3RoYXQuaGFzPWZ1bmN0aW9uKG9iaixrZXkpe3JldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixrZXkpfTt0aGF0LmtleXM9ZnVuY3Rpb24ob2JqKXtpZihvYmohPT1PYmplY3Qob2JqKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG9iamVjdCcpO3ZhciBrZXlzPVtdO2Zvcih2YXIga2V5IGluIG9iailpZih0aGF0LmhhcyhvYmosa2V5KSlrZXlzLnB1c2goa2V5KTtyZXR1cm4ga2V5c307dmFyIGlkQ291bnRlcj0wO3RoYXQudW5pcXVlSWQ9ZnVuY3Rpb24ocHJlZml4KXt2YXIgaWQ9KytpZENvdW50ZXIrJyc7cmV0dXJuIHByZWZpeD9wcmVmaXgraWQ6aWR9OyQuZWFjaChpc1RoaW5ncyxmdW5jdGlvbigpe3ZhciBuYW1lPXRoaXM7dGhhdFsnaXMnK25hbWVdPWZ1bmN0aW9uKG9iail7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopPT0nW29iamVjdCAnK25hbWUrJ10nfX0pO3RoYXQuZGVib3VuY2U9ZnVuY3Rpb24oZnVuYyx3YWl0LGltbWVkaWF0ZSl7dmFyIHRpbWVvdXQsYXJncyxjb250ZXh0LHRpbWVzdGFtcCxyZXN1bHQ7cmV0dXJuIGZ1bmN0aW9uKCl7Y29udGV4dD10aGlzO2FyZ3M9YXJndW1lbnRzO3RpbWVzdGFtcD1uZXcgRGF0ZSgpO3ZhciBsYXRlcj1mdW5jdGlvbigpe3ZhciBsYXN0PShuZXcgRGF0ZSgpKS10aW1lc3RhbXA7aWYobGFzdDx3YWl0KXt0aW1lb3V0PXNldFRpbWVvdXQobGF0ZXIsd2FpdC1sYXN0KX1lbHNle3RpbWVvdXQ9bnVsbDtpZighaW1tZWRpYXRlKXJlc3VsdD1mdW5jLmFwcGx5KGNvbnRleHQsYXJncyl9fTt2YXIgY2FsbE5vdz1pbW1lZGlhdGUmJiF0aW1lb3V0O2lmKCF0aW1lb3V0KXt0aW1lb3V0PXNldFRpbWVvdXQobGF0ZXIsd2FpdCl9CmlmKGNhbGxOb3cpcmVzdWx0PWZ1bmMuYXBwbHkoY29udGV4dCxhcmdzKTtyZXR1cm4gcmVzdWx0fX07cmV0dXJuIHRoYXR9KSgpfSkoalF1ZXJ5KTsoZnVuY3Rpb24oKXt2YXIgaW5pdGlhbGl6aW5nPSExLGZuVGVzdD0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87dGhpcy5DbGFzcz1mdW5jdGlvbigpe307Q2xhc3MuZXh0ZW5kPWZ1bmN0aW9uKHByb3Ape3ZhciBfc3VwZXI9dGhpcy5wcm90b3R5cGU7aW5pdGlhbGl6aW5nPSEwO3ZhciBwcm90b3R5cGU9bmV3IHRoaXMoKTtpbml0aWFsaXppbmc9ITE7Zm9yKHZhciBuYW1lIGluIHByb3Ape3Byb3RvdHlwZVtuYW1lXT10eXBlb2YgcHJvcFtuYW1lXT09ImZ1bmN0aW9uIiYmdHlwZW9mIF9zdXBlcltuYW1lXT09ImZ1bmN0aW9uIiYmZm5UZXN0LnRlc3QocHJvcFtuYW1lXSk/KGZ1bmN0aW9uKG5hbWUsZm4pe3JldHVybiBmdW5jdGlvbigpe3ZhciB0bXA9dGhpcy5fc3VwZXI7dGhpcy5fc3VwZXI9X3N1cGVyW25hbWVdO3ZhciByZXQ9Zm4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuX3N1cGVyPXRtcDtyZXR1cm4gcmV0fX0pKG5hbWUscHJvcFtuYW1lXSk6cHJvcFtuYW1lXX0KZnVuY3Rpb24gQ2xhc3MoKXtpZighaW5pdGlhbGl6aW5nJiZ0aGlzLmluaXQpCnRoaXMuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9CkNsYXNzLnByb3RvdHlwZT1wcm90b3R5cGU7Q2xhc3MuY29uc3RydWN0b3I9Q2xhc3M7Q2xhc3MuZXh0ZW5kPWFyZ3VtZW50cy5jYWxsZWU7cmV0dXJuIENsYXNzfX0pKCk7SlNMaXN0Qm94PWZ1bmN0aW9uKGNvbmZpZ09iamVjdCl7dGhpcy5pdGVtcz1bXTt0aGlzLmNvbnRhaW5lclNlbGVjdG9yPScjJytjb25maWdPYmplY3QuY29udGFpbmVyU2VsZWN0b3I7JCh0aGlzLmNvbnRhaW5lclNlbGVjdG9yKS5jc3MoInBvc2l0aW9uIiwicmVsYXRpdmUiKTt2YXIgdG1wQ29udGFpbmVyPSQoJzxkaXYgY2xhc3M9Im1lbnVDb250YWluZXJKU0xpc3RCb3giIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDsiPjwvZGl2PicpO2lmKGNvbmZpZ09iamVjdC5zdHlsZW1hcCkKdG1wQ29udGFpbmVyLmNzcyhjb25maWdPYmplY3Quc3R5bGVtYXApO3RoaXMubWVudUNvbnRhaW5lckhUTUw9dG1wQ29udGFpbmVyLmNsb25lKCkud3JhcCgnPGRpdj48L2Rpdj4nKS5wYXJlbnQoKS5odG1sKCk7dGhpcy5TZWxlY3RlZEl0ZW09bnVsbDt0aGlzLlNlbGVjdGVkSW5kZXg9bnVsbH07SlNMaXN0Qm94LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaXRlbXM9W107dGhpcy5yZWZyZXNoKCl9O0pTTGlzdEJveC5wcm90b3R5cGUuYWRkSXRlbT1mdW5jdGlvbihpdGVtKXt0aGlzLml0ZW1zLnB1c2goaXRlbSk7dGhpcy5yZWZyZXNoKCl9O0pTTGlzdEJveC5wcm90b3R5cGUuYWRkSXRlbXM9ZnVuY3Rpb24obmV3SXRlbXMpe2Zvcih2YXIgaSBpbiBuZXdJdGVtcykKe3RoaXMuaXRlbXMucHVzaChuZXdJdGVtc1tpXSl9CnRoaXMucmVmcmVzaCgpfTtKU0xpc3RCb3gucHJvdG90eXBlLnJlbW92ZUF0PWZ1bmN0aW9uKGluZGV4KXt0aGlzLml0ZW1zLnNwbGljZShpbmRleCwxKTt0aGlzLnJlZnJlc2goKX07SlNMaXN0Qm94LnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5tZW51Q29udGFpbmVyKQp0aGlzLm1lbnVDb250YWluZXIudW5iaW5kKCk7JCh0aGlzLmNvbnRhaW5lclNlbGVjdG9yKS5odG1sKHRoaXMubWVudUNvbnRhaW5lckhUTUwpO3RoaXMubWVudUNvbnRhaW5lcj0kKHRoaXMuY29udGFpbmVyU2VsZWN0b3IrJyAubWVudUNvbnRhaW5lckpTTGlzdEJveCcpO2Zvcih2YXIgaSBpbiB0aGlzLml0ZW1zKQp7dmFyIGl0ZW09dGhpcy5pdGVtc1tpXTt2YXIgcmVuZGVyZWRJdGVtSFRNTD1pdGVtLnJlbmRlcigpO3ZhciBpdGVtQWN0aXZhdGVkPSExO2lmKHRoaXMuU2VsZWN0ZWRJdGVtPT1pdGVtKQppdGVtQWN0aXZhdGVkPSEwOyQoIjxsaT48L2xpPiIpLmRhdGEoImpzbGlzdGJveC5pdGVtIixpdGVtKS5hdHRyKCJlbmFibGVkIixpdGVtLmVuYWJsZWQpLmF0dHIoImFjdGl2YXRlZCIsaXRlbUFjdGl2YXRlZCkuYXBwZW5kKCQocmVuZGVyZWRJdGVtSFRNTCkpLmFwcGVuZFRvKHRoaXMubWVudUNvbnRhaW5lcil9CnZhciBzZWxmPXRoaXM7JCh0aGlzLm1lbnVDb250YWluZXIpLmxpc3Qoe3NlbGVjdGVkOmZ1bmN0aW9uKGV2ZW50LHVpKXt2YXIgaXRlbT11aS5pdGVtLmRhdGEoImpzbGlzdGJveC5pdGVtIik7c2VsZi5zZXRTZWxlY3RlZEl0ZW0oaXRlbSk7aXRlbS5vbkNsaWNrKCk7cmV0dXJuITB9LGRibHNlbGVjdGVkOmZ1bmN0aW9uKGV2ZW50LHVpKXt2YXIgaXRlbT11aS5pdGVtLmRhdGEoImpzbGlzdGJveC5pdGVtIik7aXRlbS5vbkRibENsaWNrKCk7cmV0dXJuITB9fSl9O0pTTGlzdEJveC5wcm90b3R5cGUuc2V0U2VsZWN0ZWRJdGVtPWZ1bmN0aW9uKGl0ZW0pe3RoaXMuU2VsZWN0ZWRJdGVtPWl0ZW07dGhpcy5TZWxlY3RlZEluZGV4PXRoaXMuZ2V0SXRlbUluZGV4KGl0ZW0pfTtKU0xpc3RCb3gucHJvdG90eXBlLnNldFNlbGVjdGVkSW5kZXg9ZnVuY3Rpb24oaW5kZXgpe3RoaXMuU2VsZWN0ZWRJdGVtPXRoaXMuaXRlbXNbaW5kZXhdO3RoaXMuU2VsZWN0ZWRJbmRleD1pbmRleH07SlNMaXN0Qm94LnByb3RvdHlwZS5nZXRJdGVtSW5kZXg9ZnVuY3Rpb24oaXRlbSl7Zm9yKHZhciBpIGluIHRoaXMuaXRlbXMpCntpZih0aGlzLml0ZW1zW2ldPT1pdGVtKQpyZXR1cm4gaX0KcmV0dXJuIG51bGx9O0pTTGlzdEJveC5JdGVtPUNsYXNzLmV4dGVuZCh7dmFsdWU6IiIsZW5hYmxlZDohMCxpbml0OmZ1bmN0aW9uKCl7fSxyZW5kZXI6ZnVuY3Rpb24oKXtyZXR1cm4nPGEgaHJlZj0iIyI+Jyt0aGlzLnZhbHVlKyc8L2E+J30sb25DbGljazpmdW5jdGlvbigpe30sb25EYmxDbGljazpmdW5jdGlvbigpe319KTsoZnVuY3Rpb24oJCl7JC53aWRnZXQoInVpLmxpc3QiLHtfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpczt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5hdHRyKHtyb2xlOiJsaXN0Ym94IiwiYXJpYS1hY3RpdmVkZXNjZW5kYW50IjoidWktYWN0aXZlLW1lbnVpdGVtIn0pLmNsaWNrKGZ1bmN0aW9uKGV2ZW50KXtpZighJChldmVudC50YXJnZXQpLmNsb3Nlc3QoIi51aS1tZW51LWl0ZW0gYSIpLmxlbmd0aCl7cmV0dXJufQppZihzZWxmLmhpZ2hsaWdodGVkKQp7dmFyIGhpZ2hsaWdodGVkSXRlbT1zZWxmLmhpZ2hsaWdodGVkO2lmKHNlbGYuY2xpY2tIYW5kbGVyJiYhc2VsZi5jbGlja0hhbmRsZXIoKSl7cmV0dXJufQpzZWxmLmFjdGl2YXRlKGV2ZW50LGhpZ2hsaWdodGVkSXRlbSk7ZXZlbnQucHJldmVudERlZmF1bHQoKTtzZWxmLnNlbGVjdChldmVudCl9fSkuZGJsY2xpY2soZnVuY3Rpb24oZXZlbnQpe2lmKCEkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSBhIikubGVuZ3RoKXtyZXR1cm59CmlmKHNlbGYuaGlnaGxpZ2h0ZWQpCntldmVudC5wcmV2ZW50RGVmYXVsdCgpO3NlbGYuZGJsc2VsZWN0KGV2ZW50KX19KTt0aGlzLnJlZnJlc2goKX0sc2V0Q2xpY2tIYW5kbGVyOmZ1bmN0aW9uKGhhbmRsZXIpe3RoaXMuY2xpY2tIYW5kbGVyPWhhbmRsZXJ9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3ZhciBpdGVtcz10aGlzLmVsZW1lbnQuY2hpbGRyZW4oImxpOm5vdCgudWktbWVudS1pdGVtKTpoYXMoYSkiKS5hZGRDbGFzcygidWktbWVudS1pdGVtIikuYXR0cigicm9sZSIsIm1lbnVpdGVtIik7aXRlbXMuY2hpbGRyZW4oImEiKS5hZGRDbGFzcygidWktY29ybmVyLWFsbCIpLmF0dHIoInRhYmluZGV4IiwtMSkubW91c2VlbnRlcihmdW5jdGlvbihldmVudCl7c2VsZi5oaWdobGlnaHQoZXZlbnQsJCh0aGlzKS5wYXJlbnQoKSl9KS5tb3VzZWxlYXZlKGZ1bmN0aW9uKCl7c2VsZi5sb3dsaWdodCgpfSk7Zm9yKHZhciBpPTA7aTxpdGVtcy5sZW5ndGg7aSsrKQp7dmFyIGl0ZW09JChpdGVtc1tpXSk7aWYoaXRlbS5hdHRyKCJhY3RpdmF0ZWQiKT09InRydWUiKQpzZWxmLmFjdGl2YXRlKG51bGwsaXRlbSl9fSxoaWdobGlnaHQ6ZnVuY3Rpb24oZXZlbnQsaXRlbSl7dGhpcy5sb3dsaWdodCgpO2lmKGl0ZW0uYXR0cigiZW5hYmxlZCIpPT0idHJ1ZSIpCnt0aGlzLmhpZ2hsaWdodGVkPWl0ZW0uZXEoMCkuY2hpbGRyZW4oImEiKS5hZGRDbGFzcygidWktbGlzdGJveC1zdGF0ZS1oaWdobGlnaHQiKS5lbmQoKX19LGxvd2xpZ2h0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGlnaGxpZ2h0ZWQpe3JldHVybn0KdGhpcy5oaWdobGlnaHRlZC5jaGlsZHJlbigiYSIpLnJlbW92ZUNsYXNzKCJ1aS1saXN0Ym94LXN0YXRlLWhpZ2hsaWdodCIpO3RoaXMuaGlnaGxpZ2h0ZWQ9bnVsbH0sYWN0aXZhdGU6ZnVuY3Rpb24oZXZlbnQsaXRlbSl7dGhpcy5kZWFjdGl2YXRlKCk7aWYodGhpcy5oYXNTY3JvbGwoKSl7dmFyIG9mZnNldD1pdGVtLm9mZnNldCgpLnRvcC10aGlzLmVsZW1lbnQub2Zmc2V0KCkudG9wLHNjcm9sbD10aGlzLmVsZW1lbnQuYXR0cigic2Nyb2xsVG9wIiksZWxlbWVudEhlaWdodD10aGlzLmVsZW1lbnQuaGVpZ2h0KCk7aWYob2Zmc2V0PDApe3RoaXMuZWxlbWVudC5hdHRyKCJzY3JvbGxUb3AiLHNjcm9sbCtvZmZzZXQpfWVsc2UgaWYob2Zmc2V0Pj1lbGVtZW50SGVpZ2h0KXt0aGlzLmVsZW1lbnQuYXR0cigic2Nyb2xsVG9wIixzY3JvbGwrb2Zmc2V0LWVsZW1lbnRIZWlnaHQraXRlbS5oZWlnaHQoKSl9fQp0aGlzLmFjdGl2ZT1pdGVtLmVxKDApLmNoaWxkcmVuKCJhIikuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIikuYXR0cigiaWQiLCJ1aS1hY3RpdmUtbWVudWl0ZW0iKS5lbmQoKTt0aGlzLl90cmlnZ2VyKCJmb2N1cyIsZXZlbnQse2l0ZW06aXRlbX0pfSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYWN0aXZlKXtyZXR1cm59CnRoaXMuYWN0aXZlLmNoaWxkcmVuKCJhIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIikucmVtb3ZlQXR0cigiaWQiKTt0aGlzLl90cmlnZ2VyKCJibHVyIik7dGhpcy5hY3RpdmU9bnVsbH0sbmV4dDpmdW5jdGlvbihldmVudCl7dGhpcy5tb3ZlKCJuZXh0IiwiLnVpLW1lbnUtaXRlbTpmaXJzdCIsZXZlbnQpfSxwcmV2aW91czpmdW5jdGlvbihldmVudCl7dGhpcy5tb3ZlKCJwcmV2IiwiLnVpLW1lbnUtaXRlbTpsYXN0IixldmVudCl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUucHJldkFsbCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aH0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLm5leHRBbGwoIi51aS1tZW51LWl0ZW0iKS5sZW5ndGh9LG1vdmU6ZnVuY3Rpb24oZGlyZWN0aW9uLGVkZ2UsZXZlbnQpe2lmKCF0aGlzLmFjdGl2ZSl7dGhpcy5hY3RpdmF0ZShldmVudCx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oZWRnZSkpO3JldHVybn0KdmFyIG5leHQ9dGhpcy5hY3RpdmVbZGlyZWN0aW9uKyJBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKDApO2lmKG5leHQubGVuZ3RoKXt0aGlzLmFjdGl2YXRlKGV2ZW50LG5leHQpfWVsc2V7dGhpcy5hY3RpdmF0ZShldmVudCx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oZWRnZSkpfX0sbmV4dFBhZ2U6ZnVuY3Rpb24oZXZlbnQpe2lmKHRoaXMuaGFzU2Nyb2xsKCkpe2lmKCF0aGlzLmFjdGl2ZXx8dGhpcy5sYXN0KCkpe3RoaXMuYWN0aXZhdGUoZXZlbnQsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmZpcnN0IikpO3JldHVybn0KdmFyIGJhc2U9dGhpcy5hY3RpdmUub2Zmc2V0KCkudG9wLGhlaWdodD10aGlzLmVsZW1lbnQuaGVpZ2h0KCkscmVzdWx0PXRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBjbG9zZT0kKHRoaXMpLm9mZnNldCgpLnRvcC1iYXNlLWhlaWdodCskKHRoaXMpLmhlaWdodCgpO3JldHVybiBjbG9zZTwxMCYmY2xvc2U+LTEwfSk7aWYoIXJlc3VsdC5sZW5ndGgpe3Jlc3VsdD10aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW06bGFzdCIpfQp0aGlzLmFjdGl2YXRlKGV2ZW50LHJlc3VsdCl9ZWxzZXt0aGlzLmFjdGl2YXRlKGV2ZW50LHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcighdGhpcy5hY3RpdmV8fHRoaXMubGFzdCgpPyI6Zmlyc3QiOiI6bGFzdCIpKX19LHByZXZpb3VzUGFnZTpmdW5jdGlvbihldmVudCl7aWYodGhpcy5oYXNTY3JvbGwoKSl7aWYoIXRoaXMuYWN0aXZlfHx0aGlzLmZpcnN0KCkpe3RoaXMuYWN0aXZhdGUoZXZlbnQsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmxhc3QiKSk7cmV0dXJufQp2YXIgYmFzZT10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3AsaGVpZ2h0PXRoaXMuZWxlbWVudC5oZWlnaHQoKTtyZXN1bHQ9dGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtIikuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGNsb3NlPSQodGhpcykub2Zmc2V0KCkudG9wLWJhc2UraGVpZ2h0LSQodGhpcykuaGVpZ2h0KCk7cmV0dXJuIGNsb3NlPDEwJiZjbG9zZT4tMTB9KTtpZighcmVzdWx0Lmxlbmd0aCl7cmVzdWx0PXRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbTpmaXJzdCIpfQp0aGlzLmFjdGl2YXRlKGV2ZW50LHJlc3VsdCl9ZWxzZXt0aGlzLmFjdGl2YXRlKGV2ZW50LHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcighdGhpcy5hY3RpdmV8fHRoaXMuZmlyc3QoKT8iOmxhc3QiOiI6Zmlyc3QiKSl9fSxoYXNTY3JvbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50LmhlaWdodCgpPHRoaXMuZWxlbWVudC5hdHRyKCJzY3JvbGxIZWlnaHQiKX0sc2VsZWN0OmZ1bmN0aW9uKGV2ZW50KXt0aGlzLl90cmlnZ2VyKCJzZWxlY3RlZCIsZXZlbnQse2l0ZW06dGhpcy5hY3RpdmV9KX0sZGJsc2VsZWN0OmZ1bmN0aW9uKGV2ZW50KXt0aGlzLl90cmlnZ2VyKCJkYmxzZWxlY3RlZCIsZXZlbnQse2l0ZW06dGhpcy5hY3RpdmV9KX19KX0oalF1ZXJ5KSk=(Line 721)
Message:
No original img found, please add an <img> tag inside evenZoom selector
console-api warning URL: data:text/javascript;base64,KGZ1bmN0aW9uKCQpe3ZhciBEQVRBX09SSUdJTkFMX0RPTV9LRVk9J2NvbHVtbml6ZXItb3JpZ2luYWwtZG9tJzskLmZuLmNvbHVtbml6ZT1mdW5jdGlvbihvcHRpb25zKXt0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgJGVsPSQodGhpcyk7JGVsLmRhdGEoREFUQV9PUklHSU5BTF9ET01fS0VZLCRlbC5jbG9uZSghMCwhMCkpfSk7dGhpcy5jb2xzPVtdO3RoaXMub2Zmc2V0PTA7dGhpcy5iZWZvcmU9W107dGhpcy5sYXN0T3RoZXI9MDt0aGlzLnByZXZNYXg9MDt0aGlzLmRlYnVnPTA7dGhpcy5zZXRDb2x1bW5TdGFydD1udWxsO3RoaXMuZWxpcHNpc1RleHQ9Jyc7dmFyIGRlZmF1bHRzPXt3aWR0aDo0MDAsY29sdW1uczohMSxidWlsZE9uY2U6ITEsb3ZlcmZsb3c6ITEsZG9uZUZ1bmM6ZnVuY3Rpb24oKXt9LHRhcmdldDohMSxpZ25vcmVJbWFnZUxvYWRpbmc6ITAsY29sdW1uRmxvYXQ6ImxlZnQiLGxhc3ROZXZlclRhbGxlc3Q6ITEsYWNjdXJhY3k6ITEscHJlY2lzZTohMSxtYW51YWxCcmVha3M6ITEsZGlzYWJsZVNpbmdsZTohMSxjc3NDbGFzc1ByZWZpeDoiIixlbGlwc2lzVGV4dDonLi4uJyxkZWJ1ZzowfTtvcHRpb25zPSQuZXh0ZW5kKGRlZmF1bHRzLG9wdGlvbnMpO3ZhciB0YWJsZXM9bmV3IEFycmF5KCk7JCgndGFibGUnKS5lYWNoKGZ1bmN0aW9uKCl7aWYoISQodGhpcykuaGFzQ2xhc3MoJ3RhYmxlU2F2ZWQnKSl7JCh0aGlzKS5hZGRDbGFzcygndGFibGVTYXZlZCcpCiQodGhpcykuYWRkQ2xhc3MoJ3RhYmxlSUQtJyt0YWJsZXMubGVuZ3RoKQp0YWJsZXMucHVzaCh7dGFibGVJRDondGFibGVJRC0nK3RhYmxlcy5sZW5ndGgsdGhlYWQ6JCh0aGlzKS5maW5kKCd0aGVhZDpmaXJzdCcpLmNsb25lKCksdGZvb3Q6JCh0aGlzKS5maW5kKCd0Zm9vdDpmaXJzdCcpLmNsb25lKCl9KX19KTtmdW5jdGlvbiBmaXhUYWJsZXMoJHB1bGxPdXRIZXJlKXtmb3IoaT0wO2k8dGFibGVzLmxlbmd0aDtpKyspe2lmKCRwdWxsT3V0SGVyZS5pcygidGFibGUiKSl7aWYoJHB1bGxPdXRIZXJlLmNoaWxkcmVuKCd0Zm9vdCcpLmxlbmd0aD09MCYmJHB1bGxPdXRIZXJlLmhhc0NsYXNzKHRhYmxlc1tpXS50YWJsZUlEKSl7JCh0YWJsZXNbaV0udGZvb3QpLmNsb25lKCkucHJlcGVuZFRvKCRwdWxsT3V0SGVyZSl9CmlmKCRwdWxsT3V0SGVyZS5jaGlsZHJlbigndGhlYWQnKS5sZW5ndGg9PTAmJiRwdWxsT3V0SGVyZS5oYXNDbGFzcyh0YWJsZXNbaV0udGFibGVJRCkpeyQodGFibGVzW2ldLnRoZWFkKS5jbG9uZSgpLnByZXBlbmRUbygkcHVsbE91dEhlcmUpfX0KJHB1bGxPdXRIZXJlLmZpbmQoJ3RhYmxlIC4nK3RhYmxlc1tpXS50YWJsZUlEKS5lYWNoKGZ1bmN0aW9uKCl7aWYoJCh0aGlzKS5jaGlsZHJlbigndGZvb3QnKS5sZW5ndGg9PTApeyQodGFibGVzW2ldLnRmb290KS5jbG9uZSgpLnByZXBlbmRUbyh0aGlzKX0KaWYoJCh0aGlzKS5jaGlsZHJlbigndGhlYWQnKS5sZW5ndGg9PTApeyQodGFibGVzW2ldLnRoZWFkKS5jbG9uZSgpLnByZXBlbmRUbyh0aGlzKX19KX19CmlmKHR5cGVvZihvcHRpb25zLndpZHRoKT09InN0cmluZyIpe29wdGlvbnMud2lkdGg9cGFyc2VJbnQob3B0aW9ucy53aWR0aCwxMCk7aWYoaXNOYU4ob3B0aW9ucy53aWR0aCkpe29wdGlvbnMud2lkdGg9ZGVmYXVsdHMud2lkdGh9fQppZih0eXBlb2Ygb3B0aW9ucy5zZXRDb2x1bW5TdGFydD09J2Z1bmN0aW9uJyl7dGhpcy5zZXRDb2x1bW5TdGFydD1vcHRpb25zLnNldENvbHVtblN0YXJ0fQppZih0eXBlb2Ygb3B0aW9ucy5lbGlwc2lzVGV4dD09J3N0cmluZycpe3RoaXMuZWxpcHNpc1RleHQ9b3B0aW9ucy5lbGlwc2lzVGV4dH0KaWYob3B0aW9ucy5kZWJ1Zyl7dGhpcy5kZWJ1Zz1vcHRpb25zLmRlYnVnfQppZighb3B0aW9ucy5zZXRXaWR0aCl7aWYob3B0aW9ucy5wcmVjaXNlKXtvcHRpb25zLnNldFdpZHRoPWZ1bmN0aW9uKG51bUNvbHMpe3JldHVybiAxMDAvbnVtQ29sc319ZWxzZXtvcHRpb25zLnNldFdpZHRoPWZ1bmN0aW9uKG51bUNvbHMpe3JldHVybiBNYXRoLmZsb29yKDEwMC9udW1Db2xzKX19fQpmdW5jdGlvbiBhcHBlbmRTYWZlKCR0YXJnZXQsJGVsZW0pe3RyeXskdGFyZ2V0LmFwcGVuZCgkZWxlbSl9Y2F0Y2goZSl7JHRhcmdldFswXS5hcHBlbmRDaGlsZCgkZWxlbVswXSl9fQpyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyICRpbkJveD1vcHRpb25zLnRhcmdldD8kKG9wdGlvbnMudGFyZ2V0KTokKHRoaXMpO3ZhciBtYXhIZWlnaHQ9JCh0aGlzKS5oZWlnaHQoKTt2YXIgJGNhY2hlPSQoJzxkaXY+PC9kaXY+Jyk7dmFyIGxhc3RXaWR0aD0wO3ZhciBjb2x1bW5pemluZz0hMTt2YXIgbWFudWFsQnJlYWtzPW9wdGlvbnMubWFudWFsQnJlYWtzO3ZhciBjc3NDbGFzc1ByZWZpeD1kZWZhdWx0cy5jc3NDbGFzc1ByZWZpeDtpZih0eXBlb2Yob3B0aW9ucy5jc3NDbGFzc1ByZWZpeCk9PSJzdHJpbmciKXtjc3NDbGFzc1ByZWZpeD1vcHRpb25zLmNzc0NsYXNzUHJlZml4fQp2YXIgYWRqdXN0bWVudD0wO2FwcGVuZFNhZmUoJGNhY2hlLCQodGhpcykuY29udGVudHMoKS5jbG9uZSghMCkpO2lmKCFvcHRpb25zLmlnbm9yZUltYWdlTG9hZGluZyYmIW9wdGlvbnMudGFyZ2V0KXtpZighJGluQm94LmRhdGEoImltYWdlTG9hZGVkIikpeyRpbkJveC5kYXRhKCJpbWFnZUxvYWRlZCIsITApO2lmKCQodGhpcykuZmluZCgiaW1nIikubGVuZ3RoPjApe3ZhciBmdW5jPWZ1bmN0aW9uKCRpbkJveCwkY2FjaGUpe3JldHVybiBmdW5jdGlvbigpe2lmKCEkaW5Cb3guZGF0YSgiZmlyc3RJbWFnZUxvYWRlZCIpKXskaW5Cb3guZGF0YSgiZmlyc3RJbWFnZUxvYWRlZCIsInRydWUiKTthcHBlbmRTYWZlKCRpbkJveC5lbXB0eSgpLCRjYWNoZS5jaGlsZHJlbigpLmNsb25lKCEwKSk7JGluQm94LmNvbHVtbml6ZShvcHRpb25zKX19fSgkKHRoaXMpLCRjYWNoZSk7JCh0aGlzKS5maW5kKCJpbWciKS5vbmUoImxvYWQiLGZ1bmMpOyQodGhpcykuZmluZCgiaW1nIikub25lKCJhYm9ydCIsZnVuYyk7cmV0dXJufX19CiRpbkJveC5lbXB0eSgpO2NvbHVtbml6ZUl0KCk7aWYoIW9wdGlvbnMuYnVpbGRPbmNlKXskKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCl7aWYoIW9wdGlvbnMuYnVpbGRPbmNlKXtpZigkaW5Cb3guZGF0YSgidGltZW91dCIpKXtjbGVhclRpbWVvdXQoJGluQm94LmRhdGEoInRpbWVvdXQiKSl9CiRpbkJveC5kYXRhKCJ0aW1lb3V0IixzZXRUaW1lb3V0KGNvbHVtbml6ZUl0LDIwMCkpfX0pfQpmdW5jdGlvbiBwcmVmaXhUaGVDbGFzc05hbWUoY2xhc3NOYW1lLHdpdGhEb3Qpe3ZhciBkb3Q9d2l0aERvdD8iLiI6IiI7aWYoY3NzQ2xhc3NQcmVmaXgubGVuZ3RoKXtyZXR1cm4gZG90K2Nzc0NsYXNzUHJlZml4KyItIitjbGFzc05hbWV9CnJldHVybiBkb3QrY2xhc3NOYW1lfQpmdW5jdGlvbiBjb2x1bW5pemUoJHB1dEluSGVyZSwkcHVsbE91dEhlcmUsJHBhcmVudENvbHVtbix0YXJnZXRIZWlnaHQpe3doaWxlKChtYW51YWxCcmVha3N8fCRwYXJlbnRDb2x1bW4uaGVpZ2h0KCk8dGFyZ2V0SGVpZ2h0KSYmJHB1bGxPdXRIZXJlWzBdLmNoaWxkTm9kZXMubGVuZ3RoKXt2YXIgbm9kZT0kcHVsbE91dEhlcmVbMF0uY2hpbGROb2Rlc1swXTtpZigkKG5vZGUpLmZpbmQocHJlZml4VGhlQ2xhc3NOYW1lKCJjb2x1bW5icmVhayIsITApKS5sZW5ndGgpe3JldHVybn0KaWYoJChub2RlKS5oYXNDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImNvbHVtbmJyZWFrIikpKXtyZXR1cm59CmFwcGVuZFNhZmUoJHB1dEluSGVyZSwkKG5vZGUpKX0KaWYoJHB1dEluSGVyZVswXS5jaGlsZE5vZGVzLmxlbmd0aD09PTApcmV0dXJuO3ZhciBraWRzPSRwdXRJbkhlcmVbMF0uY2hpbGROb2Rlczt2YXIgbGFzdEtpZD1raWRzW2tpZHMubGVuZ3RoLTFdOyRwdXRJbkhlcmVbMF0ucmVtb3ZlQ2hpbGQobGFzdEtpZCk7dmFyICRpdGVtPSQobGFzdEtpZCk7aWYoJGl0ZW1bMF0ubm9kZVR5cGU9PTMpe3ZhciBvVGV4dD0kaXRlbVswXS5ub2RlVmFsdWU7dmFyIGNvdW50ZXIyPW9wdGlvbnMud2lkdGgvMTg7aWYob3B0aW9ucy5hY2N1cmFjeSkKY291bnRlcjI9b3B0aW9ucy5hY2N1cmFjeTt2YXIgY29sdW1uVGV4dDt2YXIgbGF0ZXN0VGV4dE5vZGU9bnVsbDt3aGlsZSgkcGFyZW50Q29sdW1uLmhlaWdodCgpPHRhcmdldEhlaWdodCYmb1RleHQubGVuZ3RoKXt2YXIgaW5kZXhPZlNwYWNlPW9UZXh0LmluZGV4T2YoJyAnLGNvdW50ZXIyKTtpZihpbmRleE9mU3BhY2UhPS0xKXtjb2x1bW5UZXh0PW9UZXh0LnN1YnN0cmluZygwLGluZGV4T2ZTcGFjZSl9ZWxzZXtjb2x1bW5UZXh0PW9UZXh0fQpsYXRlc3RUZXh0Tm9kZT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2x1bW5UZXh0KTthcHBlbmRTYWZlKCRwdXRJbkhlcmUsJChsYXRlc3RUZXh0Tm9kZSkpO2lmKG9UZXh0Lmxlbmd0aD5jb3VudGVyMiYmaW5kZXhPZlNwYWNlIT0tMSl7b1RleHQ9b1RleHQuc3Vic3RyaW5nKGluZGV4T2ZTcGFjZSl9ZWxzZXtvVGV4dD0iIn19CmlmKCRwYXJlbnRDb2x1bW4uaGVpZ2h0KCk+PXRhcmdldEhlaWdodCYmbGF0ZXN0VGV4dE5vZGUhPT1udWxsKXskcHV0SW5IZXJlWzBdLnJlbW92ZUNoaWxkKGxhdGVzdFRleHROb2RlKTtvVGV4dD1sYXRlc3RUZXh0Tm9kZS5ub2RlVmFsdWUrb1RleHR9CmlmKG9UZXh0Lmxlbmd0aCl7JGl0ZW1bMF0ubm9kZVZhbHVlPW9UZXh0fWVsc2V7cmV0dXJuITF9fQppZigkcHVsbE91dEhlcmUuY29udGVudHMoKS5sZW5ndGgpeyRwdWxsT3V0SGVyZS5wcmVwZW5kKCRpdGVtKX1lbHNle2FwcGVuZFNhZmUoJHB1bGxPdXRIZXJlLCRpdGVtKX0KcmV0dXJuICRpdGVtWzBdLm5vZGVUeXBlPT0zfQpmdW5jdGlvbiBzcGxpdCgkcHV0SW5IZXJlLCRwdWxsT3V0SGVyZSwkcGFyZW50Q29sdW1uLHRhcmdldEhlaWdodCl7aWYoJHB1dEluSGVyZS5jb250ZW50cygiOmxhc3QiKS5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uYnJlYWsiLCEwKSkubGVuZ3RoKXtmaXhUYWJsZXMoJHB1bGxPdXRIZXJlKTtyZXR1cm59CmlmKCRwdXRJbkhlcmUuY29udGVudHMoIjpsYXN0IikuaGFzQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJjb2x1bW5icmVhayIpKSl7Zml4VGFibGVzKCRwdWxsT3V0SGVyZSk7cmV0dXJufQppZigkcHVsbE91dEhlcmUuY29udGVudHMoKS5sZW5ndGgpe3ZhciAkY2xvbmVNZT0kcHVsbE91dEhlcmUuY29udGVudHMoIjpmaXJzdCIpO2lmKHR5cGVvZiAkY2xvbmVNZS5nZXQoMCk9PSd1bmRlZmluZWQnfHwkY2xvbmVNZS5nZXQoMCkubm9kZVR5cGUhPTEpcmV0dXJuO3ZhciAkY2xvbmU9JGNsb25lTWUuY2xvbmUoITApO2lmKCRjbG9uZU1lLmhhc0NsYXNzKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uYnJlYWsiKSkpe2FwcGVuZFNhZmUoJHB1dEluSGVyZSwkY2xvbmUpOyRjbG9uZU1lLnJlbW92ZSgpfWVsc2UgaWYobWFudWFsQnJlYWtzKXthcHBlbmRTYWZlKCRwdXRJbkhlcmUsJGNsb25lKTskY2xvbmVNZS5yZW1vdmUoKX1lbHNlIGlmKCRjbG9uZS5nZXQoMCkubm9kZVR5cGU9PTEmJiEkY2xvbmUuaGFzQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJkb250ZW5kIikpKXthcHBlbmRTYWZlKCRwdXRJbkhlcmUsJGNsb25lKTtpZigkY2xvbmUuaXMoImltZyIpJiYkcGFyZW50Q29sdW1uLmhlaWdodCgpPHRhcmdldEhlaWdodCsyMCl7JGNsb25lTWUucmVtb3ZlKCl9ZWxzZSBpZigkY2xvbmVNZS5oYXNDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImRvbnRzcGxpdCIpKSYmJHBhcmVudENvbHVtbi5oZWlnaHQoKTx0YXJnZXRIZWlnaHQrMjApeyRjbG9uZU1lLnJlbW92ZSgpfWVsc2UgaWYoJGNsb25lLmlzKCJpbWciKXx8JGNsb25lTWUuaGFzQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJkb250c3BsaXQiKSkpeyRjbG9uZS5yZW1vdmUoKX1lbHNleyRjbG9uZS5lbXB0eSgpO2lmKCFjb2x1bW5pemUoJGNsb25lLCRjbG9uZU1lLCRwYXJlbnRDb2x1bW4sdGFyZ2V0SGVpZ2h0KSl7JGNsb25lTWUuYWRkQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJzcGxpdCIpKTtpZigkY2xvbmVNZS5nZXQoMCkudGFnTmFtZT09J09MJyl7dmFyIHN0YXJ0V2l0aD0kY2xvbmUuZ2V0KDApLmNoaWxkRWxlbWVudENvdW50KyRjbG9uZS5nZXQoMCkuc3RhcnQ7JGNsb25lTWUuYXR0cignc3RhcnQnLHN0YXJ0V2l0aCsxKX0KaWYoJGNsb25lTWUuY2hpbGRyZW4oKS5sZW5ndGgpe3NwbGl0KCRjbG9uZSwkY2xvbmVNZSwkcGFyZW50Q29sdW1uLHRhcmdldEhlaWdodCl9fWVsc2V7JGNsb25lTWUuYWRkQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJzcGxpdCIpKX0KaWYoJGNsb25lLmdldCgwKS5jaGlsZE5vZGVzLmxlbmd0aD09PTApeyRjbG9uZS5yZW1vdmUoKTskY2xvbmVNZS5yZW1vdmVDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoInNwbGl0IikpfWVsc2UgaWYoJGNsb25lLmdldCgwKS5jaGlsZE5vZGVzLmxlbmd0aD09MSl7dmFyIG9ubHlOb2RlPSRjbG9uZS5nZXQoMCkuY2hpbGROb2Rlc1swXTtpZihvbmx5Tm9kZS5ub2RlVHlwZT09Myl7dmFyIG5vbndoaXRlc3BhY2U9L1xTLzt2YXIgc3RyPW9ubHlOb2RlLm5vZGVWYWx1ZTtpZighbm9ud2hpdGVzcGFjZS50ZXN0KHN0cikpeyRjbG9uZS5yZW1vdmUoKTskY2xvbmVNZS5yZW1vdmVDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoInNwbGl0IikpfX19fX19CmZpeFRhYmxlcygkcHVsbE91dEhlcmUpfQpmdW5jdGlvbiBzaW5nbGVDb2x1bW5pemVJdCgpe2lmKCRpbkJveC5kYXRhKCJjb2x1bW5pemVkIikmJiRpbkJveC5jaGlsZHJlbigpLmxlbmd0aD09MSl7cmV0dXJufQokaW5Cb3guZGF0YSgiY29sdW1uaXplZCIsITApOyRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIsITApOyRpbkJveC5lbXB0eSgpOyRpbkJveC5hcHBlbmQoJCgiPGRpdiBjbGFzcz0nIitwcmVmaXhUaGVDbGFzc05hbWUoImZpcnN0IikrIiAiK3ByZWZpeFRoZUNsYXNzTmFtZSgibGFzdCIpKyIgIitwcmVmaXhUaGVDbGFzc05hbWUoImNvbHVtbiIpKyIgIisiJyBzdHlsZT0nd2lkdGg6MTAwJTsgZmxvYXQ6ICIrb3B0aW9ucy5jb2x1bW5GbG9hdCsiOyc+PC9kaXY+IikpOyRjb2w9JGluQm94LmNoaWxkcmVuKCkuZXEoJGluQm94LmNoaWxkcmVuKCkubGVuZ3RoLTEpOyRkZXN0cm95YWJsZT0kY2FjaGUuY2xvbmUoITApO2lmKG9wdGlvbnMub3ZlcmZsb3cpe3RhcmdldEhlaWdodD1vcHRpb25zLm92ZXJmbG93LmhlaWdodDtjb2x1bW5pemUoJGNvbCwkZGVzdHJveWFibGUsJGNvbCx0YXJnZXRIZWlnaHQpO2lmKCEkZGVzdHJveWFibGUuY29udGVudHMoKS5maW5kKCI6Zmlyc3QtY2hpbGQiKS5oYXNDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImRvbnRlbmQiKSkpe3NwbGl0KCRjb2wsJGRlc3Ryb3lhYmxlLCRjb2wsdGFyZ2V0SGVpZ2h0KX0Kd2hpbGUoJGNvbC5jb250ZW50cygiOmxhc3QiKS5sZW5ndGgmJmNoZWNrRG9udEVuZENvbHVtbigkY29sLmNvbnRlbnRzKCI6bGFzdCIpLmdldCgwKSkpe3ZhciAkbGFzdEtpZD0kY29sLmNvbnRlbnRzKCI6bGFzdCIpOyRsYXN0S2lkLnJlbW92ZSgpOyRkZXN0cm95YWJsZS5wcmVwZW5kKCRsYXN0S2lkKX0KdmFyIGh0bWw9IiI7dmFyIGRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTt3aGlsZSgkZGVzdHJveWFibGVbMF0uY2hpbGROb2Rlcy5sZW5ndGg+MCl7dmFyIGtpZD0kZGVzdHJveWFibGVbMF0uY2hpbGROb2Rlc1swXTtpZihraWQuYXR0cmlidXRlcyl7Zm9yKHZhciBpPTA7aTxraWQuYXR0cmlidXRlcy5sZW5ndGg7aSsrKXtpZihraWQuYXR0cmlidXRlc1tpXS5ub2RlTmFtZS5pbmRleE9mKCJqUXVlcnkiKT09PTApe2tpZC5yZW1vdmVBdHRyaWJ1dGUoa2lkLmF0dHJpYnV0ZXNbaV0ubm9kZU5hbWUpfX19CmRpdi5pbm5lckhUTUw9IiI7ZGl2LmFwcGVuZENoaWxkKCRkZXN0cm95YWJsZVswXS5jaGlsZE5vZGVzWzBdKTtodG1sKz1kaXYuaW5uZXJIVE1MfQp2YXIgb3ZlcmZsb3c9JChvcHRpb25zLm92ZXJmbG93LmlkKVswXTtvdmVyZmxvdy5pbm5lckhUTUw9aHRtbH1lbHNle2FwcGVuZFNhZmUoJGNvbCwkZGVzdHJveWFibGUuY29udGVudHMoKSl9CiRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIsITEpO2lmKG9wdGlvbnMub3ZlcmZsb3cmJm9wdGlvbnMub3ZlcmZsb3cuZG9uZUZ1bmMpe29wdGlvbnMub3ZlcmZsb3cuZG9uZUZ1bmMoKX0Kb3B0aW9ucy5kb25lRnVuYygpfQpmdW5jdGlvbiBjaGVja0RvbnRFbmRDb2x1bW4oZG9tKXtpZihkb20ubm9kZVR5cGU9PTMpe2lmKC9eXHMrJC8udGVzdChkb20ubm9kZVZhbHVlKSl7aWYoIWRvbS5wcmV2aW91c1NpYmxpbmcpcmV0dXJuITE7cmV0dXJuIGNoZWNrRG9udEVuZENvbHVtbihkb20ucHJldmlvdXNTaWJsaW5nKX0KcmV0dXJuITF9CmlmKGRvbS5ub2RlVHlwZSE9MSlyZXR1cm4hMTtpZigkKGRvbSkuaGFzQ2xhc3MocHJlZml4VGhlQ2xhc3NOYW1lKCJkb250ZW5kIikpKXJldHVybiEwO2lmKGRvbS5jaGlsZE5vZGVzLmxlbmd0aD09PTApcmV0dXJuITE7cmV0dXJuIGNoZWNrRG9udEVuZENvbHVtbihkb20uY2hpbGROb2Rlc1tkb20uY2hpbGROb2Rlcy5sZW5ndGgtMV0pfQpmdW5jdGlvbiBjb2x1bW5pemVJdCgpe2FkanVzdG1lbnQ9MDtpZihsYXN0V2lkdGg9PSRpbkJveC53aWR0aCgpKXJldHVybjtsYXN0V2lkdGg9JGluQm94LndpZHRoKCk7dmFyIG51bUNvbHM9TWF0aC5yb3VuZCgkaW5Cb3gud2lkdGgoKS9vcHRpb25zLndpZHRoKTt2YXIgb3B0aW9uV2lkdGg9b3B0aW9ucy53aWR0aDt2YXIgb3B0aW9uSGVpZ2h0PW9wdGlvbnMuaGVpZ2h0O2lmKG9wdGlvbnMuY29sdW1ucyludW1Db2xzPW9wdGlvbnMuY29sdW1ucztpZihtYW51YWxCcmVha3Mpe251bUNvbHM9JGNhY2hlLmZpbmQocHJlZml4VGhlQ2xhc3NOYW1lKCJjb2x1bW5icmVhayIsITApKS5sZW5ndGgrMTtvcHRpb25XaWR0aD0hMX0KaWYobnVtQ29sczw9MSYmIW9wdGlvbnMuZGlzYWJsZVNpbmdsZSl7cmV0dXJuIHNpbmdsZUNvbHVtbml6ZUl0KCl9CmlmKCRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIpKXJldHVybjskaW5Cb3guZGF0YSgiY29sdW1uaXplZCIsITApOyRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIsITApOyRpbkJveC5lbXB0eSgpOyRpbkJveC5hcHBlbmQoJCgiPGRpdiBzdHlsZT0nd2lkdGg6IitvcHRpb25zLnNldFdpZHRoKG51bUNvbHMpKyIlOyBmbG9hdDogIitvcHRpb25zLmNvbHVtbkZsb2F0KyI7Jz48L2Rpdj4iKSk7JGNvbD0kaW5Cb3guY2hpbGRyZW4oIjpsYXN0Iik7YXBwZW5kU2FmZSgkY29sLCRjYWNoZS5jbG9uZSgpKTttYXhIZWlnaHQ9JGNvbC5oZWlnaHQoKTskaW5Cb3guZW1wdHkoKTt2YXIgdGFyZ2V0SGVpZ2h0PW1heEhlaWdodC9udW1Db2xzO3ZhciBmaXJzdFRpbWU9ITA7dmFyIG1heExvb3BzPTM7dmFyIHNjcm9sbEhvcml6b250YWxseT0hMTtpZihvcHRpb25zLm92ZXJmbG93KXttYXhMb29wcz0xO3RhcmdldEhlaWdodD1vcHRpb25zLm92ZXJmbG93LmhlaWdodH1lbHNlIGlmKG9wdGlvbkhlaWdodCYmb3B0aW9uV2lkdGgpe21heExvb3BzPTE7dGFyZ2V0SGVpZ2h0PW9wdGlvbkhlaWdodDtzY3JvbGxIb3Jpem9udGFsbHk9ITB9CmZvcih2YXIgbG9vcENvdW50PTA7bG9vcENvdW50PG1heExvb3BzJiZsb29wQ291bnQ8MjA7bG9vcENvdW50KyspeyRpbkJveC5lbXB0eSgpO3ZhciAkZGVzdHJveWFibGUsY2xhc3NOYW1lLCRjb2wsJGxhc3RLaWQ7dHJ5eyRkZXN0cm95YWJsZT0kY2FjaGUuY2xvbmUoITApfWNhdGNoKGUpeyRkZXN0cm95YWJsZT0kY2FjaGUuY2xvbmUoKX0KJGRlc3Ryb3lhYmxlLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpO2Zvcih2YXIgaT0wO2k8bnVtQ29scztpKyspe2NsYXNzTmFtZT0oaT09PTApP3ByZWZpeFRoZUNsYXNzTmFtZSgiZmlyc3QiKToiIjtjbGFzc05hbWUrPSIgIitwcmVmaXhUaGVDbGFzc05hbWUoImNvbHVtbiIpO2NsYXNzTmFtZT0oaT09bnVtQ29scy0xKT8ocHJlZml4VGhlQ2xhc3NOYW1lKCJsYXN0IikrIiAiK2NsYXNzTmFtZSk6Y2xhc3NOYW1lOyRpbkJveC5hcHBlbmQoJCgiPGRpdiBjbGFzcz0nIitjbGFzc05hbWUrIicgc3R5bGU9J3dpZHRoOiIrb3B0aW9ucy5zZXRXaWR0aChudW1Db2xzKSsiJTsgZmxvYXQ6ICIrb3B0aW9ucy5jb2x1bW5GbG9hdCsiOyc+PC9kaXY+IikpfQppPTA7d2hpbGUoaTxudW1Db2xzLShvcHRpb25zLm92ZXJmbG93PzA6MSl8fHNjcm9sbEhvcml6b250YWxseSYmJGRlc3Ryb3lhYmxlLmNvbnRlbnRzKCkubGVuZ3RoKXtpZigkaW5Cb3guY2hpbGRyZW4oKS5sZW5ndGg8PWkpeyRpbkJveC5hcHBlbmQoJCgiPGRpdiBjbGFzcz0nIitjbGFzc05hbWUrIicgc3R5bGU9J3dpZHRoOiIrb3B0aW9ucy5zZXRXaWR0aChudW1Db2xzKSsiJTsgZmxvYXQ6ICIrb3B0aW9ucy5jb2x1bW5GbG9hdCsiOyc+PC9kaXY+IikpfQokY29sPSRpbkJveC5jaGlsZHJlbigpLmVxKGkpO2lmKHNjcm9sbEhvcml6b250YWxseSl7JGNvbC53aWR0aChvcHRpb25XaWR0aCsicHgiKX0KY29sdW1uaXplKCRjb2wsJGRlc3Ryb3lhYmxlLCRjb2wsdGFyZ2V0SGVpZ2h0KTtzcGxpdCgkY29sLCRkZXN0cm95YWJsZSwkY29sLHRhcmdldEhlaWdodCk7d2hpbGUoJGNvbC5jb250ZW50cygiOmxhc3QiKS5sZW5ndGgmJmNoZWNrRG9udEVuZENvbHVtbigkY29sLmNvbnRlbnRzKCI6bGFzdCIpLmdldCgwKSkpeyRsYXN0S2lkPSRjb2wuY29udGVudHMoIjpsYXN0Iik7JGxhc3RLaWQucmVtb3ZlKCk7JGRlc3Ryb3lhYmxlLnByZXBlbmQoJGxhc3RLaWQpfQppKys7aWYoJGNvbC5jb250ZW50cygpLmxlbmd0aD09PTAmJiRkZXN0cm95YWJsZS5jb250ZW50cygpLmxlbmd0aCl7JGNvbC5hcHBlbmQoJGRlc3Ryb3lhYmxlLmNvbnRlbnRzKCI6Zmlyc3QiKSl9ZWxzZSBpZihpPT1udW1Db2xzLShvcHRpb25zLm92ZXJmbG93PzA6MSkmJiFvcHRpb25zLm92ZXJmbG93KXtpZigkZGVzdHJveWFibGUuZmluZChwcmVmaXhUaGVDbGFzc05hbWUoImNvbHVtbmJyZWFrIiwhMCkpLmxlbmd0aCl7bnVtQ29scyArK319fQppZihvcHRpb25zLm92ZXJmbG93JiYhc2Nyb2xsSG9yaXpvbnRhbGx5KXt2YXIgSUU2PSExO3ZhciBJRTc9KGRvY3VtZW50LmFsbCkmJihuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCJNU0lFIDcuIikhPS0xKTtpZihJRTZ8fElFNyl7dmFyIGh0bWw9IiI7dmFyIGRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTt3aGlsZSgkZGVzdHJveWFibGVbMF0uY2hpbGROb2Rlcy5sZW5ndGg+MCl7dmFyIGtpZD0kZGVzdHJveWFibGVbMF0uY2hpbGROb2Rlc1swXTtmb3IoaT0wO2k8a2lkLmF0dHJpYnV0ZXMubGVuZ3RoO2krKyl7aWYoa2lkLmF0dHJpYnV0ZXNbaV0ubm9kZU5hbWUuaW5kZXhPZigialF1ZXJ5Iik9PT0wKXtraWQucmVtb3ZlQXR0cmlidXRlKGtpZC5hdHRyaWJ1dGVzW2ldLm5vZGVOYW1lKX19CmRpdi5pbm5lckhUTUw9IiI7ZGl2LmFwcGVuZENoaWxkKCRkZXN0cm95YWJsZVswXS5jaGlsZE5vZGVzWzBdKTtodG1sKz1kaXYuaW5uZXJIVE1MfQp2YXIgb3ZlcmZsb3c9JChvcHRpb25zLm92ZXJmbG93LmlkKVswXTtvdmVyZmxvdy5pbm5lckhUTUw9aHRtbH1lbHNleyQob3B0aW9ucy5vdmVyZmxvdy5pZCkuZW1wdHkoKS5hcHBlbmQoJGRlc3Ryb3lhYmxlLmNvbnRlbnRzKCkuY2xvbmUoITApKX19ZWxzZSBpZighc2Nyb2xsSG9yaXpvbnRhbGx5KXskY29sPSRpbkJveC5jaGlsZHJlbigpLmVxKCRpbkJveC5jaGlsZHJlbigpLmxlbmd0aC0xKTskZGVzdHJveWFibGUuY29udGVudHMoKS5lYWNoKGZ1bmN0aW9uKCl7JGNvbC5hcHBlbmQoJCh0aGlzKSl9KTt2YXIgYWZ0ZXJIPSRjb2wuaGVpZ2h0KCk7dmFyIGRpZmY9YWZ0ZXJILXRhcmdldEhlaWdodDt2YXIgdG90YWxIPTA7dmFyIG1pbj0xMDAwMDAwMDt2YXIgbWF4PTA7dmFyIGxhc3RJc01heD0hMTt2YXIgbnVtYmVyT2ZDb2x1bW5zVGhhdERvbnRFbmRJbkFDb2x1bW5CcmVhaz0wOyRpbkJveC5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oJGluQm94KXtyZXR1cm4gZnVuY3Rpb24oJGl0ZW0pe3ZhciAkY29sPSRpbkJveC5jaGlsZHJlbigpLmVxKCRpdGVtKTt2YXIgZW5kc0luQnJlYWs9JGNvbC5jaGlsZHJlbigiOmxhc3QiKS5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uYnJlYWsiLCEwKSkubGVuZ3RoO2lmKCFlbmRzSW5CcmVhayl7dmFyIGg9JGNvbC5oZWlnaHQoKTtsYXN0SXNNYXg9ITE7dG90YWxIKz1oO2lmKGg+bWF4KXttYXg9aDtsYXN0SXNNYXg9ITB9CmlmKGg8bWluKW1pbj1oO251bWJlck9mQ29sdW1uc1RoYXREb250RW5kSW5BQ29sdW1uQnJlYWsrK319fSgkaW5Cb3gpKTt2YXIgYXZnSD10b3RhbEgvbnVtYmVyT2ZDb2x1bW5zVGhhdERvbnRFbmRJbkFDb2x1bW5CcmVhaztpZih0b3RhbEg9PT0wKXtsb29wQ291bnQ9bWF4TG9vcHN9ZWxzZSBpZihvcHRpb25zLmxhc3ROZXZlclRhbGxlc3QmJmxhc3RJc01heCl7YWRqdXN0bWVudCs9NTt0YXJnZXRIZWlnaHQ9dGFyZ2V0SGVpZ2h0KzMwO2lmKGxvb3BDb3VudD09bWF4TG9vcHMtMSltYXhMb29wcysrfWVsc2UgaWYobWF4LW1pbj4zMCl7dGFyZ2V0SGVpZ2h0PWF2Z0grMzB9ZWxzZSBpZihNYXRoLmFicyhhdmdILXRhcmdldEhlaWdodCk+MjApe3RhcmdldEhlaWdodD1hdmdIfWVsc2V7bG9vcENvdW50PW1heExvb3BzfX1lbHNleyRpbkJveC5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oaSl7JGNvbD0kaW5Cb3guY2hpbGRyZW4oKS5lcShpKTskY29sLndpZHRoKG9wdGlvbldpZHRoKyJweCIpO2lmKGk9PT0wKXskY29sLmFkZENsYXNzKHByZWZpeFRoZUNsYXNzTmFtZSgiZmlyc3QiKSl9ZWxzZSBpZihpPT0kaW5Cb3guY2hpbGRyZW4oKS5sZW5ndGgtMSl7JGNvbC5hZGRDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImxhc3QiKSl9ZWxzZXskY29sLnJlbW92ZUNsYXNzKHByZWZpeFRoZUNsYXNzTmFtZSgiZmlyc3QiKSk7JGNvbC5yZW1vdmVDbGFzcyhwcmVmaXhUaGVDbGFzc05hbWUoImxhc3QiKSl9fSk7JGluQm94LndpZHRoKCRpbkJveC5jaGlsZHJlbigpLmxlbmd0aCpvcHRpb25XaWR0aCsicHgiKX0KJGluQm94LmFwcGVuZCgkKCI8YnIgc3R5bGU9J2NsZWFyOmJvdGg7Jz4iKSl9CiRpbkJveC5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uIiwhMCkpLmZpbmQoIjpmaXJzdCIrcHJlZml4VGhlQ2xhc3NOYW1lKCJyZW1vdmVpZmZpcnN0IiwhMCkpLnJlbW92ZSgpOyRpbkJveC5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgiY29sdW1uIiwhMCkpLmZpbmQoJzpsYXN0JytwcmVmaXhUaGVDbGFzc05hbWUoInJlbW92ZWlmbGFzdCIsITApKS5yZW1vdmUoKTskaW5Cb3guZmluZChwcmVmaXhUaGVDbGFzc05hbWUoInNwbGl0IiwhMCkpLmZpbmQoIjpmaXJzdCIrcHJlZml4VGhlQ2xhc3NOYW1lKCJyZW1vdmVpZmZpcnN0IiwhMCkpLnJlbW92ZSgpOyRpbkJveC5maW5kKHByZWZpeFRoZUNsYXNzTmFtZSgic3BsaXQiLCEwKSkuZmluZCgnOmxhc3QnK3ByZWZpeFRoZUNsYXNzTmFtZSgicmVtb3ZlaWZsYXN0IiwhMCkpLnJlbW92ZSgpOyRpbkJveC5kYXRhKCJjb2x1bW5pemluZyIsITEpO2lmKG9wdGlvbnMub3ZlcmZsb3cpe29wdGlvbnMub3ZlcmZsb3cuZG9uZUZ1bmMoKX0Kb3B0aW9ucy5kb25lRnVuYygpfX0pfTskLmZuLnVuY29sdW1uaXplPWZ1bmN0aW9uKCl7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyICRlbD0kKHRoaXMpLCRjbG9uZTtpZigkY2xvbmU9JGVsLmRhdGEoREFUQV9PUklHSU5BTF9ET01fS0VZKSl7JGVsLnJlcGxhY2VXaXRoKCRjbG9uZSl9fSl9OyQuZm4ucmVudW1iZXJCeUpTPWZ1bmN0aW9uKCRzZWFyY2hUYWcsJGNvbG5vLCR0YXJnZXRJZCwkdGFyZ2V0Q2xhc3Mpe3RoaXMuc2V0TGlzdD1mdW5jdGlvbigkY29scywkbGlzdCwkdGFnMSl7dmFyICRwYXJlbnRzPXRoaXMuYmVmb3JlLnBhcmVudHMoKTt2YXIgJHJlc3Q7JHJlc3Q9JCgkY29sc1t0aGlzLm9mZnNldC0xXSkuZmluZCgnPionKTtpZigoJHJlc3QubGFzdCgpKVswXS50YWdOYW1lIT0kdGFnMS50b1VwcGVyQ2FzZSgpKXtpZih0aGlzLmRlYnVnKXtjb25zb2xlLmxvZygiTGFzdCBpdGVtIGluIHByZXZpb3VzIGNvbHVtbiwgaXNuJ3QgYSBsaXN0Li4uIil9CnJldHVybiAwfQokcmVzdD0kcmVzdC5sZW5ndGg7dmFyICR0aW50PTE7aWYodGhpcy5sYXN0T3RoZXI8PTApeyR0aW50PXRoaXMuYmVmb3JlLmNoaWxkcmVuKCkubGVuZ3RoKzF9ZWxzZXskdGludD0kKCRwYXJlbnRzW3RoaXMubGFzdE90aGVyXSkuY2hpbGRyZW4oKS5sZW5ndGgrMX0KaWYoJCgkY29sc1t0aGlzLm9mZnNldF0pLmZpbmQoJHRhZzErJzpmaXJzdCBsaS5zcGxpdCcpLmxlbmd0aCl7dmFyICR3aGVyZUVsaXBzaXM9JCgkY29sc1t0aGlzLm9mZnNldC0xXSkuZmluZCgkdGFnMSsnOmxhc3QgbGk6bGFzdCcpO2lmKHRoaXMuZWxpcHNpc1RleHQ9PT0nJ3x8JCgkY29sc1t0aGlzLm9mZnNldC0xXSkuZmluZCgkdGFnMSsnOmxhc3QgfiBkaXYnKS5sZW5ndGh8fCQoJGNvbHNbdGhpcy5vZmZzZXQtMV0pLmZpbmQoJHRhZzErJzpsYXN0IH4gcCcpLmxlbmd0aCl7fWVsc2V7aWYoJCgkd2hlcmVFbGlwc2lzKS5maW5kKCd1bCwgb2wsIGRsJykubGVuZ3RoPT0wKXt2YXIgJHR4dD0kd2hlcmVFbGlwc2lzLmxhc3QoKS50ZXh0KCk7dmFyICRsZW49JHR4dC5sZW5ndGg7aWYoJHR4dC5zdWJzdHJpbmcoJGxlbi0xKT09JzsnKXtpZigkdHh0LnN1YnN0cmluZygkbGVuLTQpIT10aGlzLmVsaXBzaXNUZXh0Kyc7Jyl7JHR4dD0kdHh0LnN1YnN0cmluZygwLCRsZW4tMSkrdGhpcy5lbGlwc2lzVGV4dCsnOyd9fWVsc2V7aWYoJHR4dC5zdWJzdHJpbmcoJGxlbi0zKSE9dGhpcy5lbGlwc2lzVGV4dCl7JHR4dCs9dGhpcy5lbGlwc2lzVGV4dH19CiR3aGVyZUVsaXBzaXMubGFzdCgpLnRleHQoJHR4dCl9fQppZigkKCRjb2xzW3RoaXMub2Zmc2V0XSkuZmluZCgkdGFnMSsnOmZpcnN0ID5saS5zcGxpdCA+JyskdGFnMSkubGVuZ3RoPT0wKXskdGludC0tfX0KaWYoJHJlc3Q9PTEpeyR0aW50Kz10aGlzLnByZXZNYXh9CmlmKHRoaXMubmVzdD4xKXtpZih0aGlzLmRlYnVnKXtjb25zb2xlLmxvZygiU3VwcG9zZWQgdG8gYmUgYSBuZXN0ZWQgbGlzdC4uLmRlY3IiKX0KJHRpbnQtLTt2YXIgJHR0PSQoJGNvbHNbdGhpcy5vZmZzZXQtMV0pLmZpbmQoJHRhZzErJzpmaXJzdCBsaS5zcGxpdDpmaXJzdCcpO2lmKCR0dC5sZW5ndGg+MCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coIlByZXZpb3VzIGNvbHVtbiBzdGFydGVkIHdpdGggYSBzcGxpdCBpdGVtLCBzbyB0aGF0IGNvdW50IGlzIG9uZSBsZXNzIHRoYW4gZXhwZWN0ZWQiKX0KJHRpbnQtLX0KJHR0PSQoJGNvbHNbdGhpcy5vZmZzZXRdKS5maW5kKCR0YWcxKyc6Zmlyc3QgbGk6Zmlyc3QnKS5jbG9uZSgpOyR0dC5jaGlsZHJlbigpLnJlbW92ZSgpO2lmKCQudHJpbSgkdHQudGV4dCgpKS5sZW5ndGg+MCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coIklmIHRoYXQgd2FzIGEgY29tcGxldGUgbGlzdCBpbiB0aGUgcHJldmlvdXMgY29sdW1uLCBkb24ndCBkZWNyLiIpfQokdGludCsrO2lmKCQoJGNvbHNbdGhpcy5vZmZzZXQtMV0pLmZpbmQoIj4iKyR0YWcxKyc6bGFzdCAnKS5jaGlsZHJlbigpLmxlbmd0aD09MCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coInVubGVzcyB0aGF0IHdhcyBlbXB0eSwgaW4gd2hpY2ggY2FzZSByZXZlcnQiKX0KJHRpbnQtLX19fWVsc2V7dmFyICR0dD0kKCRjb2xzW3RoaXMub2Zmc2V0XSkuZmluZCgkdGFnMSsnOmZpcnN0IGxpOmZpcnN0ICcrJHRhZzErIi5zcGxpdCBsaS5zcGxpdCIpO2lmKCR0dC5sZW5ndGg+MCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coIltOZXN0ZWRdIENvbHVtbiBzdGFydGVkIHdpdGggYSBzcGxpdCBpdGVtLCBzbyB0aGF0IGNvdW50IGlzIG9uZSBsZXNzIHRoYW4gZXhwZWN0ZWQiKX0KJHRpbnQtLX19CmlmKHRoaXMuZGVidWcpe2NvbnNvbGUubG9nKCJTZXR0aW5nIHRoZSBzdGFydCB2YWx1ZSB0byAiKyR0aW50KyIgKCIrdGhpcy5wcmV2TWF4KyIpIil9CmlmKCR0aW50PjApe2lmKHR5cGVvZiB0aGlzLnNldENvbHVtblN0YXJ0PT0nZnVuY3Rpb24nKXt0aGlzLnNldENvbHVtblN0YXJ0KCRsaXN0LCR0aW50KX1lbHNleyRsaXN0LmF0dHIoJ3N0YXJ0JywkdGludCl9fQpyZXR1cm4gMH0KaWYodHlwZW9mICR0YXJnZXRJZD09PSd1bmRlZmluZWQnKXskdGFyZ2V0SWQ9ITF9CmlmKHR5cGVvZiAkdGFyZ2V0Q2xhc3M9PT0ndW5kZWZpbmVkJyl7JHRhcmdldENsYXNzPSExfQppZighJHRhcmdldElkJiYhJHRhcmdldENsYXNzKXt0aHJvdyAicmVudW1iZXJCeUpTKCk6IEJhZCBwYXJhbSwgbXVzdCBwYXNzIGFuIGlkIG9yIGEgY2xhc3MifQp2YXIgJHRhcmdldD0nJzt0aGlzLnByZXZNYXg9MTtpZigkdGFyZ2V0Q2xhc3MpeyR0YXJnZXQ9Ii4iKyR0YXJnZXRDbGFzc31lbHNleyR0YXJnZXQ9IiMiKyR0YXJnZXRJZH0KdmFyICR0YWcxPSRzZWFyY2hUYWcudG9Mb3dlckNhc2UoKTt2YXIgJHRhZzI9JHNlYXJjaFRhZy50b1VwcGVyQ2FzZSgpO3RoaXMuY29scz0kKCR0YXJnZXQpO2lmKHRoaXMuZGVidWcpe2NvbnNvbGUubG9nKCJUaGVyZSBhcmUgIit0aGlzLmNvbHMubGVuZ3RoKyIgaXRlbXMsIGxvb2tpbmcgZm9yICIrJHRhZzEpfQp0aGlzLmJlZm9yZT0kKHRoaXMuY29sc1swXSkuZmluZCgkdGFnMSsnOmxhc3QnKTt0aGlzLnByZXZNYXg9dGhpcy5iZWZvcmUuY2hpbGRyZW4oKS5sZW5ndGg7Zm9yKHRoaXMub2Zmc2V0PTE7dGhpcy5vZmZzZXQ8dGhpcy5jb2xzLmxlbmd0aDt0aGlzLm9mZnNldCsrKXtpZih0aGlzLmRlYnVnKXtjb25zb2xlLmxvZygiaXRlcmF0aW5nICIrdGhpcy5vZmZzZXQrIi4uLltvZiAiK3RoaXMuY29scy5sZW5ndGgrIl0iKX0KaWYodGhpcy5vZmZzZXQlJGNvbG5vPT0wKXtpZih0aGlzLmRlYnVnKXtjb25zb2xlLmxvZygiRmlyc3QgY29sdW1uIChpbiB0aGVvcnkuLikiKX0KdGhpcy5wcmV2TWF4PTE7Y29udGludWV9CnRoaXMuYmVmb3JlPSQodGhpcy5jb2xzW3RoaXMub2Zmc2V0LTFdKS5maW5kKCR0YWcxKyc6bGFzdCcpO2lmKHRoaXMuYmVmb3JlLmxlbmd0aCl7aWYodGhpcy5kZWJ1Zyl7Y29uc29sZS5sb2coIkhhdmUgc29tZSAiKyRzZWFyY2hUYWcrIiBlbGVtZW50cyBpbiB0aGUgcHJldmlvdXMgY29sdW1uIil9CnZhciAkbGlzdD0kKHRoaXMuY29sc1t0aGlzLm9mZnNldF0pLmZpbmQoJHRhZzErJzpmaXJzdCcpO3ZhciAkZmlyc3Q9JCh0aGlzLmNvbHNbdGhpcy5vZmZzZXRdKS5maW5kKCcqOmZpcnN0Jyk7aWYoJGZpcnN0WzBdIT09JGxpc3RbMF0pe2NvbnRpbnVlfQp2YXIgJHBhcmVudHM9dGhpcy5iZWZvcmUucGFyZW50cygpO3RoaXMubGFzdE90aGVyPTA7dmFyICRmb3VuZD0hMTtmb3IoO3RoaXMubGFzdE90aGVyPCRwYXJlbnRzLmxlbmd0aDt0aGlzLmxhc3RPdGhlcisrKXtpZigkcGFyZW50c1t0aGlzLmxhc3RPdGhlcl0udGFnTmFtZSE9JHRhZzImJiRwYXJlbnRzW3RoaXMubGFzdE90aGVyXS50YWdOYW1lIT0iTEkiKXskZm91bmQ9ITA7dGhpcy5sYXN0T3RoZXItLTticmVha319CnRoaXMubmVzdD0xO2lmKCQodGhpcy5jb2xzW3RoaXMub2Zmc2V0XSkuZmluZCgiPiIrJHRhZzErJzpmaXJzdCBsaSAnKyR0YWcxKyI6Zmlyc3QiKS5sZW5ndGgpe3RoaXMubmVzdD0yfQp0aGlzLnNldExpc3QodGhpcy5jb2xzLCRsaXN0LCR0YWcxKTt0aGlzLmxhc3RPdGhlci0tOyRsaXN0PSQodGhpcy5jb2xzW3RoaXMub2Zmc2V0XSkuZmluZCgkdGFnMSsnOmZpcnN0IGxpICcrJHRhZzErIjpmaXJzdCIpO2lmKCRsaXN0Lmxlbmd0aCl7dGhpcy5iZWZvcmU9JCh0aGlzLmNvbHNbdGhpcy5vZmZzZXQtMV0pLmZpbmQoIj4iKyR0YWcxKyc6bGFzdCBsaSAnKyR0YWcxKyI6bGFzdCIpO3RoaXMucHJldk1heD0wO3RoaXMubmVzdD0xO3RoaXMuc2V0TGlzdCh0aGlzLmNvbHMsJGxpc3QsJHRhZzEpfQp2YXIgJHJlc2V0PSQodGhpcy5jb2xzW3RoaXMub2Zmc2V0LTFdKS5maW5kKCI+IiskdGFnMSsnOmxhc3QnKTt0aGlzLnByZXZNYXg9JHJlc2V0LmNoaWxkcmVuKCkubGVuZ3RofX0KcmV0dXJuIDB9fSkoalF1ZXJ5KTshZnVuY3Rpb24oYSl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiXSxmdW5jdGlvbihiKXtyZXR1cm4gYShiKX0pOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWEocmVxdWlyZSgianF1ZXJ5IikpOmEod2luZG93LmpRdWVyeSl9KGZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBiKGEpe3ZvaWQgMD09PWEmJihhPXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSxhPWEudG9Mb3dlckNhc2UoKTt2YXIgYj0vKGVkZ2UpXC8oW1x3Ll0rKS8uZXhlYyhhKXx8LyhvcHIpW1wvXShbXHcuXSspLy5leGVjKGEpfHwvKGNocm9tZSlbIFwvXShbXHcuXSspLy5leGVjKGEpfHwvKGllbW9iaWxlKVtcL10oW1x3Ll0rKS8uZXhlYyhhKXx8Lyh2ZXJzaW9uKShhcHBsZXdlYmtpdClbIFwvXShbXHcuXSspLiooc2FmYXJpKVsgXC9dKFtcdy5dKykvLmV4ZWMoYSl8fC8od2Via2l0KVsgXC9dKFtcdy5dKykuKih2ZXJzaW9uKVsgXC9dKFtcdy5dKykuKihzYWZhcmkpWyBcL10oW1x3Ll0rKS8uZXhlYyhhKXx8Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8uZXhlYyhhKXx8LyhvcGVyYSkoPzouKnZlcnNpb258KVsgXC9dKFtcdy5dKykvLmV4ZWMoYSl8fC8obXNpZSkgKFtcdy5dKykvLmV4ZWMoYSl8fGEuaW5kZXhPZigidHJpZGVudCIpPj0wJiYvKHJ2KSg/Ojp8ICkoW1x3Ll0rKS8uZXhlYyhhKXx8YS5pbmRleE9mKCJjb21wYXRpYmxlIik8MCYmLyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKXwpLy5leGVjKGEpfHxbXSxjPS8oaXBhZCkvLmV4ZWMoYSl8fC8oaXBvZCkvLmV4ZWMoYSl8fC8od2luZG93cyBwaG9uZSkvLmV4ZWMoYSl8fC8oaXBob25lKS8uZXhlYyhhKXx8LyhraW5kbGUpLy5leGVjKGEpfHwvKHNpbGspLy5leGVjKGEpfHwvKGFuZHJvaWQpLy5leGVjKGEpfHwvKHdpbikvLmV4ZWMoYSl8fC8obWFjKS8uZXhlYyhhKXx8LyhsaW51eCkvLmV4ZWMoYSl8fC8oY3JvcykvLmV4ZWMoYSl8fC8ocGxheWJvb2spLy5leGVjKGEpfHwvKGJiKS8uZXhlYyhhKXx8LyhibGFja2JlcnJ5KS8uZXhlYyhhKXx8W10sZD17fSxlPXticm93c2VyOmJbNV18fGJbM118fGJbMV18fCIiLHZlcnNpb246YlsyXXx8Yls0XXx8IjAiLHZlcnNpb25OdW1iZXI6Yls0XXx8YlsyXXx8IjAiLHBsYXRmb3JtOmNbMF18fCIifTtpZihlLmJyb3dzZXImJihkW2UuYnJvd3Nlcl09ITAsZC52ZXJzaW9uPWUudmVyc2lvbixkLnZlcnNpb25OdW1iZXI9cGFyc2VJbnQoZS52ZXJzaW9uTnVtYmVyLDEwKSksZS5wbGF0Zm9ybSYmKGRbZS5wbGF0Zm9ybV09ITApLChkLmFuZHJvaWR8fGQuYmJ8fGQuYmxhY2tiZXJyeXx8ZC5pcGFkfHxkLmlwaG9uZXx8ZC5pcG9kfHxkLmtpbmRsZXx8ZC5wbGF5Ym9va3x8ZC5zaWxrfHxkWyJ3aW5kb3dzIHBob25lIl0pJiYoZC5tb2JpbGU9ITApLChkLmNyb3N8fGQubWFjfHxkLmxpbnV4fHxkLndpbikmJihkLmRlc2t0b3A9ITApLChkLmNocm9tZXx8ZC5vcHJ8fGQuc2FmYXJpKSYmKGQud2Via2l0PSEwKSxkLnJ2fHxkLmllbW9iaWxlKXt2YXIgZj0ibXNpZSI7ZS5icm93c2VyPWYsZFtmXT0hMH1pZihkLmVkZ2Upe2RlbGV0ZSBkLmVkZ2U7dmFyIGc9Im1zZWRnZSI7ZS5icm93c2VyPWcsZFtnXT0hMH1pZihkLnNhZmFyaSYmZC5ibGFja2JlcnJ5KXt2YXIgaD0iYmxhY2tiZXJyeSI7ZS5icm93c2VyPWgsZFtoXT0hMH1pZihkLnNhZmFyaSYmZC5wbGF5Ym9vayl7dmFyIGk9InBsYXlib29rIjtlLmJyb3dzZXI9aSxkW2ldPSEwfWlmKGQuYmIpe3ZhciBqPSJibGFja2JlcnJ5IjtlLmJyb3dzZXI9aixkW2pdPSEwfWlmKGQub3ByKXt2YXIgaz0ib3BlcmEiO2UuYnJvd3Nlcj1rLGRba109ITB9aWYoZC5zYWZhcmkmJmQuYW5kcm9pZCl7dmFyIGw9ImFuZHJvaWQiO2UuYnJvd3Nlcj1sLGRbbF09ITB9aWYoZC5zYWZhcmkmJmQua2luZGxlKXt2YXIgbT0ia2luZGxlIjtlLmJyb3dzZXI9bSxkW21dPSEwfWlmKGQuc2FmYXJpJiZkLnNpbGspe3ZhciBuPSJzaWxrIjtlLmJyb3dzZXI9bixkW25dPSEwfXJldHVybiBkLm5hbWU9ZS5icm93c2VyLGQucGxhdGZvcm09ZS5wbGF0Zm9ybSxkfXJldHVybiB3aW5kb3cualFCcm93c2VyPWIod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy5qUUJyb3dzZXIudWFNYXRjaD1iLGEmJihhLmJyb3dzZXI9d2luZG93LmpRQnJvd3Nlciksd2luZG93LmpRQnJvd3Nlcn0pOyhmdW5jdGlvbigkKXskLmZuLmV4dGVuZCh7YnhHYWxsZXJ5OmZ1bmN0aW9uKG9wdGlvbnMpe3ZhciBkZWZhdWx0cz17bWF4d2lkdGg6JycsbWF4aGVpZ2h0OicnLHRodW1id2lkdGg6MjAwLHRodW1iY3JvcDohMSxjcm9wcGVyY2VudDouMzUsdGh1bWJwbGFjZW1lbnQ6J2JvdHRvbScsdGh1bWJjb250YWluZXI6Jycsb3BhY2l0eTouNyxsb2FkX3RleHQ6JycsbG9hZF9pbWFnZTonaHR0cDovL2kzMDIucGhvdG9idWNrZXQuY29tL2FsYnVtcy9ubjkyL3dhbmRvbGVkemVwL3NwaW5uZXIuZ2lmJyx3cmFwcGVyY2xhc3M6J291dGVyJ30KdmFyIG9wdGlvbnM9JC5leHRlbmQoZGVmYXVsdHMsb3B0aW9ucyk7dmFyIG89b3B0aW9uczt2YXIgY29udD0nJzt2YXIgY2FwdGlvbj0nJzt2YXIgY2FwdGlvbkV4dHJhPTEwO3ZhciAkb3V0ZXI9Jyc7dmFyICRvcmlnPXRoaXM7dmFyIHRhbGw9MDt2YXIgd2lkZT0wO3ZhciBzaG93aW5nPTA7dmFyIGk9MDt2YXIgaz0kb3JpZy5maW5kKCdhIGltZycpLnNpemUoKTt2YXIgY3VycmVudDtwcmVsb2FkX2ltZygpO2Z1bmN0aW9uIHByZWxvYWRfaW1nKCl7JG9yaWcuaGlkZSgpO2lmKG8ubG9hZF90ZXh0IT0nJyl7JG9yaWcuYmVmb3JlKCc8ZGl2IGlkPSJsb2FkaW5nIj4nK28ubG9hZF90ZXh0Kyc8L2Rpdj4nKX1lbHNleyRvcmlnLmJlZm9yZSgnPGRpdiBpZD0ibG9hZGluZyI+PGltZyBzcmM9Iicrby5sb2FkX2ltYWdlKyciIC8+PC9kaXY+Jyl9CiRvcmlnLnBhcmVudCgpLmZpbmQoJyNsb2FkaW5nJykuY3NzKHsndGV4dEFsaWduJzonY2VudGVyJywnd2lkdGgnOm8ubWF4d2lkdGh9KTskb3JpZy5maW5kKCdhIGltZycpLmVhY2goZnVuY3Rpb24oKXt2YXIgdGhlX3NvdXJjZT0kKHRoaXMpLmF0dHIoJ3NyYycpO3ZhciB0aGVfaW1nPW5ldyBJbWFnZSgpO3RoZV9pbWcub25sb2FkPWZ1bmN0aW9uKCl7cHJlbG9hZF9jaGVjaygpfTt0aGVfaW1nLnNyYz10aGVfc291cmNlfSl9CmZ1bmN0aW9uIHByZWxvYWRfY2hlY2soKXtpKys7aWYoaT09ayl7aW5pdCgpfX0KZnVuY3Rpb24gaW5pdCgpe3NldF9sYXlvdXQoKTtzZXRfbWFpbl9pbWcoKTtwbGFjZV90aHVtYmNvbnRhaW5lcigpO3NldF90aHVtYnMoKX0KZnVuY3Rpb24gc2V0X2xheW91dCgpeyRvcmlnLnBhcmVudCgpLmZpbmQoJyNsb2FkaW5nJykuaGlkZSgpOyRvcmlnLnNob3coKTskb3JpZy53cmFwKCc8ZGl2IGNsYXNzPSInK28ud3JhcHBlcmNsYXNzKyciPjwvZGl2PicpOyRvdXRlcj0kb3JpZy5wYXJlbnQoKTskb3JpZy5maW5kKCdsaScpLmNzcyh7J3Bvc2l0aW9uJzonYWJzb2x1dGUnfSl9CmZ1bmN0aW9uIHNldF9tYWluX2ltZygpeyRvcmlnLmZpbmQoJ2EgaW1nJykuZWFjaChmdW5jdGlvbigpe3ZhciAkdGhpcz0kKHRoaXMpO3ZhciAkaW1naGVpZ2h0PSR0aGlzLmhlaWdodCgpO3ZhciAkaW1nd2lkdGg9JHRoaXMud2lkdGgoKTtpZigkdGhpcy5wcm9wKCd0aXRsZScpIT0nJyl7Y2FwdGlvbj0kdGhpcy5wcm9wKCd0aXRsZScpOyR0aGlzLnBhcmVudCgpLmFwcGVuZCgnPGRpdiBjbGFzcz0iY2FwdGlvbiI+JytjYXB0aW9uKyc8L2Rpdj4nKX0KaWYoby5tYXh3aWR0aCE9Jycpe2lmKCR0aGlzLndpZHRoKCk+by5tYXh3aWR0aCl7JHRoaXMud2lkdGgoby5tYXh3aWR0aCk7JHRoaXMuaGVpZ2h0KCgkaW1naGVpZ2h0LyRpbWd3aWR0aCkqby5tYXh3aWR0aCl9fQppZihvLm1heGhlaWdodCE9Jycpe2lmKCR0aGlzLmhlaWdodCgpPm8ubWF4aGVpZ2h0KXskdGhpcy5oZWlnaHQoby5tYXhoZWlnaHQpOyR0aGlzLndpZHRoKCgkaW1nd2lkdGgvJGltZ2hlaWdodCkqby5tYXhoZWlnaHQpfX0KdmFyIGNhcHRpb25oZWlnaHQ9MDtpZigkdGhpcy5wYXJlbnQoKS5maW5kKCcuY2FwdGlvbicpLmhlaWdodCgpPjApe2NhcHRpb25oZWlnaHQ9JHRoaXMucGFyZW50KCkuZmluZCgnLmNhcHRpb24nKS5oZWlnaHQoKStjYXB0aW9uRXh0cmF9CmlmKCR0aGlzLmhlaWdodCgpK2NhcHRpb25oZWlnaHQ+dGFsbCl7dGFsbD0kdGhpcy5oZWlnaHQoKStjYXB0aW9uaGVpZ2h0fQppZigkdGhpcy53aWR0aCgpPndpZGUpe3dpZGU9JHRoaXMud2lkdGgoKX0KY29udCs9JzxsaT48aW1nIHNyYz0iJyskdGhpcy5wcm9wKCdzcmMnKSsnIiAvPjwvbGk+J30pOyRvcmlnLmZpbmQoJ2xpOm5vdCg6Zmlyc3QpJykuaGlkZSgpOyRvcmlnLmhlaWdodCh0YWxsKTskb3JpZy53aWR0aCh3aWRlKTskb3V0ZXIuZmluZCgnLmNhcHRpb24nKS53aWR0aCh3aWRlKX0KZnVuY3Rpb24gcGxhY2VfdGh1bWJjb250YWluZXIoKXtpZihvLnRodW1icGxhY2VtZW50PT0ndG9wJyl7JG91dGVyLnByZXBlbmQoJzx1bCBjbGFzcz0idGh1bWJzIj4nK2NvbnQrJzwvdWw+Jyk7JG91dGVyLmZpbmQoJy50aHVtYnMnKS5jc3MoeydvdmVyZmxvdyc6J2F1dG8nfSl9ZWxzZSBpZihvLnRodW1icGxhY2VtZW50PT0nbGVmdCcpeyRvdXRlci5wcmVwZW5kKCc8dWwgY2xhc3M9InRodW1icyI+Jytjb250Kyc8L3VsPicpOyRvcmlnLmNzcyh7J2Zsb2F0JzonbGVmdCd9KTskb3V0ZXIuZmluZCgnLnRodW1icycpLmNzcyh7J2Zsb2F0JzonbGVmdCd9KX1lbHNlIGlmKG8udGh1bWJwbGFjZW1lbnQ9PSdib3R0b20nKXskb3V0ZXIuYXBwZW5kKCc8dWwgY2xhc3M9InRodW1icyI+Jytjb250Kyc8L3VsPicpfWVsc2UgaWYoby50aHVtYnBsYWNlbWVudD09J3JpZ2h0Jyl7JG91dGVyLmFwcGVuZCgnPHVsIGNsYXNzPSJ0aHVtYnMiPicrY29udCsnPC91bD4nKTskb3JpZy5jc3MoeydmbG9hdCc6J2xlZnQnfSk7JG91dGVyLmZpbmQoJy50aHVtYnMnKS5jc3MoeydmbG9hdCc6J2xlZnQnfSl9CiRvdXRlci5hcHBlbmQoJzxkaXYgc3R5bGU9ImNsZWFyOmJvdGgiPjwvZGl2PicpO2lmKG8udGh1bWJjb250YWluZXIhPScnKXskb3V0ZXIuZmluZCgnLnRodW1icycpLndpZHRoKG8udGh1bWJjb250YWluZXIpfX0KZnVuY3Rpb24gc2V0X3RodW1icygpeyRvdXRlci5maW5kKCcudGh1bWJzIGxpJykuZWFjaChmdW5jdGlvbigpe3ZhciAkdGhpcz0kKHRoaXMpO3ZhciAkaW1nPSR0aGlzLmZpbmQoJ2ltZycpO3ZhciAkaW1nd2lkdGg9JGltZy53aWR0aCgpO3ZhciAkaW1naGVpZ2h0PSRpbWcuaGVpZ2h0KCk7aWYoby50aHVtYmNyb3ApeyRpbWcud2lkdGgoJGltZ3dpZHRoKm8uY3JvcHBlcmNlbnQpOyRpbWcuaGVpZ2h0KCgkaW1naGVpZ2h0LyRpbWd3aWR0aCkqJGltZy53aWR0aCgpKTskdGhpcy5jc3MoeydmbG9hdCc6J2xlZnQnLCd3aWR0aCc6by50aHVtYndpZHRoLCdoZWlnaHQnOm8udGh1bWJ3aWR0aCwnb3ZlcmZsb3cnOidoaWRkZW4nLCdjdXJzb3InOidwb2ludGVyJ30pfWVsc2V7JGltZy53aWR0aChvLnRodW1id2lkdGgpOyRpbWcuaGVpZ2h0KCgkaW1naGVpZ2h0LyRpbWd3aWR0aCkqby50aHVtYndpZHRoKTskdGhpcy5jc3MoeydmbG9hdCc6J2xlZnQnLCdjdXJzb3InOidwb2ludGVyJ30pOyR0aGlzLmhlaWdodCgkaW1nLmhlaWdodCgpKX0KJHRoaXMuY2xpY2soZnVuY3Rpb24oKXt2YXIgeD0kb3V0ZXIuZmluZCgnLnRodW1icyBsaScpLmluZGV4KCR0aGlzKTtpZihzaG93aW5nIT14KXskb3JpZy5maW5kKCdsaScpLmZhZGVPdXQoKTskb3JpZy5maW5kKCdsaScpLmVxKHgpLmZhZGVJbigpO3Nob3dpbmc9eH19KX0pO3ZhciAkdGh1bWI9JG91dGVyLmZpbmQoJy50aHVtYnMgbGknKTskdGh1bWIuZXEoMCkuYWRkQ2xhc3MoJ29uJyk7JHRodW1iLm5vdCgnLm9uJykuZmFkZVRvKDAsby5vcGFjaXR5KTskdGh1bWIuY2xpY2soZnVuY3Rpb24oKXt2YXIgdD0kKHRoaXMpO3ZhciBpPSR0aHVtYi5pbmRleCh0aGlzKTtpZihjdXJyZW50IT1pKXskdGh1bWIucmVtb3ZlQ2xhc3MoJ29uJyk7dC5hZGRDbGFzcygnb24nKTskdGh1bWIubm90KCcub24nKS5mYWRlVG8oMjAwLG8ub3BhY2l0eSk7Y3VycmVudD1pfX0pLmhvdmVyKGZ1bmN0aW9uKCl7JCh0aGlzKS5zdG9wKCkuZmFkZVRvKDIwMCwxKTskKHRoaXMpLmNsaWNrKCl9LGZ1bmN0aW9uKCl7JCh0aGlzKS5ub3QoJy5vbicpLnN0b3AoKS5mYWRlVG8oMjAwLG8ub3BhY2l0eSl9KX19fSl9KShqUXVlcnkpOyhmdW5jdGlvbigkLGRvY3VtZW50LHdpbmRvdyl7dmFyCmRlZmF1bHRzPXtodG1sOiExLHBob3RvOiExLGlmcmFtZTohMSxpbmxpbmU6ITEsdHJhbnNpdGlvbjoiZWxhc3RpYyIsc3BlZWQ6MzAwLGZhZGVPdXQ6MzAwLHdpZHRoOiExLGluaXRpYWxXaWR0aDoiNjAwIixpbm5lcldpZHRoOiExLG1heFdpZHRoOiExLGhlaWdodDohMSxpbml0aWFsSGVpZ2h0OiI0NTAiLGlubmVySGVpZ2h0OiExLG1heEhlaWdodDohMSxzY2FsZVBob3RvczohMCxzY3JvbGxpbmc6ITAsaHJlZjohMSx0aXRsZTohMSxyZWw6ITEsb3BhY2l0eTowLjkscHJlbG9hZGluZzohMCxjbGFzc05hbWU6ITEsb3ZlcmxheUNsb3NlOiEwLGVzY0tleTohMCxhcnJvd0tleTohMCx0b3A6ITEsYm90dG9tOiExLGxlZnQ6ITEscmlnaHQ6ITEsZml4ZWQ6ITEsZGF0YTp1bmRlZmluZWQsY2xvc2VCdXR0b246ITAsZmFzdElmcmFtZTohMCxvcGVuOiExLHJlcG9zaXRpb246ITAsbG9vcDohMCxzbGlkZXNob3c6ITEsc2xpZGVzaG93QXV0bzohMCxzbGlkZXNob3dTcGVlZDoyNTAwLHNsaWRlc2hvd1N0YXJ0OiJzdGFydCBzbGlkZXNob3ciLHNsaWRlc2hvd1N0b3A6InN0b3Agc2xpZGVzaG93IixwaG90b1JlZ2V4Oi9cLihnaWZ8cG5nfGpwKGV8Z3xlZyl8Ym1wfGljb3x3ZWJwKSgoI3xcPykuKik/JC9pLHJldGluYUltYWdlOiExLHJldGluYVVybDohMSxyZXRpbmFTdWZmaXg6J0AyeC4kMScsY3VycmVudDoiaW1hZ2Uge2N1cnJlbnR9IG9mIHt0b3RhbH0iLHByZXZpb3VzOiJwcmV2aW91cyIsbmV4dDoibmV4dCIsY2xvc2U6ImNsb3NlIix4aHJFcnJvcjoiVGhpcyBjb250ZW50IGZhaWxlZCB0byBsb2FkLiIsaW1nRXJyb3I6IlRoaXMgaW1hZ2UgZmFpbGVkIHRvIGxvYWQuIixyZXR1cm5Gb2N1czohMCx0cmFwRm9jdXM6ITAsb25PcGVuOiExLG9uTG9hZDohMSxvbkNvbXBsZXRlOiExLG9uQ2xlYW51cDohMSxvbkNsb3NlZDohMX0sY29sb3Jib3g9J2NvbG9yYm94JyxwcmVmaXg9J2Nib3gnLGJveEVsZW1lbnQ9cHJlZml4KydFbGVtZW50JyxldmVudF9vcGVuPXByZWZpeCsnX29wZW4nLGV2ZW50X2xvYWQ9cHJlZml4KydfbG9hZCcsZXZlbnRfY29tcGxldGU9cHJlZml4KydfY29tcGxldGUnLGV2ZW50X2NsZWFudXA9cHJlZml4KydfY2xlYW51cCcsZXZlbnRfY2xvc2VkPXByZWZpeCsnX2Nsb3NlZCcsZXZlbnRfcHVyZ2U9cHJlZml4KydfcHVyZ2UnLCRvdmVybGF5LCRib3gsJHdyYXAsJGNvbnRlbnQsJHRvcEJvcmRlciwkbGVmdEJvcmRlciwkcmlnaHRCb3JkZXIsJGJvdHRvbUJvcmRlciwkcmVsYXRlZCwkd2luZG93LCRsb2FkZWQsJGxvYWRpbmdCYXksJGxvYWRpbmdPdmVybGF5LCR0aXRsZSwkY3VycmVudCwkc2xpZGVzaG93LCRuZXh0LCRwcmV2LCRjbG9zZSwkZ3JvdXBDb250cm9scywkZXZlbnRzPSQoJzxhLz4nKSxzZXR0aW5ncyxpbnRlcmZhY2VIZWlnaHQsaW50ZXJmYWNlV2lkdGgsbG9hZGVkSGVpZ2h0LGxvYWRlZFdpZHRoLGVsZW1lbnQsaW5kZXgscGhvdG8sb3BlbixhY3RpdmUsY2xvc2luZyxsb2FkaW5nVGltZXIscHVibGljTWV0aG9kLGRpdj0iZGl2IixjbGFzc05hbWUscmVxdWVzdHM9MCxwcmV2aW91c0NTUz17fSxpbml0O2Z1bmN0aW9uICR0YWcodGFnLGlkLGNzcyl7dmFyIGVsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO2lmKGlkKXtlbGVtZW50LmlkPXByZWZpeCtpZH0KaWYoY3NzKXtlbGVtZW50LnN0eWxlLmNzc1RleHQ9Y3NzfQpyZXR1cm4gJChlbGVtZW50KX0KZnVuY3Rpb24gd2luaGVpZ2h0KCl7cmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodD93aW5kb3cuaW5uZXJIZWlnaHQ6JCh3aW5kb3cpLmhlaWdodCgpfQpmdW5jdGlvbiBnZXRJbmRleChpbmNyZW1lbnQpe3ZhcgptYXg9JHJlbGF0ZWQubGVuZ3RoLG5ld0luZGV4PShpbmRleCtpbmNyZW1lbnQpJW1heDtyZXR1cm4obmV3SW5kZXg8MCk/bWF4K25ld0luZGV4Om5ld0luZGV4fQpmdW5jdGlvbiBzZXRTaXplKHNpemUsZGltZW5zaW9uKXtyZXR1cm4gTWF0aC5yb3VuZCgoLyUvLnRlc3Qoc2l6ZSk/KChkaW1lbnNpb249PT0neCc/JHdpbmRvdy53aWR0aCgpOndpbmhlaWdodCgpKS8xMDApOjEpKnBhcnNlSW50KHNpemUsMTApKX0KZnVuY3Rpb24gaXNJbWFnZShzZXR0aW5ncyx1cmwpe3JldHVybiBzZXR0aW5ncy5waG90b3x8c2V0dGluZ3MucGhvdG9SZWdleC50ZXN0KHVybCl9CmZ1bmN0aW9uIHJldGluYVVybChzZXR0aW5ncyx1cmwpe3JldHVybiBzZXR0aW5ncy5yZXRpbmFVcmwmJndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvPjE/dXJsLnJlcGxhY2Uoc2V0dGluZ3MucGhvdG9SZWdleCxzZXR0aW5ncy5yZXRpbmFTdWZmaXgpOnVybH0KZnVuY3Rpb24gdHJhcEZvY3VzKGUpe2lmKCdjb250YWlucycgaW4gJGJveFswXSYmISRib3hbMF0uY29udGFpbnMoZS50YXJnZXQpKXtlLnN0b3BQcm9wYWdhdGlvbigpOyRib3guZm9jdXMoKX19CmZ1bmN0aW9uIG1ha2VTZXR0aW5ncygpe3ZhciBpLGRhdGE9JC5kYXRhKGVsZW1lbnQsY29sb3Jib3gpO2lmKGRhdGE9PW51bGwpe3NldHRpbmdzPSQuZXh0ZW5kKHt9LGRlZmF1bHRzKTtpZihjb25zb2xlJiZjb25zb2xlLmxvZyl7Y29uc29sZS5sb2coJ0Vycm9yOiBjYm94RWxlbWVudCBtaXNzaW5nIHNldHRpbmdzIG9iamVjdCcpfX1lbHNle3NldHRpbmdzPSQuZXh0ZW5kKHt9LGRhdGEpfQpmb3IoaSBpbiBzZXR0aW5ncyl7aWYoJC5pc0Z1bmN0aW9uKHNldHRpbmdzW2ldKSYmaS5zbGljZSgwLDIpIT09J29uJyl7c2V0dGluZ3NbaV09c2V0dGluZ3NbaV0uY2FsbChlbGVtZW50KX19CnNldHRpbmdzLnJlbD1zZXR0aW5ncy5yZWx8fGVsZW1lbnQucmVsfHwkKGVsZW1lbnQpLmRhdGEoJ3JlbCcpfHwnbm9mb2xsb3cnO3NldHRpbmdzLmhyZWY9c2V0dGluZ3MuaHJlZnx8JChlbGVtZW50KS5hdHRyKCdocmVmJyk7c2V0dGluZ3MudGl0bGU9c2V0dGluZ3MudGl0bGV8fGVsZW1lbnQudGl0bGU7aWYodHlwZW9mIHNldHRpbmdzLmhyZWY9PT0ic3RyaW5nIil7c2V0dGluZ3MuaHJlZj0kLnRyaW0oc2V0dGluZ3MuaHJlZil9fQpmdW5jdGlvbiB0cmlnZ2VyKGV2ZW50LGNhbGxiYWNrKXskKGRvY3VtZW50KS50cmlnZ2VyKGV2ZW50KTskZXZlbnRzLnRyaWdnZXJIYW5kbGVyKGV2ZW50KTtpZigkLmlzRnVuY3Rpb24oY2FsbGJhY2spKXtjYWxsYmFjay5jYWxsKGVsZW1lbnQpfX0KdmFyIHNsaWRlc2hvdz0oZnVuY3Rpb24oKXt2YXIgYWN0aXZlLGNsYXNzTmFtZT1wcmVmaXgrIlNsaWRlc2hvd18iLGNsaWNrPSJjbGljay4iK3ByZWZpeCx0aW1lT3V0O2Z1bmN0aW9uIGNsZWFyKCl7Y2xlYXJUaW1lb3V0KHRpbWVPdXQpfQpmdW5jdGlvbiBzZXQoKXtpZihzZXR0aW5ncy5sb29wfHwkcmVsYXRlZFtpbmRleCsxXSl7Y2xlYXIoKTt0aW1lT3V0PXNldFRpbWVvdXQocHVibGljTWV0aG9kLm5leHQsc2V0dGluZ3Muc2xpZGVzaG93U3BlZWQpfX0KZnVuY3Rpb24gc3RhcnQoKXskc2xpZGVzaG93Lmh0bWwoc2V0dGluZ3Muc2xpZGVzaG93U3RvcCkudW5iaW5kKGNsaWNrKS5vbmUoY2xpY2ssc3RvcCk7JGV2ZW50cy5iaW5kKGV2ZW50X2NvbXBsZXRlLHNldCkuYmluZChldmVudF9sb2FkLGNsZWFyKTskYm94LnJlbW92ZUNsYXNzKGNsYXNzTmFtZSsib2ZmIikuYWRkQ2xhc3MoY2xhc3NOYW1lKyJvbiIpfQpmdW5jdGlvbiBzdG9wKCl7Y2xlYXIoKTskZXZlbnRzLnVuYmluZChldmVudF9jb21wbGV0ZSxzZXQpLnVuYmluZChldmVudF9sb2FkLGNsZWFyKTskc2xpZGVzaG93Lmh0bWwoc2V0dGluZ3Muc2xpZGVzaG93U3RhcnQpLnVuYmluZChjbGljaykub25lKGNsaWNrLGZ1bmN0aW9uKCl7cHVibGljTWV0aG9kLm5leHQoKTtzdGFydCgpfSk7JGJveC5yZW1vdmVDbGFzcyhjbGFzc05hbWUrIm9uIikuYWRkQ2xhc3MoY2xhc3NOYW1lKyJvZmYiKX0KZnVuY3Rpb24gcmVzZXQoKXthY3RpdmU9ITE7JHNsaWRlc2hvdy5oaWRlKCk7Y2xlYXIoKTskZXZlbnRzLnVuYmluZChldmVudF9jb21wbGV0ZSxzZXQpLnVuYmluZChldmVudF9sb2FkLGNsZWFyKTskYm94LnJlbW92ZUNsYXNzKGNsYXNzTmFtZSsib2ZmICIrY2xhc3NOYW1lKyJvbiIpfQpyZXR1cm4gZnVuY3Rpb24oKXtpZihhY3RpdmUpe2lmKCFzZXR0aW5ncy5zbGlkZXNob3cpeyRldmVudHMudW5iaW5kKGV2ZW50X2NsZWFudXAscmVzZXQpO3Jlc2V0KCl9fWVsc2V7aWYoc2V0dGluZ3Muc2xpZGVzaG93JiYkcmVsYXRlZFsxXSl7YWN0aXZlPSEwOyRldmVudHMub25lKGV2ZW50X2NsZWFudXAscmVzZXQpO2lmKHNldHRpbmdzLnNsaWRlc2hvd0F1dG8pe3N0YXJ0KCl9ZWxzZXtzdG9wKCl9CiRzbGlkZXNob3cuc2hvdygpfX19fSgpKTtmdW5jdGlvbiBsYXVuY2godGFyZ2V0KXtpZighY2xvc2luZyl7ZWxlbWVudD10YXJnZXQ7bWFrZVNldHRpbmdzKCk7JHJlbGF0ZWQ9JChlbGVtZW50KTtpbmRleD0wO2lmKHNldHRpbmdzLnJlbCE9PSdub2ZvbGxvdycpeyRyZWxhdGVkPSQoJy4nK2JveEVsZW1lbnQpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBkYXRhPSQuZGF0YSh0aGlzLGNvbG9yYm94KSxyZWxSZWxhdGVkO2lmKGRhdGEpe3JlbFJlbGF0ZWQ9JCh0aGlzKS5kYXRhKCdyZWwnKXx8ZGF0YS5yZWx8fHRoaXMucmVsfQpyZXR1cm4ocmVsUmVsYXRlZD09PXNldHRpbmdzLnJlbCl9KTtpbmRleD0kcmVsYXRlZC5pbmRleChlbGVtZW50KTtpZihpbmRleD09PS0xKXskcmVsYXRlZD0kcmVsYXRlZC5hZGQoZWxlbWVudCk7aW5kZXg9JHJlbGF0ZWQubGVuZ3RoLTF9fQokb3ZlcmxheS5jc3Moe29wYWNpdHk6cGFyc2VGbG9hdChzZXR0aW5ncy5vcGFjaXR5KSxjdXJzb3I6c2V0dGluZ3Mub3ZlcmxheUNsb3NlPyJwb2ludGVyIjoiYXV0byIsdmlzaWJpbGl0eTondmlzaWJsZSd9KS5zaG93KCk7aWYoY2xhc3NOYW1lKXskYm94LmFkZCgkb3ZlcmxheSkucmVtb3ZlQ2xhc3MoY2xhc3NOYW1lKX0KaWYoc2V0dGluZ3MuY2xhc3NOYW1lKXskYm94LmFkZCgkb3ZlcmxheSkuYWRkQ2xhc3Moc2V0dGluZ3MuY2xhc3NOYW1lKX0KY2xhc3NOYW1lPXNldHRpbmdzLmNsYXNzTmFtZTtpZihzZXR0aW5ncy5jbG9zZUJ1dHRvbil7JGNsb3NlLmh0bWwoc2V0dGluZ3MuY2xvc2UpLmFwcGVuZFRvKCRjb250ZW50KX1lbHNleyRjbG9zZS5hcHBlbmRUbygnPGRpdi8+Jyl9CmlmKCFvcGVuKXtvcGVuPWFjdGl2ZT0hMDskYm94LmNzcyh7dmlzaWJpbGl0eTonaGlkZGVuJyxkaXNwbGF5OidibG9jayd9KTskbG9hZGVkPSR0YWcoZGl2LCdMb2FkZWRDb250ZW50Jywnd2lkdGg6MDsgaGVpZ2h0OjA7IG92ZXJmbG93OmhpZGRlbicpOyRjb250ZW50LmNzcyh7d2lkdGg6JycsaGVpZ2h0OicnfSkuYXBwZW5kKCRsb2FkZWQpO2ludGVyZmFjZUhlaWdodD0kdG9wQm9yZGVyLmhlaWdodCgpKyRib3R0b21Cb3JkZXIuaGVpZ2h0KCkrJGNvbnRlbnQub3V0ZXJIZWlnaHQoITApLSRjb250ZW50LmhlaWdodCgpO2ludGVyZmFjZVdpZHRoPSRsZWZ0Qm9yZGVyLndpZHRoKCkrJHJpZ2h0Qm9yZGVyLndpZHRoKCkrJGNvbnRlbnQub3V0ZXJXaWR0aCghMCktJGNvbnRlbnQud2lkdGgoKTtsb2FkZWRIZWlnaHQ9JGxvYWRlZC5vdXRlckhlaWdodCghMCk7bG9hZGVkV2lkdGg9JGxvYWRlZC5vdXRlcldpZHRoKCEwKTtzZXR0aW5ncy53PXNldFNpemUoc2V0dGluZ3MuaW5pdGlhbFdpZHRoLCd4Jyk7c2V0dGluZ3MuaD1zZXRTaXplKHNldHRpbmdzLmluaXRpYWxIZWlnaHQsJ3knKTskbG9hZGVkLmNzcyh7d2lkdGg6JycsaGVpZ2h0OnNldHRpbmdzLmh9KTtwdWJsaWNNZXRob2QucG9zaXRpb24oKTt0cmlnZ2VyKGV2ZW50X29wZW4sc2V0dGluZ3Mub25PcGVuKTskZ3JvdXBDb250cm9scy5hZGQoJHRpdGxlKS5oaWRlKCk7JGJveC5mb2N1cygpO2lmKHNldHRpbmdzLnRyYXBGb2N1cyl7aWYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcil7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLHRyYXBGb2N1cywhMCk7JGV2ZW50cy5vbmUoZXZlbnRfY2xvc2VkLGZ1bmN0aW9uKCl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLHRyYXBGb2N1cywhMCl9KX19CmlmKHNldHRpbmdzLnJldHVybkZvY3VzKXskZXZlbnRzLm9uZShldmVudF9jbG9zZWQsZnVuY3Rpb24oKXskKGVsZW1lbnQpLmZvY3VzKCl9KX19CmxvYWQoKX19CmZ1bmN0aW9uIGFwcGVuZEhUTUwoKXtpZighJGJveCYmZG9jdW1lbnQuYm9keSl7aW5pdD0hMTskd2luZG93PSQod2luZG93KTskYm94PSR0YWcoZGl2KS5hdHRyKHtpZDpjb2xvcmJveCwnY2xhc3MnOiQuc3VwcG9ydC5vcGFjaXR5PT09ITE/cHJlZml4KydJRSc6Jycscm9sZTonZGlhbG9nJyx0YWJpbmRleDonLTEnfSkuaGlkZSgpOyRvdmVybGF5PSR0YWcoZGl2LCJPdmVybGF5IikuaGlkZSgpOyRsb2FkaW5nT3ZlcmxheT0kKFskdGFnKGRpdiwiTG9hZGluZ092ZXJsYXkiKVswXSwkdGFnKGRpdiwiTG9hZGluZ0dyYXBoaWMiKVswXV0pOyR3cmFwPSR0YWcoZGl2LCJXcmFwcGVyIik7JGNvbnRlbnQ9JHRhZyhkaXYsIkNvbnRlbnQiKS5hcHBlbmQoJHRpdGxlPSR0YWcoZGl2LCJUaXRsZSIpLCRjdXJyZW50PSR0YWcoZGl2LCJDdXJyZW50IiksJHByZXY9JCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hdHRyKHtpZDpwcmVmaXgrJ1ByZXZpb3VzJ30pLCRuZXh0PSQoJzxidXR0b24gdHlwZT0iYnV0dG9uIi8+JykuYXR0cih7aWQ6cHJlZml4KydOZXh0J30pLCRzbGlkZXNob3c9JHRhZygnYnV0dG9uJywiU2xpZGVzaG93IiksJGxvYWRpbmdPdmVybGF5KTskY2xvc2U9JCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hdHRyKHtpZDpwcmVmaXgrJ0Nsb3NlJ30pOyR3cmFwLmFwcGVuZCgkdGFnKGRpdikuYXBwZW5kKCR0YWcoZGl2LCJUb3BMZWZ0IiksJHRvcEJvcmRlcj0kdGFnKGRpdiwiVG9wQ2VudGVyIiksJHRhZyhkaXYsIlRvcFJpZ2h0IikpLCR0YWcoZGl2LCExLCdjbGVhcjpsZWZ0JykuYXBwZW5kKCRsZWZ0Qm9yZGVyPSR0YWcoZGl2LCJNaWRkbGVMZWZ0IiksJGNvbnRlbnQsJHJpZ2h0Qm9yZGVyPSR0YWcoZGl2LCJNaWRkbGVSaWdodCIpKSwkdGFnKGRpdiwhMSwnY2xlYXI6bGVmdCcpLmFwcGVuZCgkdGFnKGRpdiwiQm90dG9tTGVmdCIpLCRib3R0b21Cb3JkZXI9JHRhZyhkaXYsIkJvdHRvbUNlbnRlciIpLCR0YWcoZGl2LCJCb3R0b21SaWdodCIpKSkuZmluZCgnZGl2IGRpdicpLmNzcyh7J2Zsb2F0JzonbGVmdCd9KTskbG9hZGluZ0JheT0kdGFnKGRpdiwhMSwncG9zaXRpb246YWJzb2x1dGU7IHdpZHRoOjk5OTlweDsgdmlzaWJpbGl0eTpoaWRkZW47IGRpc3BsYXk6bm9uZTsgbWF4LXdpZHRoOm5vbmU7Jyk7JGdyb3VwQ29udHJvbHM9JG5leHQuYWRkKCRwcmV2KS5hZGQoJGN1cnJlbnQpLmFkZCgkc2xpZGVzaG93KTskKGRvY3VtZW50LmJvZHkpLmFwcGVuZCgkb3ZlcmxheSwkYm94LmFwcGVuZCgkd3JhcCwkbG9hZGluZ0JheSkpfX0KZnVuY3Rpb24gYWRkQmluZGluZ3MoKXtmdW5jdGlvbiBjbGlja0hhbmRsZXIoZSl7aWYoIShlLndoaWNoPjF8fGUuc2hpZnRLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXl8fGUuY3RybEtleSkpe2UucHJldmVudERlZmF1bHQoKTtsYXVuY2godGhpcyl9fQppZigkYm94KXtpZighaW5pdCl7aW5pdD0hMDskbmV4dC5jbGljayhmdW5jdGlvbigpe3B1YmxpY01ldGhvZC5uZXh0KCl9KTskcHJldi5jbGljayhmdW5jdGlvbigpe3B1YmxpY01ldGhvZC5wcmV2KCl9KTskY2xvc2UuY2xpY2soZnVuY3Rpb24oKXtwdWJsaWNNZXRob2QuY2xvc2UoKX0pOyRvdmVybGF5LmNsaWNrKGZ1bmN0aW9uKCl7aWYoc2V0dGluZ3Mub3ZlcmxheUNsb3NlKXtwdWJsaWNNZXRob2QuY2xvc2UoKX19KTskKGRvY3VtZW50KS5iaW5kKCdrZXlkb3duLicrcHJlZml4LGZ1bmN0aW9uKGUpe3ZhciBrZXk9ZS5rZXlDb2RlO2lmKG9wZW4mJnNldHRpbmdzLmVzY0tleSYma2V5PT09Mjcpe2UucHJldmVudERlZmF1bHQoKTtwdWJsaWNNZXRob2QuY2xvc2UoKX0KaWYob3BlbiYmc2V0dGluZ3MuYXJyb3dLZXkmJiRyZWxhdGVkWzFdJiYhZS5hbHRLZXkpe2lmKGtleT09PTM3KXtlLnByZXZlbnREZWZhdWx0KCk7JHByZXYuY2xpY2soKX1lbHNlIGlmKGtleT09PTM5KXtlLnByZXZlbnREZWZhdWx0KCk7JG5leHQuY2xpY2soKX19fSk7aWYoJC5pc0Z1bmN0aW9uKCQuZm4ub24pKXskKGRvY3VtZW50KS5vbignY2xpY2suJytwcmVmaXgsJy4nK2JveEVsZW1lbnQsY2xpY2tIYW5kbGVyKX1lbHNleyQoJy4nK2JveEVsZW1lbnQpLmxpdmUoJ2NsaWNrLicrcHJlZml4LGNsaWNrSGFuZGxlcil9fQpyZXR1cm4hMH0KcmV0dXJuITF9CmlmKCQuY29sb3Jib3gpe3JldHVybn0KJChhcHBlbmRIVE1MKTtwdWJsaWNNZXRob2Q9JC5mbltjb2xvcmJveF09JFtjb2xvcmJveF09ZnVuY3Rpb24ob3B0aW9ucyxjYWxsYmFjayl7dmFyICR0aGlzPXRoaXM7b3B0aW9ucz1vcHRpb25zfHx7fTthcHBlbmRIVE1MKCk7aWYoYWRkQmluZGluZ3MoKSl7aWYoJC5pc0Z1bmN0aW9uKCR0aGlzKSl7JHRoaXM9JCgnPGEvPicpO29wdGlvbnMub3Blbj0hMH1lbHNlIGlmKCEkdGhpc1swXSl7cmV0dXJuICR0aGlzfQppZihjYWxsYmFjayl7b3B0aW9ucy5vbkNvbXBsZXRlPWNhbGxiYWNrfQokdGhpcy5lYWNoKGZ1bmN0aW9uKCl7JC5kYXRhKHRoaXMsY29sb3Jib3gsJC5leHRlbmQoe30sJC5kYXRhKHRoaXMsY29sb3Jib3gpfHxkZWZhdWx0cyxvcHRpb25zKSl9KS5hZGRDbGFzcyhib3hFbGVtZW50KTtpZigoJC5pc0Z1bmN0aW9uKG9wdGlvbnMub3BlbikmJm9wdGlvbnMub3Blbi5jYWxsKCR0aGlzKSl8fG9wdGlvbnMub3Blbil7bGF1bmNoKCR0aGlzWzBdKX19CnJldHVybiAkdGhpc307cHVibGljTWV0aG9kLnBvc2l0aW9uPWZ1bmN0aW9uKHNwZWVkLGxvYWRlZENhbGxiYWNrKXt2YXIKY3NzLHRvcD0wLGxlZnQ9MCxvZmZzZXQ9JGJveC5vZmZzZXQoKSxzY3JvbGxUb3Asc2Nyb2xsTGVmdDskd2luZG93LnVuYmluZCgncmVzaXplLicrcHJlZml4KTskYm94LmNzcyh7dG9wOi05ZTQsbGVmdDotOWU0fSk7c2Nyb2xsVG9wPSR3aW5kb3cuc2Nyb2xsVG9wKCk7c2Nyb2xsTGVmdD0kd2luZG93LnNjcm9sbExlZnQoKTtpZihzZXR0aW5ncy5maXhlZCl7b2Zmc2V0LnRvcC09c2Nyb2xsVG9wO29mZnNldC5sZWZ0LT1zY3JvbGxMZWZ0OyRib3guY3NzKHtwb3NpdGlvbjonZml4ZWQnfSl9ZWxzZXt0b3A9c2Nyb2xsVG9wO2xlZnQ9c2Nyb2xsTGVmdDskYm94LmNzcyh7cG9zaXRpb246J2Fic29sdXRlJ30pfQppZihzZXR0aW5ncy5yaWdodCE9PSExKXtsZWZ0Kz1NYXRoLm1heCgkd2luZG93LndpZHRoKCktc2V0dGluZ3Mudy1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aC1zZXRTaXplKHNldHRpbmdzLnJpZ2h0LCd4JyksMCl9ZWxzZSBpZihzZXR0aW5ncy5sZWZ0IT09ITEpe2xlZnQrPXNldFNpemUoc2V0dGluZ3MubGVmdCwneCcpfWVsc2V7bGVmdCs9TWF0aC5yb3VuZChNYXRoLm1heCgkd2luZG93LndpZHRoKCktc2V0dGluZ3Mudy1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aCwwKS8yKX0KaWYoc2V0dGluZ3MuYm90dG9tIT09ITEpe3RvcCs9TWF0aC5tYXgod2luaGVpZ2h0KCktc2V0dGluZ3MuaC1sb2FkZWRIZWlnaHQtaW50ZXJmYWNlSGVpZ2h0LXNldFNpemUoc2V0dGluZ3MuYm90dG9tLCd5JyksMCl9ZWxzZSBpZihzZXR0aW5ncy50b3AhPT0hMSl7dG9wKz1zZXRTaXplKHNldHRpbmdzLnRvcCwneScpfWVsc2V7dG9wKz1NYXRoLnJvdW5kKE1hdGgubWF4KHdpbmhlaWdodCgpLXNldHRpbmdzLmgtbG9hZGVkSGVpZ2h0LWludGVyZmFjZUhlaWdodCwwKS8yKX0KJGJveC5jc3Moe3RvcDpvZmZzZXQudG9wLGxlZnQ6b2Zmc2V0LmxlZnQsdmlzaWJpbGl0eTondmlzaWJsZSd9KTskd3JhcFswXS5zdHlsZS53aWR0aD0kd3JhcFswXS5zdHlsZS5oZWlnaHQ9Ijk5OTlweCI7ZnVuY3Rpb24gbW9kYWxEaW1lbnNpb25zKCl7JHRvcEJvcmRlclswXS5zdHlsZS53aWR0aD0kYm90dG9tQm9yZGVyWzBdLnN0eWxlLndpZHRoPSRjb250ZW50WzBdLnN0eWxlLndpZHRoPShwYXJzZUludCgkYm94WzBdLnN0eWxlLndpZHRoLDEwKS1pbnRlcmZhY2VXaWR0aCkrJ3B4JzskY29udGVudFswXS5zdHlsZS5oZWlnaHQ9JGxlZnRCb3JkZXJbMF0uc3R5bGUuaGVpZ2h0PSRyaWdodEJvcmRlclswXS5zdHlsZS5oZWlnaHQ9KHBhcnNlSW50KCRib3hbMF0uc3R5bGUuaGVpZ2h0LDEwKS1pbnRlcmZhY2VIZWlnaHQpKydweCd9CmNzcz17d2lkdGg6c2V0dGluZ3Mudytsb2FkZWRXaWR0aCtpbnRlcmZhY2VXaWR0aCxoZWlnaHQ6c2V0dGluZ3MuaCtsb2FkZWRIZWlnaHQraW50ZXJmYWNlSGVpZ2h0LHRvcDp0b3AsbGVmdDpsZWZ0fTtpZihzcGVlZCl7dmFyIHRlbXBTcGVlZD0wOyQuZWFjaChjc3MsZnVuY3Rpb24oaSl7aWYoY3NzW2ldIT09cHJldmlvdXNDU1NbaV0pe3RlbXBTcGVlZD1zcGVlZH19KTtzcGVlZD10ZW1wU3BlZWR9CnByZXZpb3VzQ1NTPWNzcztpZighc3BlZWQpeyRib3guY3NzKGNzcyl9CiRib3guZGVxdWV1ZSgpLmFuaW1hdGUoY3NzLHtkdXJhdGlvbjpzcGVlZHx8MCxjb21wbGV0ZTpmdW5jdGlvbigpe21vZGFsRGltZW5zaW9ucygpO2FjdGl2ZT0hMTskd3JhcFswXS5zdHlsZS53aWR0aD0oc2V0dGluZ3Mudytsb2FkZWRXaWR0aCtpbnRlcmZhY2VXaWR0aCkrInB4Ijskd3JhcFswXS5zdHlsZS5oZWlnaHQ9KHNldHRpbmdzLmgrbG9hZGVkSGVpZ2h0K2ludGVyZmFjZUhlaWdodCkrInB4IjtpZihzZXR0aW5ncy5yZXBvc2l0aW9uKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JHdpbmRvdy5iaW5kKCdyZXNpemUuJytwcmVmaXgscHVibGljTWV0aG9kLnBvc2l0aW9uKX0sMSl9CmlmKGxvYWRlZENhbGxiYWNrKXtsb2FkZWRDYWxsYmFjaygpfX0sc3RlcDptb2RhbERpbWVuc2lvbnN9KX07cHVibGljTWV0aG9kLnJlc2l6ZT1mdW5jdGlvbihvcHRpb25zKXt2YXIgc2Nyb2xsdG9wO2lmKG9wZW4pe29wdGlvbnM9b3B0aW9uc3x8e307aWYob3B0aW9ucy53aWR0aCl7c2V0dGluZ3Mudz1zZXRTaXplKG9wdGlvbnMud2lkdGgsJ3gnKS1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aH0KaWYob3B0aW9ucy5pbm5lcldpZHRoKXtzZXR0aW5ncy53PXNldFNpemUob3B0aW9ucy5pbm5lcldpZHRoLCd4Jyl9CiRsb2FkZWQuY3NzKHt3aWR0aDpzZXR0aW5ncy53fSk7aWYob3B0aW9ucy5oZWlnaHQpe3NldHRpbmdzLmg9c2V0U2l6ZShvcHRpb25zLmhlaWdodCwneScpLWxvYWRlZEhlaWdodC1pbnRlcmZhY2VIZWlnaHR9CmlmKG9wdGlvbnMuaW5uZXJIZWlnaHQpe3NldHRpbmdzLmg9c2V0U2l6ZShvcHRpb25zLmlubmVySGVpZ2h0LCd5Jyl9CmlmKCFvcHRpb25zLmlubmVySGVpZ2h0JiYhb3B0aW9ucy5oZWlnaHQpe3Njcm9sbHRvcD0kbG9hZGVkLnNjcm9sbFRvcCgpOyRsb2FkZWQuY3NzKHtoZWlnaHQ6ImF1dG8ifSk7c2V0dGluZ3MuaD0kbG9hZGVkLmhlaWdodCgpfQokbG9hZGVkLmNzcyh7aGVpZ2h0OnNldHRpbmdzLmh9KTtpZihzY3JvbGx0b3ApeyRsb2FkZWQuc2Nyb2xsVG9wKHNjcm9sbHRvcCl9CnB1YmxpY01ldGhvZC5wb3NpdGlvbihzZXR0aW5ncy50cmFuc2l0aW9uPT09Im5vbmUiPzA6c2V0dGluZ3Muc3BlZWQpfX07cHVibGljTWV0aG9kLnByZXA9ZnVuY3Rpb24ob2JqZWN0KXtpZighb3Blbil7cmV0dXJufQp2YXIgY2FsbGJhY2ssc3BlZWQ9c2V0dGluZ3MudHJhbnNpdGlvbj09PSJub25lIj8wOnNldHRpbmdzLnNwZWVkOyRsb2FkZWQuZW1wdHkoKS5yZW1vdmUoKTskbG9hZGVkPSR0YWcoZGl2LCdMb2FkZWRDb250ZW50JykuYXBwZW5kKG9iamVjdCk7ZnVuY3Rpb24gZ2V0V2lkdGgoKXtzZXR0aW5ncy53PXNldHRpbmdzLnd8fCRsb2FkZWQud2lkdGgoKTtzZXR0aW5ncy53PXNldHRpbmdzLm13JiZzZXR0aW5ncy5tdzxzZXR0aW5ncy53P3NldHRpbmdzLm13OnNldHRpbmdzLnc7cmV0dXJuIHNldHRpbmdzLnd9CmZ1bmN0aW9uIGdldEhlaWdodCgpe3NldHRpbmdzLmg9c2V0dGluZ3MuaHx8JGxvYWRlZC5oZWlnaHQoKTtzZXR0aW5ncy5oPXNldHRpbmdzLm1oJiZzZXR0aW5ncy5taDxzZXR0aW5ncy5oP3NldHRpbmdzLm1oOnNldHRpbmdzLmg7cmV0dXJuIHNldHRpbmdzLmh9CiRsb2FkZWQuaGlkZSgpLmFwcGVuZFRvKCRsb2FkaW5nQmF5LnNob3coKSkuY3NzKHt3aWR0aDpnZXRXaWR0aCgpLG92ZXJmbG93OnNldHRpbmdzLnNjcm9sbGluZz8nYXV0byc6J2hpZGRlbid9KS5jc3Moe2hlaWdodDpnZXRIZWlnaHQoKX0pLnByZXBlbmRUbygkY29udGVudCk7JGxvYWRpbmdCYXkuaGlkZSgpOyQocGhvdG8pLmNzcyh7J2Zsb2F0Jzonbm9uZSd9KTtjYWxsYmFjaz1mdW5jdGlvbigpe3ZhciB0b3RhbD0kcmVsYXRlZC5sZW5ndGgsaWZyYW1lLGZyYW1lQm9yZGVyPSdmcmFtZUJvcmRlcicsYWxsb3dUcmFuc3BhcmVuY3k9J2FsbG93VHJhbnNwYXJlbmN5Jyxjb21wbGV0ZTtpZighb3Blbil7cmV0dXJufQpmdW5jdGlvbiByZW1vdmVGaWx0ZXIoKXtpZigkLnN1cHBvcnQub3BhY2l0eT09PSExKXskYm94WzBdLnN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgnZmlsdGVyJyl9fQpjb21wbGV0ZT1mdW5jdGlvbigpe2NsZWFyVGltZW91dChsb2FkaW5nVGltZXIpOyRsb2FkaW5nT3ZlcmxheS5oaWRlKCk7dHJpZ2dlcihldmVudF9jb21wbGV0ZSxzZXR0aW5ncy5vbkNvbXBsZXRlKX07JHRpdGxlLmh0bWwoc2V0dGluZ3MudGl0bGUpLmFkZCgkbG9hZGVkKS5zaG93KCk7aWYodG90YWw+MSl7aWYodHlwZW9mIHNldHRpbmdzLmN1cnJlbnQ9PT0ic3RyaW5nIil7JGN1cnJlbnQuaHRtbChzZXR0aW5ncy5jdXJyZW50LnJlcGxhY2UoJ3tjdXJyZW50fScsaW5kZXgrMSkucmVwbGFjZSgne3RvdGFsfScsdG90YWwpKS5zaG93KCl9CiRuZXh0WyhzZXR0aW5ncy5sb29wfHxpbmRleDx0b3RhbC0xKT8ic2hvdyI6ImhpZGUiXSgpLmh0bWwoc2V0dGluZ3MubmV4dCk7JHByZXZbKHNldHRpbmdzLmxvb3B8fGluZGV4KT8ic2hvdyI6ImhpZGUiXSgpLmh0bWwoc2V0dGluZ3MucHJldmlvdXMpO3NsaWRlc2hvdygpO2lmKHNldHRpbmdzLnByZWxvYWRpbmcpeyQuZWFjaChbZ2V0SW5kZXgoLTEpLGdldEluZGV4KDEpXSxmdW5jdGlvbigpe3ZhciBzcmMsaW1nLGk9JHJlbGF0ZWRbdGhpc10sZGF0YT0kLmRhdGEoaSxjb2xvcmJveCk7aWYoZGF0YSYmZGF0YS5ocmVmKXtzcmM9ZGF0YS5ocmVmO2lmKCQuaXNGdW5jdGlvbihzcmMpKXtzcmM9c3JjLmNhbGwoaSl9fWVsc2V7c3JjPSQoaSkuYXR0cignaHJlZicpfQppZihzcmMmJmlzSW1hZ2UoZGF0YSxzcmMpKXtzcmM9cmV0aW5hVXJsKGRhdGEsc3JjKTtpbWc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7aW1nLnNyYz1zcmN9fSl9fWVsc2V7JGdyb3VwQ29udHJvbHMuaGlkZSgpfQppZihzZXR0aW5ncy5pZnJhbWUpe2lmcmFtZT0kdGFnKCdpZnJhbWUnKVswXTtpZihmcmFtZUJvcmRlciBpbiBpZnJhbWUpe2lmcmFtZVtmcmFtZUJvcmRlcl09MH0KaWYoYWxsb3dUcmFuc3BhcmVuY3kgaW4gaWZyYW1lKXtpZnJhbWVbYWxsb3dUcmFuc3BhcmVuY3ldPSJ0cnVlIn0KaWYoIXNldHRpbmdzLnNjcm9sbGluZyl7aWZyYW1lLnNjcm9sbGluZz0ibm8ifQokKGlmcmFtZSkuYXR0cih7c3JjOnNldHRpbmdzLmhyZWYsbmFtZToobmV3IERhdGUoKSkuZ2V0VGltZSgpLCdjbGFzcyc6cHJlZml4KydJZnJhbWUnLGFsbG93RnVsbFNjcmVlbjohMCx3ZWJraXRBbGxvd0Z1bGxTY3JlZW46ITAsbW96YWxsb3dmdWxsc2NyZWVuOiEwfSkub25lKCdsb2FkJyxjb21wbGV0ZSkuYXBwZW5kVG8oJGxvYWRlZCk7JGV2ZW50cy5vbmUoZXZlbnRfcHVyZ2UsZnVuY3Rpb24oKXtpZnJhbWUuc3JjPSIvL2Fib3V0OmJsYW5rIn0pO2lmKHNldHRpbmdzLmZhc3RJZnJhbWUpeyQoaWZyYW1lKS50cmlnZ2VyKCdsb2FkJyl9fWVsc2V7Y29tcGxldGUoKX0KaWYoc2V0dGluZ3MudHJhbnNpdGlvbj09PSdmYWRlJyl7JGJveC5mYWRlVG8oc3BlZWQsMSxyZW1vdmVGaWx0ZXIpfWVsc2V7cmVtb3ZlRmlsdGVyKCl9fTtpZihzZXR0aW5ncy50cmFuc2l0aW9uPT09J2ZhZGUnKXskYm94LmZhZGVUbyhzcGVlZCwwLGZ1bmN0aW9uKCl7cHVibGljTWV0aG9kLnBvc2l0aW9uKDAsY2FsbGJhY2spfSl9ZWxzZXtwdWJsaWNNZXRob2QucG9zaXRpb24oc3BlZWQsY2FsbGJhY2spfX07ZnVuY3Rpb24gbG9hZCgpe3ZhciBocmVmLHNldFJlc2l6ZSxwcmVwPXB1YmxpY01ldGhvZC5wcmVwLCRpbmxpbmUscmVxdWVzdD0rK3JlcXVlc3RzO2FjdGl2ZT0hMDtwaG90bz0hMTtlbGVtZW50PSRyZWxhdGVkW2luZGV4XTttYWtlU2V0dGluZ3MoKTt0cmlnZ2VyKGV2ZW50X3B1cmdlKTt0cmlnZ2VyKGV2ZW50X2xvYWQsc2V0dGluZ3Mub25Mb2FkKTtzZXR0aW5ncy5oPXNldHRpbmdzLmhlaWdodD9zZXRTaXplKHNldHRpbmdzLmhlaWdodCwneScpLWxvYWRlZEhlaWdodC1pbnRlcmZhY2VIZWlnaHQ6c2V0dGluZ3MuaW5uZXJIZWlnaHQmJnNldFNpemUoc2V0dGluZ3MuaW5uZXJIZWlnaHQsJ3knKTtzZXR0aW5ncy53PXNldHRpbmdzLndpZHRoP3NldFNpemUoc2V0dGluZ3Mud2lkdGgsJ3gnKS1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aDpzZXR0aW5ncy5pbm5lcldpZHRoJiZzZXRTaXplKHNldHRpbmdzLmlubmVyV2lkdGgsJ3gnKTtzZXR0aW5ncy5tdz1zZXR0aW5ncy53O3NldHRpbmdzLm1oPXNldHRpbmdzLmg7aWYoc2V0dGluZ3MubWF4V2lkdGgpe3NldHRpbmdzLm13PXNldFNpemUoc2V0dGluZ3MubWF4V2lkdGgsJ3gnKS1sb2FkZWRXaWR0aC1pbnRlcmZhY2VXaWR0aDtzZXR0aW5ncy5tdz1zZXR0aW5ncy53JiZzZXR0aW5ncy53PHNldHRpbmdzLm13P3NldHRpbmdzLnc6c2V0dGluZ3MubXd9CmlmKHNldHRpbmdzLm1heEhlaWdodCl7c2V0dGluZ3MubWg9c2V0U2l6ZShzZXR0aW5ncy5tYXhIZWlnaHQsJ3knKS1sb2FkZWRIZWlnaHQtaW50ZXJmYWNlSGVpZ2h0O3NldHRpbmdzLm1oPXNldHRpbmdzLmgmJnNldHRpbmdzLmg8c2V0dGluZ3MubWg/c2V0dGluZ3MuaDpzZXR0aW5ncy5taH0KaHJlZj1zZXR0aW5ncy5ocmVmO2xvYWRpbmdUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JGxvYWRpbmdPdmVybGF5LnNob3coKX0sMTAwKTtpZihzZXR0aW5ncy5pbmxpbmUpeyRpbmxpbmU9JHRhZyhkaXYpLmhpZGUoKS5pbnNlcnRCZWZvcmUoJChocmVmKVswXSk7JGV2ZW50cy5vbmUoZXZlbnRfcHVyZ2UsZnVuY3Rpb24oKXskaW5saW5lLnJlcGxhY2VXaXRoKCRsb2FkZWQuY2hpbGRyZW4oKSl9KTtwcmVwKCQoaHJlZikpfWVsc2UgaWYoc2V0dGluZ3MuaWZyYW1lKXtwcmVwKCIgIil9ZWxzZSBpZihzZXR0aW5ncy5odG1sKXtwcmVwKHNldHRpbmdzLmh0bWwpfWVsc2UgaWYoaXNJbWFnZShzZXR0aW5ncyxocmVmKSl7aHJlZj1yZXRpbmFVcmwoc2V0dGluZ3MsaHJlZik7cGhvdG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7JChwaG90bykuYWRkQ2xhc3MocHJlZml4KydQaG90bycpLmJpbmQoJ2Vycm9yJyxmdW5jdGlvbigpe3NldHRpbmdzLnRpdGxlPSExO3ByZXAoJHRhZyhkaXYsJ0Vycm9yJykuaHRtbChzZXR0aW5ncy5pbWdFcnJvcikpfSkub25lKCdsb2FkJyxmdW5jdGlvbigpe3ZhciBwZXJjZW50O2lmKHJlcXVlc3QhPT1yZXF1ZXN0cyl7cmV0dXJufQokLmVhY2goWydhbHQnLCdsb25nZGVzYycsJ2FyaWEtZGVzY3JpYmVkYnknXSxmdW5jdGlvbihpLHZhbCl7dmFyIGF0dHI9JChlbGVtZW50KS5hdHRyKHZhbCl8fCQoZWxlbWVudCkuYXR0cignZGF0YS0nK3ZhbCk7aWYoYXR0cil7cGhvdG8uc2V0QXR0cmlidXRlKHZhbCxhdHRyKX19KTtpZihzZXR0aW5ncy5yZXRpbmFJbWFnZSYmd2luZG93LmRldmljZVBpeGVsUmF0aW8+MSl7cGhvdG8uaGVpZ2h0PXBob3RvLmhlaWdodC93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztwaG90by53aWR0aD1waG90by53aWR0aC93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb30KaWYoc2V0dGluZ3Muc2NhbGVQaG90b3Mpe3NldFJlc2l6ZT1mdW5jdGlvbigpe3Bob3RvLmhlaWdodC09cGhvdG8uaGVpZ2h0KnBlcmNlbnQ7cGhvdG8ud2lkdGgtPXBob3RvLndpZHRoKnBlcmNlbnR9O2lmKHNldHRpbmdzLm13JiZwaG90by53aWR0aD5zZXR0aW5ncy5tdyl7cGVyY2VudD0ocGhvdG8ud2lkdGgtc2V0dGluZ3MubXcpL3Bob3RvLndpZHRoO3NldFJlc2l6ZSgpfQppZihzZXR0aW5ncy5taCYmcGhvdG8uaGVpZ2h0PnNldHRpbmdzLm1oKXtwZXJjZW50PShwaG90by5oZWlnaHQtc2V0dGluZ3MubWgpL3Bob3RvLmhlaWdodDtzZXRSZXNpemUoKX19CmlmKHNldHRpbmdzLmgpe3Bob3RvLnN0eWxlLm1hcmdpblRvcD1NYXRoLm1heChzZXR0aW5ncy5taC1waG90by5oZWlnaHQsMCkvMisncHgnfQppZigkcmVsYXRlZFsxXSYmKHNldHRpbmdzLmxvb3B8fCRyZWxhdGVkW2luZGV4KzFdKSl7cGhvdG8uc3R5bGUuY3Vyc29yPSdwb2ludGVyJztwaG90by5vbmNsaWNrPWZ1bmN0aW9uKCl7cHVibGljTWV0aG9kLm5leHQoKX19CnBob3RvLnN0eWxlLndpZHRoPXBob3RvLndpZHRoKydweCc7cGhvdG8uc3R5bGUuaGVpZ2h0PXBob3RvLmhlaWdodCsncHgnO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtwcmVwKHBob3RvKX0sMSl9KTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cGhvdG8uc3JjPWhyZWZ9LDEpfWVsc2UgaWYoaHJlZil7JGxvYWRpbmdCYXkubG9hZChocmVmLHNldHRpbmdzLmRhdGEsZnVuY3Rpb24oZGF0YSxzdGF0dXMpe2lmKHJlcXVlc3Q9PT1yZXF1ZXN0cyl7cHJlcChzdGF0dXM9PT0nZXJyb3InPyR0YWcoZGl2LCdFcnJvcicpLmh0bWwoc2V0dGluZ3MueGhyRXJyb3IpOiQodGhpcykuY29udGVudHMoKSl9fSl9fQpwdWJsaWNNZXRob2QubmV4dD1mdW5jdGlvbigpe2lmKCFhY3RpdmUmJiRyZWxhdGVkWzFdJiYoc2V0dGluZ3MubG9vcHx8JHJlbGF0ZWRbaW5kZXgrMV0pKXtpbmRleD1nZXRJbmRleCgxKTtsYXVuY2goJHJlbGF0ZWRbaW5kZXhdKX19O3B1YmxpY01ldGhvZC5wcmV2PWZ1bmN0aW9uKCl7aWYoIWFjdGl2ZSYmJHJlbGF0ZWRbMV0mJihzZXR0aW5ncy5sb29wfHxpbmRleCkpe2luZGV4PWdldEluZGV4KC0xKTtsYXVuY2goJHJlbGF0ZWRbaW5kZXhdKX19O3B1YmxpY01ldGhvZC5jbG9zZT1mdW5jdGlvbigpe2lmKG9wZW4mJiFjbG9zaW5nKXtjbG9zaW5nPSEwO29wZW49ITE7dHJpZ2dlcihldmVudF9jbGVhbnVwLHNldHRpbmdzLm9uQ2xlYW51cCk7JHdpbmRvdy51bmJpbmQoJy4nK3ByZWZpeCk7JG92ZXJsYXkuZmFkZVRvKHNldHRpbmdzLmZhZGVPdXR8fDAsMCk7JGJveC5zdG9wKCkuZmFkZVRvKHNldHRpbmdzLmZhZGVPdXR8fDAsMCxmdW5jdGlvbigpeyRib3guYWRkKCRvdmVybGF5KS5jc3MoeydvcGFjaXR5JzoxLGN1cnNvcjonYXV0byd9KS5oaWRlKCk7dHJpZ2dlcihldmVudF9wdXJnZSk7JGxvYWRlZC5lbXB0eSgpLnJlbW92ZSgpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjbG9zaW5nPSExO3RyaWdnZXIoZXZlbnRfY2xvc2VkLHNldHRpbmdzLm9uQ2xvc2VkKX0sMSl9KX19O3B1YmxpY01ldGhvZC5yZW1vdmU9ZnVuY3Rpb24oKXtpZighJGJveCl7cmV0dXJufQokYm94LnN0b3AoKTskLmNvbG9yYm94LmNsb3NlKCk7JGJveC5zdG9wKCkucmVtb3ZlKCk7JG92ZXJsYXkucmVtb3ZlKCk7Y2xvc2luZz0hMTskYm94PW51bGw7JCgnLicrYm94RWxlbWVudCkucmVtb3ZlRGF0YShjb2xvcmJveCkucmVtb3ZlQ2xhc3MoYm94RWxlbWVudCk7JChkb2N1bWVudCkudW5iaW5kKCdjbGljay4nK3ByZWZpeCl9O3B1YmxpY01ldGhvZC5lbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuICQoZWxlbWVudCl9O3B1YmxpY01ldGhvZC5zZXR0aW5ncz1kZWZhdWx0c30oalF1ZXJ5LGRvY3VtZW50LHdpbmRvdykpOyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBzZXR1cCgkKXskLmZuLl9mYWRlSW49JC5mbi5mYWRlSW47dmFyIG5vT3A9JC5ub29wfHxmdW5jdGlvbigpe307dmFyIG1zaWU9L01TSUUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7dmFyIGllNj0vTVNJRSA2LjAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiEvTVNJRSA4LjAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7dmFyIG1vZGU9ZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHwwO3ZhciBzZXRFeHByPSQuaXNGdW5jdGlvbihkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZS5zZXRFeHByZXNzaW9uKTskLmJsb2NrVUk9ZnVuY3Rpb24ob3B0cyl7aW5zdGFsbCh3aW5kb3csb3B0cyl9OyQudW5ibG9ja1VJPWZ1bmN0aW9uKG9wdHMpe3JlbW92ZSh3aW5kb3csb3B0cyl9OyQuZ3Jvd2xVST1mdW5jdGlvbih0aXRsZSxtZXNzYWdlLHRpbWVvdXQsb25DbG9zZSl7dmFyICRtPSQoJzxkaXYgY2xhc3M9Imdyb3dsVUkiPjwvZGl2PicpO2lmKHRpdGxlKSRtLmFwcGVuZCgnPGgxPicrdGl0bGUrJzwvaDE+Jyk7aWYobWVzc2FnZSkkbS5hcHBlbmQoJzxoMj4nK21lc3NhZ2UrJzwvaDI+Jyk7aWYodGltZW91dD09PXVuZGVmaW5lZCl0aW1lb3V0PTMwMDA7dmFyIGNhbGxCbG9jaz1mdW5jdGlvbihvcHRzKXtvcHRzPW9wdHN8fHt9OyQuYmxvY2tVSSh7bWVzc2FnZTokbSxmYWRlSW46dHlwZW9mIG9wdHMuZmFkZUluIT09J3VuZGVmaW5lZCc/b3B0cy5mYWRlSW46NzAwLGZhZGVPdXQ6dHlwZW9mIG9wdHMuZmFkZU91dCE9PSd1bmRlZmluZWQnP29wdHMuZmFkZU91dDoxMDAwLHRpbWVvdXQ6dHlwZW9mIG9wdHMudGltZW91dCE9PSd1bmRlZmluZWQnP29wdHMudGltZW91dDp0aW1lb3V0LGNlbnRlclk6ITEsc2hvd092ZXJsYXk6ITEsb25VbmJsb2NrOm9uQ2xvc2UsY3NzOiQuYmxvY2tVSS5kZWZhdWx0cy5ncm93bENTU30pfTtjYWxsQmxvY2soKTt2YXIgbm9ubW91c2VkT3BhY2l0eT0kbS5jc3MoJ29wYWNpdHknKTskbS5tb3VzZW92ZXIoZnVuY3Rpb24oKXtjYWxsQmxvY2soe2ZhZGVJbjowLHRpbWVvdXQ6MzAwMDB9KTt2YXIgZGlzcGxheUJsb2NrPSQoJy5ibG9ja01zZycpO2Rpc3BsYXlCbG9jay5zdG9wKCk7ZGlzcGxheUJsb2NrLmZhZGVUbygzMDAsMSl9KS5tb3VzZW91dChmdW5jdGlvbigpeyQoJy5ibG9ja01zZycpLmZhZGVPdXQoMTAwMCl9KX07JC5mbi5ibG9jaz1mdW5jdGlvbihvcHRzKXtpZih0aGlzWzBdPT09d2luZG93KXskLmJsb2NrVUkob3B0cyk7cmV0dXJuIHRoaXN9CnZhciBmdWxsT3B0cz0kLmV4dGVuZCh7fSwkLmJsb2NrVUkuZGVmYXVsdHMsb3B0c3x8e30pO3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciAkZWw9JCh0aGlzKTtpZihmdWxsT3B0cy5pZ25vcmVJZkJsb2NrZWQmJiRlbC5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcpKQpyZXR1cm47JGVsLnVuYmxvY2soe2ZhZGVPdXQ6MH0pfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKCQuY3NzKHRoaXMsJ3Bvc2l0aW9uJyk9PSdzdGF0aWMnKXt0aGlzLnN0eWxlLnBvc2l0aW9uPSdyZWxhdGl2ZSc7JCh0aGlzKS5kYXRhKCdibG9ja1VJLnN0YXRpYycsITApfQp0aGlzLnN0eWxlLnpvb209MTtpbnN0YWxsKHRoaXMsb3B0cyl9KX07JC5mbi51bmJsb2NrPWZ1bmN0aW9uKG9wdHMpe2lmKHRoaXNbMF09PT13aW5kb3cpeyQudW5ibG9ja1VJKG9wdHMpO3JldHVybiB0aGlzfQpyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7cmVtb3ZlKHRoaXMsb3B0cyl9KX07JC5ibG9ja1VJLnZlcnNpb249Mi43MDskLmJsb2NrVUkuZGVmYXVsdHM9e21lc3NhZ2U6JzxoMT5QbGVhc2Ugd2FpdC4uLjwvaDE+Jyx0aXRsZTpudWxsLGRyYWdnYWJsZTohMCx0aGVtZTohMSxjc3M6e3BhZGRpbmc6MCxtYXJnaW46MCx3aWR0aDonMzAlJyx0b3A6JzQwJScsbGVmdDonMzUlJyx0ZXh0QWxpZ246J2NlbnRlcicsY29sb3I6JyMwMDAnLGJvcmRlcjonM3B4IHNvbGlkICNhYWEnLGJhY2tncm91bmRDb2xvcjonI2ZmZicsY3Vyc29yOid3YWl0J30sdGhlbWVkQ1NTOnt3aWR0aDonMzAlJyx0b3A6JzQwJScsbGVmdDonMzUlJ30sb3ZlcmxheUNTUzp7YmFja2dyb3VuZENvbG9yOicjMDAwJyxvcGFjaXR5OjAuNixjdXJzb3I6J3dhaXQnfSxjdXJzb3JSZXNldDonZGVmYXVsdCcsZ3Jvd2xDU1M6e3dpZHRoOiczNTBweCcsdG9wOicxMHB4JyxsZWZ0OicnLHJpZ2h0OicxMHB4Jyxib3JkZXI6J25vbmUnLHBhZGRpbmc6JzVweCcsb3BhY2l0eTowLjYsY3Vyc29yOidkZWZhdWx0Jyxjb2xvcjonI2ZmZicsYmFja2dyb3VuZENvbG9yOicjMDAwJywnLXdlYmtpdC1ib3JkZXItcmFkaXVzJzonMTBweCcsJy1tb3otYm9yZGVyLXJhZGl1cyc6JzEwcHgnLCdib3JkZXItcmFkaXVzJzonMTBweCd9LGlmcmFtZVNyYzovXmh0dHBzL2kudGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZnx8JycpPydqYXZhc2NyaXB0OmZhbHNlJzonYWJvdXQ6YmxhbmsnLGZvcmNlSWZyYW1lOiExLGJhc2VaOjEwMDAsY2VudGVyWDohMCxjZW50ZXJZOiEwLGFsbG93Qm9keVN0cmV0Y2g6ITAsYmluZEV2ZW50czohMCxjb25zdHJhaW5UYWJLZXk6ITAsZmFkZUluOjIwMCxmYWRlT3V0OjQwMCx0aW1lb3V0OjAsc2hvd092ZXJsYXk6ITAsZm9jdXNJbnB1dDohMCxmb2N1c2FibGVFbGVtZW50czonOmlucHV0OmVuYWJsZWQ6dmlzaWJsZScsb25CbG9jazpudWxsLG9uVW5ibG9jazpudWxsLG9uT3ZlcmxheUNsaWNrOm51bGwscXVpcmtzbW9kZU9mZnNldEhhY2s6NCxibG9ja01zZ0NsYXNzOidibG9ja01zZycsaWdub3JlSWZCbG9ja2VkOiExfTt2YXIgcGFnZUJsb2NrPW51bGw7dmFyIHBhZ2VCbG9ja0Vscz1bXTtmdW5jdGlvbiBpbnN0YWxsKGVsLG9wdHMpe3ZhciBjc3MsdGhlbWVkQ1NTO3ZhciBmdWxsPShlbD09d2luZG93KTt2YXIgbXNnPShvcHRzJiZvcHRzLm1lc3NhZ2UhPT11bmRlZmluZWQ/b3B0cy5tZXNzYWdlOnVuZGVmaW5lZCk7b3B0cz0kLmV4dGVuZCh7fSwkLmJsb2NrVUkuZGVmYXVsdHMsb3B0c3x8e30pO2lmKG9wdHMuaWdub3JlSWZCbG9ja2VkJiYkKGVsKS5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcpKQpyZXR1cm47b3B0cy5vdmVybGF5Q1NTPSQuZXh0ZW5kKHt9LCQuYmxvY2tVSS5kZWZhdWx0cy5vdmVybGF5Q1NTLG9wdHMub3ZlcmxheUNTU3x8e30pO2Nzcz0kLmV4dGVuZCh7fSwkLmJsb2NrVUkuZGVmYXVsdHMuY3NzLG9wdHMuY3NzfHx7fSk7aWYob3B0cy5vbk92ZXJsYXlDbGljaykKb3B0cy5vdmVybGF5Q1NTLmN1cnNvcj0ncG9pbnRlcic7dGhlbWVkQ1NTPSQuZXh0ZW5kKHt9LCQuYmxvY2tVSS5kZWZhdWx0cy50aGVtZWRDU1Msb3B0cy50aGVtZWRDU1N8fHt9KTttc2c9bXNnPT09dW5kZWZpbmVkP29wdHMubWVzc2FnZTptc2c7aWYoZnVsbCYmcGFnZUJsb2NrKQpyZW1vdmUod2luZG93LHtmYWRlT3V0OjB9KTtpZihtc2cmJnR5cGVvZiBtc2chPSdzdHJpbmcnJiYobXNnLnBhcmVudE5vZGV8fG1zZy5qcXVlcnkpKXt2YXIgbm9kZT1tc2cuanF1ZXJ5P21zZ1swXTptc2c7dmFyIGRhdGE9e307JChlbCkuZGF0YSgnYmxvY2tVSS5oaXN0b3J5JyxkYXRhKTtkYXRhLmVsPW5vZGU7ZGF0YS5wYXJlbnQ9bm9kZS5wYXJlbnROb2RlO2RhdGEuZGlzcGxheT1ub2RlLnN0eWxlLmRpc3BsYXk7ZGF0YS5wb3NpdGlvbj1ub2RlLnN0eWxlLnBvc2l0aW9uO2lmKGRhdGEucGFyZW50KQpkYXRhLnBhcmVudC5yZW1vdmVDaGlsZChub2RlKX0KJChlbCkuZGF0YSgnYmxvY2tVSS5vblVuYmxvY2snLG9wdHMub25VbmJsb2NrKTt2YXIgej1vcHRzLmJhc2VaO3ZhciBseXIxLGx5cjIsbHlyMyxzO2lmKG1zaWV8fG9wdHMuZm9yY2VJZnJhbWUpCmx5cjE9JCgnPGlmcmFtZSBjbGFzcz0iYmxvY2tVSSIgc3R5bGU9InotaW5kZXg6JysoeisrKSsnO2Rpc3BsYXk6bm9uZTtib3JkZXI6bm9uZTttYXJnaW46MDtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0b3A6MDtsZWZ0OjAiIHNyYz0iJytvcHRzLmlmcmFtZVNyYysnIj48L2lmcmFtZT4nKTtlbHNlIGx5cjE9JCgnPGRpdiBjbGFzcz0iYmxvY2tVSSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9kaXY+Jyk7aWYob3B0cy50aGVtZSkKbHlyMj0kKCc8ZGl2IGNsYXNzPSJibG9ja1VJIGJsb2NrT3ZlcmxheSB1aS13aWRnZXQtb3ZlcmxheSIgc3R5bGU9InotaW5kZXg6JysoeisrKSsnO2Rpc3BsYXk6bm9uZSI+PC9kaXY+Jyk7ZWxzZSBseXIyPSQoJzxkaXYgY2xhc3M9ImJsb2NrVUkgYmxvY2tPdmVybGF5IiBzdHlsZT0iei1pbmRleDonKyh6KyspKyc7ZGlzcGxheTpub25lO2JvcmRlcjpub25lO21hcmdpbjowO3BhZGRpbmc6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RvcDowO2xlZnQ6MCI+PC9kaXY+Jyk7aWYob3B0cy50aGVtZSYmZnVsbCl7cz0nPGRpdiBjbGFzcz0iYmxvY2tVSSAnK29wdHMuYmxvY2tNc2dDbGFzcysnIGJsb2NrUGFnZSB1aS1kaWFsb2cgdWktd2lkZ2V0IHVpLWNvcm5lci1hbGwiIHN0eWxlPSJ6LWluZGV4OicrKHorMTApKyc7ZGlzcGxheTpub25lO3Bvc2l0aW9uOmZpeGVkIj4nO2lmKG9wdHMudGl0bGUpe3MrPSc8ZGl2IGNsYXNzPSJ1aS13aWRnZXQtaGVhZGVyIHVpLWRpYWxvZy10aXRsZWJhciB1aS1jb3JuZXItYWxsIGJsb2NrVGl0bGUiPicrKG9wdHMudGl0bGV8fCcmbmJzcDsnKSsnPC9kaXY+J30Kcys9JzxkaXYgY2xhc3M9InVpLXdpZGdldC1jb250ZW50IHVpLWRpYWxvZy1jb250ZW50Ij48L2Rpdj4nO3MrPSc8L2Rpdj4nfQplbHNlIGlmKG9wdHMudGhlbWUpe3M9JzxkaXYgY2xhc3M9ImJsb2NrVUkgJytvcHRzLmJsb2NrTXNnQ2xhc3MrJyBibG9ja0VsZW1lbnQgdWktZGlhbG9nIHVpLXdpZGdldCB1aS1jb3JuZXItYWxsIiBzdHlsZT0iei1pbmRleDonKyh6KzEwKSsnO2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZSI+JztpZihvcHRzLnRpdGxlKXtzKz0nPGRpdiBjbGFzcz0idWktd2lkZ2V0LWhlYWRlciB1aS1kaWFsb2ctdGl0bGViYXIgdWktY29ybmVyLWFsbCBibG9ja1RpdGxlIj4nKyhvcHRzLnRpdGxlfHwnJm5ic3A7JykrJzwvZGl2Pid9CnMrPSc8ZGl2IGNsYXNzPSJ1aS13aWRnZXQtY29udGVudCB1aS1kaWFsb2ctY29udGVudCI+PC9kaXY+JztzKz0nPC9kaXY+J30KZWxzZSBpZihmdWxsKXtzPSc8ZGl2IGNsYXNzPSJibG9ja1VJICcrb3B0cy5ibG9ja01zZ0NsYXNzKycgYmxvY2tQYWdlIiBzdHlsZT0iei1pbmRleDonKyh6KzEwKSsnO2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjpmaXhlZCI+PC9kaXY+J30KZWxzZXtzPSc8ZGl2IGNsYXNzPSJibG9ja1VJICcrb3B0cy5ibG9ja01zZ0NsYXNzKycgYmxvY2tFbGVtZW50IiBzdHlsZT0iei1pbmRleDonKyh6KzEwKSsnO2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZSI+PC9kaXY+J30KbHlyMz0kKHMpO2lmKG1zZyl7aWYob3B0cy50aGVtZSl7bHlyMy5jc3ModGhlbWVkQ1NTKTtseXIzLmFkZENsYXNzKCd1aS13aWRnZXQtY29udGVudCcpfQplbHNlIGx5cjMuY3NzKGNzcyl9CmlmKCFvcHRzLnRoZW1lKQpseXIyLmNzcyhvcHRzLm92ZXJsYXlDU1MpO2x5cjIuY3NzKCdwb3NpdGlvbicsZnVsbD8nZml4ZWQnOidhYnNvbHV0ZScpO2lmKG1zaWV8fG9wdHMuZm9yY2VJZnJhbWUpCmx5cjEuY3NzKCdvcGFjaXR5JywwLjApO3ZhciBsYXllcnM9W2x5cjEsbHlyMixseXIzXSwkcGFyPWZ1bGw/JCgnYm9keScpOiQoZWwpOyQuZWFjaChsYXllcnMsZnVuY3Rpb24oKXt0aGlzLmFwcGVuZFRvKCRwYXIpfSk7aWYob3B0cy50aGVtZSYmb3B0cy5kcmFnZ2FibGUmJiQuZm4uZHJhZ2dhYmxlKXtseXIzLmRyYWdnYWJsZSh7aGFuZGxlOicudWktZGlhbG9nLXRpdGxlYmFyJyxjYW5jZWw6J2xpJ30pfQp2YXIgZXhwcj1zZXRFeHByJiYoISQuc3VwcG9ydC5ib3hNb2RlbHx8JCgnb2JqZWN0LGVtYmVkJyxmdWxsP251bGw6ZWwpLmxlbmd0aD4wKTtpZihpZTZ8fGV4cHIpe2lmKGZ1bGwmJm9wdHMuYWxsb3dCb2R5U3RyZXRjaCYmJC5zdXBwb3J0LmJveE1vZGVsKQokKCdodG1sLGJvZHknKS5jc3MoJ2hlaWdodCcsJzEwMCUnKTtpZigoaWU2fHwhJC5zdXBwb3J0LmJveE1vZGVsKSYmIWZ1bGwpe3ZhciB0PXN6KGVsLCdib3JkZXJUb3BXaWR0aCcpLGw9c3ooZWwsJ2JvcmRlckxlZnRXaWR0aCcpO3ZhciBmaXhUPXQ/JygwIC0gJyt0KycpJzowO3ZhciBmaXhMPWw/JygwIC0gJytsKycpJzowfQokLmVhY2gobGF5ZXJzLGZ1bmN0aW9uKGksbyl7dmFyIHM9b1swXS5zdHlsZTtzLnBvc2l0aW9uPSdhYnNvbHV0ZSc7aWYoaTwyKXtpZihmdWxsKQpzLnNldEV4cHJlc3Npb24oJ2hlaWdodCcsJ01hdGgubWF4KGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0LCBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCkgLSAoalF1ZXJ5LnN1cHBvcnQuYm94TW9kZWw/MDonK29wdHMucXVpcmtzbW9kZU9mZnNldEhhY2srJykgKyAicHgiJyk7ZWxzZSBzLnNldEV4cHJlc3Npb24oJ2hlaWdodCcsJ3RoaXMucGFyZW50Tm9kZS5vZmZzZXRIZWlnaHQgKyAicHgiJyk7aWYoZnVsbCkKcy5zZXRFeHByZXNzaW9uKCd3aWR0aCcsJ2pRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoICsgInB4IicpO2Vsc2Ugcy5zZXRFeHByZXNzaW9uKCd3aWR0aCcsJ3RoaXMucGFyZW50Tm9kZS5vZmZzZXRXaWR0aCArICJweCInKTtpZihmaXhMKXMuc2V0RXhwcmVzc2lvbignbGVmdCcsZml4TCk7aWYoZml4VClzLnNldEV4cHJlc3Npb24oJ3RvcCcsZml4VCl9CmVsc2UgaWYob3B0cy5jZW50ZXJZKXtpZihmdWxsKXMuc2V0RXhwcmVzc2lvbigndG9wJywnKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgfHwgZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQpIC8gMiAtICh0aGlzLm9mZnNldEhlaWdodCAvIDIpICsgKGJsYWggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA6IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSArICJweCInKTtzLm1hcmdpblRvcD0wfQplbHNlIGlmKCFvcHRzLmNlbnRlclkmJmZ1bGwpe3ZhciB0b3A9KG9wdHMuY3NzJiZvcHRzLmNzcy50b3ApP3BhcnNlSW50KG9wdHMuY3NzLnRvcCwxMCk6MDt2YXIgZXhwcmVzc2lvbj0nKChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA6IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSArICcrdG9wKycpICsgInB4Iic7cy5zZXRFeHByZXNzaW9uKCd0b3AnLGV4cHJlc3Npb24pfX0pfQppZihtc2cpe2lmKG9wdHMudGhlbWUpCmx5cjMuZmluZCgnLnVpLXdpZGdldC1jb250ZW50JykuYXBwZW5kKG1zZyk7ZWxzZSBseXIzLmFwcGVuZChtc2cpO2lmKG1zZy5qcXVlcnl8fG1zZy5ub2RlVHlwZSkKJChtc2cpLnNob3coKX0KaWYoKG1zaWV8fG9wdHMuZm9yY2VJZnJhbWUpJiZvcHRzLnNob3dPdmVybGF5KQpseXIxLnNob3coKTtpZihvcHRzLmZhZGVJbil7dmFyIGNiPW9wdHMub25CbG9jaz9vcHRzLm9uQmxvY2s6bm9PcDt2YXIgY2IxPShvcHRzLnNob3dPdmVybGF5JiYhbXNnKT9jYjpub09wO3ZhciBjYjI9bXNnP2NiOm5vT3A7aWYob3B0cy5zaG93T3ZlcmxheSkKbHlyMi5fZmFkZUluKG9wdHMuZmFkZUluLGNiMSk7aWYobXNnKQpseXIzLl9mYWRlSW4ob3B0cy5mYWRlSW4sY2IyKX0KZWxzZXtpZihvcHRzLnNob3dPdmVybGF5KQpseXIyLnNob3coKTtpZihtc2cpCmx5cjMuc2hvdygpO2lmKG9wdHMub25CbG9jaykKb3B0cy5vbkJsb2NrLmJpbmQobHlyMykoKX0KYmluZCgxLGVsLG9wdHMpO2lmKGZ1bGwpe3BhZ2VCbG9jaz1seXIzWzBdO3BhZ2VCbG9ja0Vscz0kKG9wdHMuZm9jdXNhYmxlRWxlbWVudHMscGFnZUJsb2NrKTtpZihvcHRzLmZvY3VzSW5wdXQpCnNldFRpbWVvdXQoZm9jdXMsMjApfQplbHNlIGNlbnRlcihseXIzWzBdLG9wdHMuY2VudGVyWCxvcHRzLmNlbnRlclkpO2lmKG9wdHMudGltZW91dCl7dmFyIHRvPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihmdWxsKQokLnVuYmxvY2tVSShvcHRzKTtlbHNlICQoZWwpLnVuYmxvY2sob3B0cyl9LG9wdHMudGltZW91dCk7JChlbCkuZGF0YSgnYmxvY2tVSS50aW1lb3V0Jyx0byl9fQpmdW5jdGlvbiByZW1vdmUoZWwsb3B0cyl7dmFyIGNvdW50O3ZhciBmdWxsPShlbD09d2luZG93KTt2YXIgJGVsPSQoZWwpO3ZhciBkYXRhPSRlbC5kYXRhKCdibG9ja1VJLmhpc3RvcnknKTt2YXIgdG89JGVsLmRhdGEoJ2Jsb2NrVUkudGltZW91dCcpO2lmKHRvKXtjbGVhclRpbWVvdXQodG8pOyRlbC5yZW1vdmVEYXRhKCdibG9ja1VJLnRpbWVvdXQnKX0Kb3B0cz0kLmV4dGVuZCh7fSwkLmJsb2NrVUkuZGVmYXVsdHMsb3B0c3x8e30pO2JpbmQoMCxlbCxvcHRzKTtpZihvcHRzLm9uVW5ibG9jaz09PW51bGwpe29wdHMub25VbmJsb2NrPSRlbC5kYXRhKCdibG9ja1VJLm9uVW5ibG9jaycpOyRlbC5yZW1vdmVEYXRhKCdibG9ja1VJLm9uVW5ibG9jaycpfQp2YXIgZWxzO2lmKGZ1bGwpCmVscz0kKCdib2R5JykuY2hpbGRyZW4oKS5maWx0ZXIoJy5ibG9ja1VJJykuYWRkKCdib2R5ID4gLmJsb2NrVUknKTtlbHNlIGVscz0kZWwuZmluZCgnPi5ibG9ja1VJJyk7aWYob3B0cy5jdXJzb3JSZXNldCl7aWYoZWxzLmxlbmd0aD4xKQplbHNbMV0uc3R5bGUuY3Vyc29yPW9wdHMuY3Vyc29yUmVzZXQ7aWYoZWxzLmxlbmd0aD4yKQplbHNbMl0uc3R5bGUuY3Vyc29yPW9wdHMuY3Vyc29yUmVzZXR9CmlmKGZ1bGwpCnBhZ2VCbG9jaz1wYWdlQmxvY2tFbHM9bnVsbDtpZihvcHRzLmZhZGVPdXQpe2NvdW50PWVscy5sZW5ndGg7ZWxzLnN0b3AoKS5mYWRlT3V0KG9wdHMuZmFkZU91dCxmdW5jdGlvbigpe2lmKC0tY291bnQ9PT0wKQpyZXNldChlbHMsZGF0YSxvcHRzLGVsKX0pfQplbHNlIHJlc2V0KGVscyxkYXRhLG9wdHMsZWwpfQpmdW5jdGlvbiByZXNldChlbHMsZGF0YSxvcHRzLGVsKXt2YXIgJGVsPSQoZWwpO2lmKCRlbC5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcpKQpyZXR1cm47ZWxzLmVhY2goZnVuY3Rpb24oaSxvKXtpZih0aGlzLnBhcmVudE5vZGUpCnRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX0pO2lmKGRhdGEmJmRhdGEuZWwpe2RhdGEuZWwuc3R5bGUuZGlzcGxheT1kYXRhLmRpc3BsYXk7ZGF0YS5lbC5zdHlsZS5wb3NpdGlvbj1kYXRhLnBvc2l0aW9uO2RhdGEuZWwuc3R5bGUuY3Vyc29yPSdkZWZhdWx0JztpZihkYXRhLnBhcmVudCkKZGF0YS5wYXJlbnQuYXBwZW5kQ2hpbGQoZGF0YS5lbCk7JGVsLnJlbW92ZURhdGEoJ2Jsb2NrVUkuaGlzdG9yeScpfQppZigkZWwuZGF0YSgnYmxvY2tVSS5zdGF0aWMnKSl7JGVsLmNzcygncG9zaXRpb24nLCdzdGF0aWMnKX0KaWYodHlwZW9mIG9wdHMub25VbmJsb2NrPT0nZnVuY3Rpb24nKQpvcHRzLm9uVW5ibG9jayhlbCxvcHRzKTt2YXIgYm9keT0kKGRvY3VtZW50LmJvZHkpLHc9Ym9keS53aWR0aCgpLGNzc1c9Ym9keVswXS5zdHlsZS53aWR0aDtib2R5LndpZHRoKHctMSkud2lkdGgodyk7Ym9keVswXS5zdHlsZS53aWR0aD1jc3NXfQpmdW5jdGlvbiBiaW5kKGIsZWwsb3B0cyl7dmFyIGZ1bGw9ZWw9PXdpbmRvdywkZWw9JChlbCk7aWYoIWImJihmdWxsJiYhcGFnZUJsb2NrfHwhZnVsbCYmISRlbC5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcpKSkKcmV0dXJuOyRlbC5kYXRhKCdibG9ja1VJLmlzQmxvY2tlZCcsYik7aWYoIWZ1bGx8fCFvcHRzLmJpbmRFdmVudHN8fChiJiYhb3B0cy5zaG93T3ZlcmxheSkpCnJldHVybjt2YXIgZXZlbnRzPSdtb3VzZWRvd24gbW91c2V1cCBrZXlkb3duIGtleXByZXNzIGtleXVwIHRvdWNoc3RhcnQgdG91Y2hlbmQgdG91Y2htb3ZlJztpZihiKQokKGRvY3VtZW50KS5iaW5kKGV2ZW50cyxvcHRzLGhhbmRsZXIpO2Vsc2UgJChkb2N1bWVudCkudW5iaW5kKGV2ZW50cyxoYW5kbGVyKX0KZnVuY3Rpb24gaGFuZGxlcihlKXtpZihlLnR5cGU9PT0na2V5ZG93bicmJmUua2V5Q29kZSYmZS5rZXlDb2RlPT05KXtpZihwYWdlQmxvY2smJmUuZGF0YS5jb25zdHJhaW5UYWJLZXkpe3ZhciBlbHM9cGFnZUJsb2NrRWxzO3ZhciBmd2Q9IWUuc2hpZnRLZXkmJmUudGFyZ2V0PT09ZWxzW2Vscy5sZW5ndGgtMV07dmFyIGJhY2s9ZS5zaGlmdEtleSYmZS50YXJnZXQ9PT1lbHNbMF07aWYoZndkfHxiYWNrKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zm9jdXMoYmFjayl9LDEwKTtyZXR1cm4hMX19fQp2YXIgb3B0cz1lLmRhdGE7dmFyIHRhcmdldD0kKGUudGFyZ2V0KTtpZih0YXJnZXQuaGFzQ2xhc3MoJ2Jsb2NrT3ZlcmxheScpJiZvcHRzLm9uT3ZlcmxheUNsaWNrKQpvcHRzLm9uT3ZlcmxheUNsaWNrKGUpO2lmKHRhcmdldC5wYXJlbnRzKCdkaXYuJytvcHRzLmJsb2NrTXNnQ2xhc3MpLmxlbmd0aD4wKQpyZXR1cm4hMDtyZXR1cm4gdGFyZ2V0LnBhcmVudHMoKS5jaGlsZHJlbigpLmZpbHRlcignZGl2LmJsb2NrVUknKS5sZW5ndGg9PT0wfQpmdW5jdGlvbiBmb2N1cyhiYWNrKXtpZighcGFnZUJsb2NrRWxzKQpyZXR1cm47dmFyIGU9cGFnZUJsb2NrRWxzW2JhY2s9PT0hMD9wYWdlQmxvY2tFbHMubGVuZ3RoLTE6MF07aWYoZSkKZS5mb2N1cygpfQpmdW5jdGlvbiBjZW50ZXIoZWwseCx5KXt2YXIgcD1lbC5wYXJlbnROb2RlLHM9ZWwuc3R5bGU7dmFyIGw9KChwLm9mZnNldFdpZHRoLWVsLm9mZnNldFdpZHRoKS8yKS1zeihwLCdib3JkZXJMZWZ0V2lkdGgnKTt2YXIgdD0oKHAub2Zmc2V0SGVpZ2h0LWVsLm9mZnNldEhlaWdodCkvMiktc3oocCwnYm9yZGVyVG9wV2lkdGgnKTtpZih4KXMubGVmdD1sPjA/KGwrJ3B4Jyk6JzAnO2lmKHkpcy50b3A9dD4wPyh0KydweCcpOicwJ30KZnVuY3Rpb24gc3ooZWwscCl7cmV0dXJuIHBhcnNlSW50KCQuY3NzKGVsLHApLDEwKXx8MH19CmlmKHR5cGVvZiBkZWZpbmU9PT0nZnVuY3Rpb24nJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSl7ZGVmaW5lKFsnanF1ZXJ5J10sc2V0dXApfWVsc2V7c2V0dXAoalF1ZXJ5KX19KSgpOyhmdW5jdGlvbigkKXskLmFsZXJ0cz17dmVydGljYWxPZmZzZXQ6LTc1LGhvcml6b250YWxPZmZzZXQ6MCxyZXBvc2l0aW9uT25SZXNpemU6ITAsb3ZlcmxheU9wYWNpdHk6LjAxLG92ZXJsYXlDb2xvcjonI0ZGRicsZHJhZ2dhYmxlOiEwLG9rQnV0dG9uOicmbmJzcDtPSyZuYnNwOycsY2FuY2VsQnV0dG9uOicmbmJzcDtDYW5jZWwmbmJzcDsnLGRpYWxvZ0NsYXNzOm51bGwsYWxlcnQ6ZnVuY3Rpb24obWVzc2FnZSx0aXRsZSxjYWxsYmFjayl7aWYodGl0bGU9PW51bGwpdGl0bGU9J0FsZXJ0JzskLmFsZXJ0cy5fc2hvdyh0aXRsZSxtZXNzYWdlLG51bGwsJ2FsZXJ0JyxmdW5jdGlvbihyZXN1bHQpe2lmKGNhbGxiYWNrKWNhbGxiYWNrKHJlc3VsdCl9KX0sY29uZmlybTpmdW5jdGlvbihtZXNzYWdlLHRpdGxlLGNhbGxiYWNrKXtpZih0aXRsZT09bnVsbCl0aXRsZT0nQ29uZmlybSc7JC5hbGVydHMuX3Nob3codGl0bGUsbWVzc2FnZSxudWxsLCdjb25maXJtJyxmdW5jdGlvbihyZXN1bHQpe2lmKGNhbGxiYWNrKWNhbGxiYWNrKHJlc3VsdCl9KX0scHJvbXB0OmZ1bmN0aW9uKG1lc3NhZ2UsdmFsdWUsdGl0bGUsY2FsbGJhY2spe2lmKHRpdGxlPT1udWxsKXRpdGxlPSdQcm9tcHQnOyQuYWxlcnRzLl9zaG93KHRpdGxlLG1lc3NhZ2UsdmFsdWUsJ3Byb21wdCcsZnVuY3Rpb24ocmVzdWx0KXtpZihjYWxsYmFjayljYWxsYmFjayhyZXN1bHQpfSl9LF9zaG93OmZ1bmN0aW9uKHRpdGxlLG1zZyx2YWx1ZSx0eXBlLGNhbGxiYWNrKXskLmFsZXJ0cy5faGlkZSgpOyQuYWxlcnRzLl9vdmVybGF5KCdzaG93Jyk7JCgiQk9EWSIpLmFwcGVuZCgnPGRpdiBpZD0icG9wdXBfY29udGFpbmVyIj4nKyc8aDEgaWQ9InBvcHVwX3RpdGxlIj48L2gxPicrJzxkaXYgaWQ9InBvcHVwX2NvbnRlbnQiPicrJzxkaXYgaWQ9InBvcHVwX21lc3NhZ2UiPjwvZGl2PicrJzwvZGl2PicrJzwvZGl2PicpO2lmKCQuYWxlcnRzLmRpYWxvZ0NsYXNzKSQoIiNwb3B1cF9jb250YWluZXIiKS5hZGRDbGFzcygkLmFsZXJ0cy5kaWFsb2dDbGFzcyk7dmFyIHBvcz0oJC5icm93c2VyLm1zaWUmJnBhcnNlSW50KCQuYnJvd3Nlci52ZXJzaW9uKTw9Nik/J2Fic29sdXRlJzonZml4ZWQnOyQoIiNwb3B1cF9jb250YWluZXIiKS5jc3Moe3Bvc2l0aW9uOnBvcyx6SW5kZXg6OTk5OTkscGFkZGluZzowLG1hcmdpbjowfSk7JCgiI3BvcHVwX3RpdGxlIikudGV4dCh0aXRsZSk7JCgiI3BvcHVwX2NvbnRlbnQiKS5hZGRDbGFzcyh0eXBlKTskKCIjcG9wdXBfbWVzc2FnZSIpLnRleHQobXNnKTskKCIjcG9wdXBfbWVzc2FnZSIpLmh0bWwoJCgiI3BvcHVwX21lc3NhZ2UiKS50ZXh0KCkucmVwbGFjZSgvXG4vZywnPGJyIC8+JykpOyQoIiNwb3B1cF9jb250YWluZXIiKS5jc3Moe21pbldpZHRoOiQoIiNwb3B1cF9jb250YWluZXIiKS5vdXRlcldpZHRoKCksbWF4V2lkdGg6JCgiI3BvcHVwX2NvbnRhaW5lciIpLm91dGVyV2lkdGgoKX0pOyQuYWxlcnRzLl9yZXBvc2l0aW9uKCk7JC5hbGVydHMuX21haW50YWluUG9zaXRpb24oITApO3N3aXRjaCh0eXBlKXtjYXNlICdhbGVydCc6JCgiI3BvcHVwX21lc3NhZ2UiKS5hZnRlcignPGRpdiBpZD0icG9wdXBfcGFuZWwiPjxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSInKyQuYWxlcnRzLm9rQnV0dG9uKyciIGlkPSJwb3B1cF9vayIgLz48L2Rpdj4nKTskKCIjcG9wdXBfb2siKS5jbGljayhmdW5jdGlvbigpeyQuYWxlcnRzLl9oaWRlKCk7Y2FsbGJhY2soITApfSk7JCgiI3BvcHVwX29rIikuZm9jdXMoKS5rZXlwcmVzcyhmdW5jdGlvbihlKXtpZihlLmtleUNvZGU9PTEzfHxlLmtleUNvZGU9PTI3KSQoIiNwb3B1cF9vayIpLnRyaWdnZXIoJ2NsaWNrJyl9KTticmVhaztjYXNlICdjb25maXJtJzokKCIjcG9wdXBfbWVzc2FnZSIpLmFmdGVyKCc8ZGl2IGlkPSJwb3B1cF9wYW5lbCI+PGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IicrJC5hbGVydHMub2tCdXR0b24rJyIgaWQ9InBvcHVwX29rIiAvPiA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iJyskLmFsZXJ0cy5jYW5jZWxCdXR0b24rJyIgaWQ9InBvcHVwX2NhbmNlbCIgLz48L2Rpdj4nKTskKCIjcG9wdXBfb2siKS5jbGljayhmdW5jdGlvbigpeyQuYWxlcnRzLl9oaWRlKCk7aWYoY2FsbGJhY2spY2FsbGJhY2soITApfSk7JCgiI3BvcHVwX2NhbmNlbCIpLmNsaWNrKGZ1bmN0aW9uKCl7JC5hbGVydHMuX2hpZGUoKTtpZihjYWxsYmFjayljYWxsYmFjayghMSl9KTskKCIjcG9wdXBfb2siKS5mb2N1cygpOyQoIiNwb3B1cF9vaywgI3BvcHVwX2NhbmNlbCIpLmtleXByZXNzKGZ1bmN0aW9uKGUpe2lmKGUua2V5Q29kZT09MTMpJCgiI3BvcHVwX29rIikudHJpZ2dlcignY2xpY2snKTtpZihlLmtleUNvZGU9PTI3KSQoIiNwb3B1cF9jYW5jZWwiKS50cmlnZ2VyKCdjbGljaycpfSk7YnJlYWs7Y2FzZSAncHJvbXB0JzokKCIjcG9wdXBfbWVzc2FnZSIpLmFwcGVuZCgnPGJyIC8+PGlucHV0IHR5cGU9InRleHQiIHNpemU9IjMwIiBpZD0icG9wdXBfcHJvbXB0IiAvPicpLmFmdGVyKCc8ZGl2IGlkPSJwb3B1cF9wYW5lbCI+PGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IicrJC5hbGVydHMub2tCdXR0b24rJyIgaWQ9InBvcHVwX29rIiAvPiA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iJyskLmFsZXJ0cy5jYW5jZWxCdXR0b24rJyIgaWQ9InBvcHVwX2NhbmNlbCIgLz48L2Rpdj4nKTskKCIjcG9wdXBfcHJvbXB0Iikud2lkdGgoJCgiI3BvcHVwX21lc3NhZ2UiKS53aWR0aCgpKTskKCIjcG9wdXBfb2siKS5jbGljayhmdW5jdGlvbigpe3ZhciB2YWw9JCgiI3BvcHVwX3Byb21wdCIpLnZhbCgpOyQuYWxlcnRzLl9oaWRlKCk7aWYoY2FsbGJhY2spY2FsbGJhY2sodmFsKX0pOyQoIiNwb3B1cF9jYW5jZWwiKS5jbGljayhmdW5jdGlvbigpeyQuYWxlcnRzLl9oaWRlKCk7aWYoY2FsbGJhY2spY2FsbGJhY2sobnVsbCl9KTskKCIjcG9wdXBfcHJvbXB0LCAjcG9wdXBfb2ssICNwb3B1cF9jYW5jZWwiKS5rZXlwcmVzcyhmdW5jdGlvbihlKXtpZihlLmtleUNvZGU9PTEzKSQoIiNwb3B1cF9vayIpLnRyaWdnZXIoJ2NsaWNrJyk7aWYoZS5rZXlDb2RlPT0yNykkKCIjcG9wdXBfY2FuY2VsIikudHJpZ2dlcignY2xpY2snKX0pO2lmKHZhbHVlKSQoIiNwb3B1cF9wcm9tcHQiKS52YWwodmFsdWUpOyQoIiNwb3B1cF9wcm9tcHQiKS5mb2N1cygpLnNlbGVjdCgpO2JyZWFrfQppZigkLmFsZXJ0cy5kcmFnZ2FibGUpe3RyeXskKCIjcG9wdXBfY29udGFpbmVyIikuZHJhZ2dhYmxlKHtoYW5kbGU6JCgiI3BvcHVwX3RpdGxlIil9KTskKCIjcG9wdXBfdGl0bGUiKS5jc3Moe2N1cnNvcjonbW92ZSd9KX1jYXRjaChlKXt9fX0sX2hpZGU6ZnVuY3Rpb24oKXskKCIjcG9wdXBfY29udGFpbmVyIikucmVtb3ZlKCk7JC5hbGVydHMuX292ZXJsYXkoJ2hpZGUnKTskLmFsZXJ0cy5fbWFpbnRhaW5Qb3NpdGlvbighMSl9LF9vdmVybGF5OmZ1bmN0aW9uKHN0YXR1cyl7c3dpdGNoKHN0YXR1cyl7Y2FzZSAnc2hvdyc6JC5hbGVydHMuX292ZXJsYXkoJ2hpZGUnKTskKCJCT0RZIikuYXBwZW5kKCc8ZGl2IGlkPSJwb3B1cF9vdmVybGF5Ij48L2Rpdj4nKTskKCIjcG9wdXBfb3ZlcmxheSIpLmNzcyh7cG9zaXRpb246J2Fic29sdXRlJyx6SW5kZXg6OTk5OTgsdG9wOicwcHgnLGxlZnQ6JzBweCcsd2lkdGg6JzEwMCUnLGhlaWdodDokKGRvY3VtZW50KS5oZWlnaHQoKSxiYWNrZ3JvdW5kOiQuYWxlcnRzLm92ZXJsYXlDb2xvcixvcGFjaXR5OiQuYWxlcnRzLm92ZXJsYXlPcGFjaXR5fSk7YnJlYWs7Y2FzZSAnaGlkZSc6JCgiI3BvcHVwX292ZXJsYXkiKS5yZW1vdmUoKTticmVha319LF9yZXBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIHRvcD0oKCQod2luZG93KS5oZWlnaHQoKS8yKS0oJCgiI3BvcHVwX2NvbnRhaW5lciIpLm91dGVySGVpZ2h0KCkvMikpKyQuYWxlcnRzLnZlcnRpY2FsT2Zmc2V0O3ZhciBsZWZ0PSgoJCh3aW5kb3cpLndpZHRoKCkvMiktKCQoIiNwb3B1cF9jb250YWluZXIiKS5vdXRlcldpZHRoKCkvMikpKyQuYWxlcnRzLmhvcml6b250YWxPZmZzZXQ7aWYodG9wPDApdG9wPTA7aWYobGVmdDwwKWxlZnQ9MDtpZigkLmJyb3dzZXIubXNpZSYmcGFyc2VJbnQoJC5icm93c2VyLnZlcnNpb24pPD02KXRvcD10b3ArJCh3aW5kb3cpLnNjcm9sbFRvcCgpOyQoIiNwb3B1cF9jb250YWluZXIiKS5jc3Moe3RvcDp0b3ArJ3B4JyxsZWZ0OmxlZnQrJ3B4J30pOyQoIiNwb3B1cF9vdmVybGF5IikuaGVpZ2h0KCQoZG9jdW1lbnQpLmhlaWdodCgpKX0sX21haW50YWluUG9zaXRpb246ZnVuY3Rpb24oc3RhdHVzKXtpZigkLmFsZXJ0cy5yZXBvc2l0aW9uT25SZXNpemUpe3N3aXRjaChzdGF0dXMpe2Nhc2UgdHJ1ZTokKHdpbmRvdykuYmluZCgncmVzaXplJywkLmFsZXJ0cy5fcmVwb3NpdGlvbik7YnJlYWs7Y2FzZSBmYWxzZTokKHdpbmRvdykudW5iaW5kKCdyZXNpemUnLCQuYWxlcnRzLl9yZXBvc2l0aW9uKTticmVha319fX0KakFsZXJ0PWZ1bmN0aW9uKG1lc3NhZ2UsdGl0bGUsY2FsbGJhY2speyQuYWxlcnRzLmFsZXJ0KG1lc3NhZ2UsdGl0bGUsY2FsbGJhY2spfQpqQ29uZmlybT1mdW5jdGlvbihtZXNzYWdlLHRpdGxlLGNhbGxiYWNrKXskLmFsZXJ0cy5jb25maXJtKG1lc3NhZ2UsdGl0bGUsY2FsbGJhY2spfTtqUHJvbXB0PWZ1bmN0aW9uKG1lc3NhZ2UsdmFsdWUsdGl0bGUsY2FsbGJhY2speyQuYWxlcnRzLnByb21wdChtZXNzYWdlLHZhbHVlLHRpdGxlLGNhbGxiYWNrKX19KShqUXVlcnkpO3ZhciB0aGlzQ2FydElzUmVzcG9uc2l2ZT0hMTt2YXIgbWluV2lkdGg9MTMxMDt2YXIgcmZxQ2FydD0hMTtmdW5jdGlvbiBjaGVja0FuZFVwZGF0ZVN0YXRlRm9ybUZpZWxkKHRyaWdnZXIpe3ZhciBhamF4QWRkcmVzcz0iaW5jbHVkZXMvYWpheC9hamF4LmFkZHJlc3MucGhwIjt2YXIgY291bnRyeUlEPSQodHJpZ2dlcikudmFsKCk7JC5wb3N0KGFqYXhBZGRyZXNzLHtjb3VudHJ5SUQ6Y291bnRyeUlEfSxmdW5jdGlvbihkYXRhKXskKCcuc3RhdGVDb250YWluZXIgLmNvbC1zbS05JykuaHRtbChkYXRhKX0pfQokKGZ1bmN0aW9uKCl7c2V0dXBMYWJlbENsaWNrKCk7c2V0SGVhZGVyKCk7JCh3aW5kb3cpLnNjcm9sbChmdW5jdGlvbigpe3NldEhlYWRlcigpfSk7c2V0Q3VycmVudFllYXJJbkZvb3RlcigpO2hhbmRsZUNhdGVnb3J5TGlzdGluZ0l0ZW1Ib3ZlcigpO3JlbW92ZVBhZ2VTZWN0aW9uQnJlYWtzKCk7c2V0VXBIb3Zlck9uSGVhZGVySWNvbnMoKTtpZih0aGlzQ2FydElzUmVzcG9uc2l2ZT09PSEwKXtzZXROYXZpZ2F0aW9uKCk7JCh3aW5kb3cpLm9uKCdyZXNpemUnLGZ1bmN0aW9uKCl7c2V0TmF2aWdhdGlvbigpfSl9CnJlc3BvbnNpZnlUYWJsZXMoKTtyZXNwb25zaWZ5SWZyYW1lcygpOyQoIiNtYWduaWZ5IikuZXZlblpvb20oKTskKCcuZGF0ZXBpY2tlcicpLmRhdGVwaWNrZXIoKTskKCJhW2hyZWY9JyN0b3AnXSIpLmNsaWNrKGZ1bmN0aW9uKCl7JCgiaHRtbCwgYm9keSIpLmFuaW1hdGUoe3Njcm9sbFRvcDowfSwic2xvdyIpO3JldHVybiExfSk7c2V0VG90YWwoKTtpZihjYWxjUHJpY2UpeyQoIiNwUXR5Iikua2V5dXAoZnVuY3Rpb24oKXtzZXRUb3RhbCgpfSl9CiQoJyNjYXJ0X3F1YW50aXR5Jykub24oImtleXVwIGtleXByZXNzIixmdW5jdGlvbihlKXt2YXIgY29kZT1lLmtleUNvZGV8fGUud2hpY2g7aWYoY29kZT09MTMpe2UucHJldmVudERlZmF1bHQoKTtyZXR1cm4hMX19KTskKCIjY3JlYXRlX2FjY291bnQiKS5jaGFuZ2UoZnVuY3Rpb24oKXt0b2dnbGVQYXNzd29yZHMoKX0pOyQoIi5hZGRyZXNzLWZpZWxkIikub24oe2tleWRvd246ZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50LndoaWNoPT0xMyl7ZXZlbnQucHJldmVudERlZmF1bHQoKX19fSk7JCgiLmFkZHJlc3MtZmllbGQiKS5vbih7a2V5ZG93bjpmdW5jdGlvbihldmVudCl7aWYoZXZlbnQud2hpY2g9PTEzKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpfX19KTtvcmlnQ291bnRyeT0kKCIjY291bnRyeSIpLnZhbCgpO3RvZ2dsZV9vdGhlclN0YXRlKGFkZHIuc3RhdGVfb3RoZXIpO2luaXRfdmFsaWRhdGlvbigpO3RvZ2dsZVBhc3N3b3JkcygpOyQoIiNqcV9kaWFsb2ciKS5kaWFsb2coe2F1dG9PcGVuOiExLGNsb3NlOmZ1bmN0aW9uKGV2ZW50LHVpKXskKCIjanFfZGlhbG9nIikuaHRtbCgnJyl9fSk7JCgiYS5idXR0b24tY2hlY2tvdXQiKS5jbGljayhmdW5jdGlvbihldmVudCl7aWYobWluT3JkZXJfYW10PjAmJm1pbk9yZGVyX2FtdD5jYXJ0VG90YWxfYW10KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpOyQoIiNqcV9kaWFsb2ciKS5odG1sKG9yZGVyVW5kZXJUZXh0KS5kaWFsb2coIm9wZW4iKTtyZXR1cm4hMX1lbHNle3JldHVybiEwfX0pO2lmKHR5cGVvZiBkZWZhdWx0UGF5bWVudCE9J3VuZGVmaW5lZCcpe3ZhciBzZXRQYXk9ZGVmYXVsdFBheW1lbnQ7aWYoY3VyUGF5bWVudC5sZW5ndGg+MSl7c2V0UGF5PWN1clBheW1lbnR9CnNldFBheW1lbnRTZWxlY3RvcihzZXRQYXkpfQp3aW5XPXdpbmRvdy5vdXRlcldpZHRoO3dpbkg9d2luZG93Lm91dGVySGVpZ2h0O3dpblg9d2luZG93LnNjcmVlblg7d2luWT13aW5kb3cuc2NyZWVuWTskKHdpbmRvdykub24oJ3Jlc2l6ZScsZnVuY3Rpb24oKXt2YXIgaGVhZGVyU2VhcmNoPSQoJyNoZWFkZXJfc2VhcmNoJyk7aWYoaGVhZGVyU2VhcmNoLmxlbmd0aD4wKXtoZWFkZXJTZWFyY2gucmVtb3ZlQXR0cignc3R5bGUnKX19KTt1cGRhdGVMYXlvdXRPZlJGUUZvcm1JdGVtcygpfSk7ZnVuY3Rpb24gc2V0dXBMYWJlbENsaWNrKGUpeyQoJy5jbGlja2FibGUtbGFiZWwnKS51bmJpbmQoJ2NsaWNrJykuY2xpY2soZnVuY3Rpb24oKXt2YXIgbmFtZT0kKHRoaXMpLmF0dHIoJ2ZvcicpO3ZhciBzaWJsaW5nSW5wdXQ9JCh0aGlzKS5zaWJsaW5ncygiaW5wdXQiKTskKHNpYmxpbmdJbnB1dCkuZWFjaChmdW5jdGlvbigpe2lmKCQodGhpcykuYXR0cignbmFtZScpPT1uYW1lKXtpZigkKHRoaXMpLnByb3AoJ2NoZWNrZWQnKT09ITApeyQodGhpcykucHJvcCgnY2hlY2tlZCcsITEpfWVsc2V7JCh0aGlzKS5wcm9wKCdjaGVja2VkJywhMCl9fX0pfSkuaG92ZXIoZnVuY3Rpb24oKXskKHRoaXMpLmNzcygnY3Vyc29yJywncG9pbnRlcicpfSl9CmZ1bmN0aW9uIGhlbHAodGl0bGUsdGV4dCxjZW50ZXIpe2lmKCQoJyNoZWxwZGlhbG9nJykubGVuZ3RoPT0wKXt2YXIgc3R5bGU9Y2VudGVyPT0xPydzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyInOicnOyQoJ2JvZHknKS5hcHBlbmQoJzxkaXYgJytzdHlsZSsnIGlkPSJoZWxwZGlhbG9nIj4nK3RleHQrJzwvZGl2PicpfWVsc2V7aWYoY2VudGVyPT0xKXskKCcjaGVscGRpYWxvZycpLmNzcygndGV4dC1hbGlnbicsJ2NlbnRlcicpLmh0bWwodGV4dCl9ZWxzZXskKCcjaGVscGRpYWxvZycpLmNzcygndGV4dC1hbGlnbicsJ2xlZnQnKS5odG1sKHRleHQpfX0KJCgnI2hlbHBkaWFsb2cnKS5kaWFsb2coe21vZGFsOiEwLHdpZHRoOjQwMCxyZXNpemVhYmxlOiExLGRyYWdnYWJsZTohMSxkaWFsb2dDbGFzczonaGVscGRpYWxvZycsdGl0bGU6dGl0bGUsc2hvdzohMSxidXR0b25zOlt7dGV4dDoiT2siLGNsaWNrOmZ1bmN0aW9uKCl7JCh0aGlzKS5kaWFsb2coImNsb3NlIil9fV19KX0KZnVuY3Rpb24gaXNGcmFjdGlvbih2YWwpe3JldHVybiB2YWwubWF0Y2goL14oKFxkK1xzKT9cZCtcL1xkKykkL2cpIT1udWxsfQpmdW5jdGlvbiBjb252ZXJ0RnJhY3Rpb25Ub0RlY2ltYWwodmFsKXt2YXIgeT12YWwuc3BsaXQoJyAnKTtpZih5Lmxlbmd0aD4xKXt2YXIgej15WzFdLnNwbGl0KCcvJyk7cmV0dXJuIHBhcnNlRmxvYXQoKCt5WzBdKyh6WzBdL3pbMV0pKSl9ZWxzZXt2YXIgej15WzBdLnNwbGl0KCcvJyk7aWYoei5sZW5ndGg+MSl7cmV0dXJuIHBhcnNlRmxvYXQoKHpbMF0velsxXSkpfWVsc2V7cmV0dXJuIHBhcnNlRmxvYXQoelswXSl9fQpyZXR1cm4gMH0KZnVuY3Rpb24gcmVzcG9uc2lmeVRhYmxlcygpe3ZhciB0YWJsZXM9JCgndGFibGUnKTt0YWJsZXMuZWFjaChmdW5jdGlvbigpe2lmKCEkKHRoaXMpLnBhcmVudCgpLmhhc0NsYXNzKCd0YWJsZS1yZXNwb25zaXZlJykpeyQodGhpcykud3JhcCgnPGRpdiBjbGFzcz0idGFibGUtcmVzcG9uc2l2ZSI+PC9kaXY+Jyl9fSl9CmZ1bmN0aW9uIHNldE5hdmlnYXRpb24oKXt2YXIgd2luZG93V2lkdGg9JCh3aW5kb3cpLndpZHRoKCk7aWYodG91Y2hJc0VuYWJsZWQoKSYmKHdpbmRvd1dpZHRoPG1pbldpZHRoKSl7aGlkZU5hdmlnYXRpb24oKX1lbHNlIGlmKHRvdWNoSXNFbmFibGVkKCkmJihtaW5XaWR0aDx3aW5kb3dXaWR0aCkpe3Nob3dOYXZpZ2F0aW9uKCl9fQpmdW5jdGlvbiBoaWRlTmF2aWdhdGlvbigpeyQoJy51cHBlcl9uYXZfY29udGFpbmVyJykuY3NzKCdkaXNwbGF5Jywnbm9uZScpOyQoJy5tZWdhX25hdicpLmNzcygnZGlzcGxheScsJ25vbmUnKTskKCcudG9wX25hdicpLmNzcygnZGlzcGxheScsJ25vbmUnKTskKCcjcmVzcG9uc2l2ZU1lbnVCdXR0b24nKS5yZW1vdmVDbGFzcygnaGlkZGVuLW1kIGhpZGRlbi1sZycpfQpmdW5jdGlvbiBzaG93TmF2aWdhdGlvbigpeyQoJy51cHBlcl9uYXZfY29udGFpbmVyJykuY3NzKCdkaXNwbGF5JywnaW5saW5lLWJsb2NrJyk7JCgnLm1lZ2FfbmF2JykuY3NzKCdkaXNwbGF5JywnYmxvY2snKTskKCcudG9wX25hdicpLmNzcygnZGlzcGxheScsJ2lubGluZS1ibG9jaycpO2lmKCEkKCcjcmVzcG9uc2l2ZU1lbnVCdXR0b24nKS5oYXNDbGFzcygnaGlkZGVuLW1kIGhpZGRlbi1sZycpKXskKCcjcmVzcG9uc2l2ZU1lbnVCdXR0b24nKS5hZGRDbGFzcygnaGlkZGVuLW1kIGhpZGRlbi1sZycpfX0KZnVuY3Rpb24gdG91Y2hJc0VuYWJsZWQoKXt2YXIgcmV0dXJuVmFsdWU9ITE7aWYoJ29udG91Y2hzdGFydCcgaW4gd2luZG93fHxuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMpe3JldHVyblZhbHVlPSEwfQpyZXR1cm4gcmV0dXJuVmFsdWV9CmZ1bmN0aW9uIGR1bXBPYmplY3RUb0NvbnNvbGUob2JqKXskLmVhY2gob2JqLGZ1bmN0aW9uKGluZGV4LHZhbCl7Y29uc29sZS5sb2coaW5kZXgrJyAtLSAnK3ZhbCl9KX0KJC5mbi5hYnNvbHV0ZUNvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7dmFyIHNUb3A9JCh3aW5kb3cpLnNjcm9sbFRvcCgpO3ZhciBzTGVmdD0kKHdpbmRvdykuc2Nyb2xsTGVmdCgpO3ZhciB3PXRoaXMud2lkdGgoKTt2YXIgaD10aGlzLmhlaWdodCgpO3ZhciBvZmZzZXQ9dGhpcy5vZmZzZXQoKTt2YXIgJHA9dGhpczt2YXIgY291bnQ9MDt3aGlsZSh0eXBlb2YgJHA9PSdvYmplY3QnKXt2YXIgcE9mZnNldD0kcC5wYXJlbnQoKS5vZmZzZXQoKTtpZih0eXBlb2YgcE9mZnNldD09J3VuZGVmaW5lZCcpYnJlYWs7b2Zmc2V0LmxlZnQ9b2Zmc2V0LmxlZnQrKHBPZmZzZXQubGVmdCk7b2Zmc2V0LnRvcD1vZmZzZXQudG9wKyhwT2Zmc2V0LnRvcCk7JHA9JHAucGFyZW50KCl9CnZhciBwb3M9e2xlZnQ6b2Zmc2V0LmxlZnQrc0xlZnQscmlnaHQ6b2Zmc2V0LmxlZnQrdytzTGVmdCx0b3A6b2Zmc2V0LnRvcCtzVG9wLGJvdHRvbTpvZmZzZXQudG9wK2grc1RvcCx9CnBvcy50bD17eDpwb3MubGVmdCx5OnBvcy50b3B9O3Bvcy50cj17eDpwb3MucmlnaHQseTpwb3MudG9wfTtwb3MuYmw9e3g6cG9zLmxlZnQseTpwb3MuYm90dG9tfTtwb3MuYnI9e3g6cG9zLnJpZ2h0LHk6cG9zLmJvdHRvbX07Y29uc29sZS5sb2coJ2xlZnQ6ICcrcG9zLmxlZnQrJyAtIHJpZ2h0OiAnK3Bvcy5yaWdodCsnIC0gdG9wOiAnK3Bvcy50b3ArJyAtIGJvdHRvbTogJytwb3MuYm90dG9tKTtyZXR1cm4gcG9zfQpmdW5jdGlvbiBnZXRVcmxWYXJzKCl7dmFyIHZhcnM9e307dmFyIHBhcnRzPXdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1s/Jl0rKFtePSZdKyk9KFteJiNdKikvZ2ksZnVuY3Rpb24obSxrZXksdmFsdWUpe3ZhcnNba2V5XT12YWx1ZX0pO3JldHVybiB2YXJzfQpmdW5jdGlvbiBzdWJtaXRfcmZxKCl7dmFyIGZBY3Q9JCgiI2NhcnRfcXVhbnRpdHkiKS5hdHRyKCdhY3Rpb24nKTtpZihwcm9kdWN0SXNQYXJlbnQ9PSEwKXt2YXIgcmVwbEFjdD1mQWN0LnJlcGxhY2UoJ2FjdGlvbj11cGRhdGVfY2hpbGRfcHJvZHVjdCcsJ2FjdGlvbj11cGRhdGVfY2hpbGRfcmZxX3Byb2R1Y3QnKX1lbHNle3ZhciByZXBsQWN0PWZBY3QucmVwbGFjZSgnYWN0aW9uPXVwZGF0ZV9wcm9kdWN0JywnYWN0aW9uPXVwZGF0ZV9yZnFfcHJvZHVjdCcpfQokKCIjY2FydF9xdWFudGl0eSIpLmF0dHIoJ2FjdGlvbicscmVwbEFjdCkuc3VibWl0KCl9CmZ1bmN0aW9uIHNldFF0eSgpe2N1clF0eT0kKCIjcFF0eSIpLnZhbCgpO2lmKGN1clF0eTxxdHlQdHN8fGN1clF0eSVxdHlQdHMhPTApe25ld1F0eT1NYXRoLmNlaWwoY3VyUXR5L3F0eVB0cykqcXR5UHRzOyQoIiNwUXR5IikudmFsKG5ld1F0eSl9fQpmdW5jdGlvbiBzZXRUb3RhbCgpe2lmKHR5cGVvZiBwYlZhbHMhPSd1bmRlZmluZWQnKXtjdXJRdHk9JCgiI3BRdHkiKS52YWwoKTtpZihjdXJRdHk8MSl7Y3VyUXR5PTF9CnZhciBwYlZhbD0wO3ZhciBwYlNldD0hMTtmb3IodmFyIHggaW4gcGJWYWxzKXtwYlZhbD1wYlZhbHNbeF07cGJQdD1wYlZhbHMuaW5kZXhPZihwYlZhbCk7aWYoY3VyUXR5Pj1wYlB0KXtwYlNldD0hMDtjdXJQcmljZV9lYWNoPXBiVmFsLnRvRml4ZWQocHJpY2VEZWNpbWFscyk7Y3VyUHJpY2VfdG90YWw9KGN1clByaWNlX2VhY2gqY3VyUXR5KS50b0ZpeGVkKDIpO2lmKGN1clByaWNlX3RvdGFsPDApeyR0b3RhbFByaWNlPSQoIiNwcm9kdWN0c1ByaWNlX3RvdGFsIikudGV4dCgpLnJlcGxhY2UoIlRvdGFsIFByaWNlOiAiLCIiKTtyZXR1cm4gJCgiI3Byb2R1Y3RzUHJpY2VfZWFjaCIpLmh0bWwocHJpY2VFYWNoX2xhYmVsKyR0b3RhbFByaWNlKX1lbHNleyQoIiNwcm9kdWN0c1ByaWNlX2VhY2giKS5odG1sKHByaWNlRWFjaF9sYWJlbCsnJCcrY3VyUHJpY2VfZWFjaF9mb3JtYXR0ZWQpfX19CmlmKHBiU2V0IT0hMCl7Y3VyUHJpY2VfdG90YWw9KGJhc2VQcmljZSpjdXJRdHkpLnRvRml4ZWQoMil9CnZhciBwcmljZVRleHQ9Jyc7aWYoc3BlY2lhbFByaWNlX2VhY2g+MCl7cHJpY2VUZXh0PXByaWNlRWFjaF9sYWJlbCsnPHM+JCcrZnVsbFByaWNlKyc8L3M+PGJyIC8+JztwcmljZVRleHQrPSc8c3BhbiBjbGFzcz0icHJvZHVjdFNwZWNpYWxQcmljZSI+JytwcmljZVNwZWNpYWxfbGFiZWwrJyQnK3NwZWNpYWxQcmljZV9lYWNoKyc8L3NwYW4+J31lbHNle3ByaWNlVGV4dD1wcmljZUVhY2hfbGFiZWwrJyQnK2N1clByaWNlX2VhY2h9CiQoIiNwcm9kdWN0c1ByaWNlX2VhY2giKS5odG1sKHByaWNlVGV4dCk7aWYoYmFzZVByaWNlPT0wKXskKCIjcHJvZHVjdHNQcmljZV9lYWNoIikuY3NzKHsnZGlzcGxheSc6J25vbmUnfSl9CiQoIiNwcm9kdWN0c1ByaWNlX3RvdGFsIikuaHRtbChwcmljZVRvdGFsX2xhYmVsKyc8c3BhbiBpdGVtcHJvcD0icHJpY2VDdXJyZW5jeSIgY29udGVudD0iVVNEIj4kPC9zcGFuPjxzcGFuIGl0ZW1wcm9wPSJwcmljZSIgY29udGVudD0iJytjdXJQcmljZV90b3RhbCsnIj4nK2N1clByaWNlX3RvdGFsKyc8L3NwYW4+JytjdXJQcmljZV9lYWNoX2Zvcm1hdHRlZCk7JCgiI3Byb2R1Y3RfaW5mb19wcmljZV9ibG9jayIpLmNzcygndmlzaWJpbGl0eScsJ3Zpc2libGUnKX19CmZ1bmN0aW9uIHRleHRDb3VudGVyKGZpZWxkLGNvdW50ZXIsbWF4bGltaXQsbGluZWNvdW50ZXIpe3ZhciBmaWVsZFdpZHRoPXBhcnNlSW50KGZpZWxkLm9mZnNldFdpZHRoKTt2YXIgY2hhcmNudD1maWVsZC52YWx1ZS5sZW5ndGg7dmFyIHBlcmNlbnRhZ2U9cGFyc2VJbnQoMTAwLSgobWF4bGltaXQtY2hhcmNudCkqMTAwKS9tYXhsaW1pdCk7aWYocGVyY2VudGFnZT49NDApe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvdW50ZXIpLnN0eWxlLmNvbG9yPScjRkZGRkZGJ31lbHNle2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvdW50ZXIpLnN0eWxlLmNvbG9yPScjNEY0RjRGJ30KaWYobGluZWNvdW50ZXIpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvdW50ZXIpLnN0eWxlLndpZHRoPXBhcnNlSW50KChmaWVsZFdpZHRoKnBlcmNlbnRhZ2UpLzEwMCkrInB4Ijtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsaW5lY291bnRlcikuc3R5bGUud2lkdGg9cGFyc2VJbnQoZmllbGRXaWR0aCkrInB4Ijtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb3VudGVyKS5pbm5lckhUTUw9Ijxub2JyPk1heDogIitwZXJjZW50YWdlKyIlIC0gKCIrY2hhcmNudCsiLyIrbWF4bGltaXQrIik8L25vYnI+In1lbHNle2lmKGNoYXJjbnQ+bWF4bGltaXQpe2ZpZWxkLnZhbHVlPWZpZWxkLnZhbHVlLnN1YnN0cmluZygwLG1heGxpbWl0KX1lbHNle2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvdW50ZXIpLnN0eWxlLndpZHRoPXBhcnNlSW50KChmaWVsZFdpZHRoKnBlcmNlbnRhZ2UpLzEwMCkrInB4Ijtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb3VudGVyKS5pbm5lckhUTUw9Ijxub2JyPk1heDogIitwZXJjZW50YWdlKyIlIC0gKCIrY2hhcmNudCsiLyIrbWF4bGltaXQrIik8L25vYnI+Ijtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb3VudGVyKS5zdHlsZVsiYmFja2dyb3VuZC1jb2xvciJdPSJyZ2IoODAlLCIrKDEwMC1wZXJjZW50YWdlKSsiJSwiKygxMDAtcGVyY2VudGFnZSkrIiUpIn19fQpmdW5jdGlvbiBzdWJtaXRfY29udmVydF9jYXJ0KCl7aWYoJCgiI2NhcnRfYWN0aW9uIikubGVuZ3RoPjApe2lmKHJmcUNhcnQpeyQoIiNjYXJ0X2FjdGlvbiIpLnZhbCgncmZxMmJ1eScpOyQoIiNjYXJ0X3F1YW50aXR5Iikuc3VibWl0KCl9ZWxzZXskKCIjY2FydF9hY3Rpb24iKS52YWwoJ2J1eTJyZnEnKTskKCIjY2FydF9xdWFudGl0eSIpLnN1Ym1pdCgpfQpyZXR1cm4hMH19CmZ1bmN0aW9uIHByaW50UmVjZWlwdCgpe3dpblc9d2luZG93Lm91dGVyV2lkdGg7d2luSD13aW5kb3cub3V0ZXJIZWlnaHQ7d2luWD13aW5kb3cuc2NyZWVuWDt3aW5ZPXdpbmRvdy5zY3JlZW5ZO3hQb3M9d2luWCsoKHdpblctcmVjZWlwdFcpLzIpO3lQb3M9d2luWSsoKHdpbkgtcmVjZWlwdEgpLzIpO3dpbmRvdy5vcGVuKHByaW50UmVjZWlwdF91cmwsJ3JlY2VpcHRfd2luZG93Jywnd2lkdGg9JytyZWNlaXB0VysnLGhlaWdodD0nK3JlY2VpcHRIKycsbG9jYXRpb249bm8sbWVudWJhcj1ubyxzdGF0dXM9bm8sdG9vbGJhcj1ubycpLm1vdmVUbyh4UG9zLHlQb3MpfQpmdW5jdGlvbiB3cml0ZVNlc3Npb25Db29raWUoY29va2llTmFtZSxjb29raWVWYWx1ZSl7ZG9jdW1lbnQuY29va2llPWVzY2FwZShjb29raWVOYW1lKSsiPSIrZXNjYXBlKGNvb2tpZVZhbHVlKSsiOyBwYXRoPS8ifQpmdW5jdGlvbiBnZXRDb29raWVWYWx1ZShjb29raWVOYW1lKXt2YXIgZXhwPW5ldyBSZWdFeHAoZXNjYXBlKGNvb2tpZU5hbWUpKyI9KFteO10rKSIpO2lmKGV4cC50ZXN0KGRvY3VtZW50LmNvb2tpZSsiOyIpKXtleHAuZXhlYyhkb2N1bWVudC5jb29raWUrIjsiKTtyZXR1cm4gdW5lc2NhcGUoUmVnRXhwLiQxKX1lbHNle3JldHVybiExfX0KZnVuY3Rpb24gZGVsZXRlQ29va2llKGNvb2tpZU5hbWUpe3JldHVybiBkb2N1bWVudC5jb29raWU9Y29va2llTmFtZSsnPTsgTWF4LUFnZT0tOTk5OTk5OTk7J30KZnVuY3Rpb24gdG9nZ2xlU2VhcmNoKCl7dmFyIHdpbmRvd1dpZHRoPSQod2luZG93KS53aWR0aCgpO2lmKHdpbmRvd1dpZHRoPDc2OCl7dmFyIG1vYmlsZVNlYXJjaD0kKCcubW9iaWxlLXNlYXJjaCcpO2lmKG1vYmlsZVNlYXJjaC5sZW5ndGg+MCl7aWYobW9iaWxlU2VhcmNoLmNzcygnZGlzcGxheScpPT09J25vbmUnKXttb2JpbGVTZWFyY2guY3NzKCdkaXNwbGF5JywnYmxvY2snKTttb2JpbGVTZWFyY2guY3NzKCdvcGFjaXR5JywxKX1lbHNle21vYmlsZVNlYXJjaC5jc3MoJ29wYWNpdHknLDApO3NldFRpbWVvdXQoZnVuY3Rpb24oKXttb2JpbGVTZWFyY2guY3NzKCdkaXNwbGF5Jywnbm9uZScpfSw1MDApfX19ZWxzZXt2YXIgc2VhcmNoSW5wdXQ9JCgnI3F1aWNrc2VhcmNoX2tleXdvcmRzJyk7dmFyIHNlYXJjaEJ1dHRvbj0kKCcucXVpY2tzZWFyY2gtYnV0dG9uJyk7dmFyIGhlYWRlclNlYXJjaD0kKCcjaGVhZGVyX3NlYXJjaCcpO2lmKHNlYXJjaElucHV0LmNzcygndmlzaWJpbGl0eScpPT09J2hpZGRlbicpe2hlYWRlclNlYXJjaC5jc3MoJ3dpZHRoJywnMjkwcHgnKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VhcmNoQnV0dG9uLmNzcygnd2lkdGgnLCc3N3B4Jyk7c2VhcmNoSW5wdXQuY3NzKCd2aXNpYmlsaXR5JywndmlzaWJsZScpO3NlYXJjaEJ1dHRvbi5jc3MoJ3Zpc2liaWxpdHknLCd2aXNpYmxlJyk7c2VhcmNoSW5wdXQuY3NzKCdvcGFjaXR5JywnMScpO3NlYXJjaEJ1dHRvbi5jc3MoJ29wYWNpdHknLCcxJyl9LDUwMCl9ZWxzZXtoZWFkZXJTZWFyY2guY3NzKCd3aWR0aCcsJzc1cHgnKTtzZWFyY2hCdXR0b24uY3NzKCd3aWR0aCcsJzAnKTtzZWFyY2hJbnB1dC5jc3MoJ3Zpc2liaWxpdHknLCdoaWRkZW4nKTtzZWFyY2hCdXR0b24uY3NzKCd2aXNpYmlsaXR5JywnaGlkZGVuJyk7c2VhcmNoSW5wdXQuY3NzKCdvcGFjaXR5JywnMCcpO3NlYXJjaEJ1dHRvbi5jc3MoJ29wYWNpdHknLCcwJyl9CmxldCBxdWlja1NlYXJjaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVpY2tzZWFyY2gnKTtxdWlja1NlYXJjaC5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyl9fQpmdW5jdGlvbiB0b2dnbGVTZWFyY2hNb2JpbGUoKXt2YXIgbW9iaWxlU2VhcmNoPSQoJy5tb2JpbGUtc2VhcmNoLW1vYmlsZScpO2lmKG1vYmlsZVNlYXJjaC5sZW5ndGg+MCl7aWYobW9iaWxlU2VhcmNoLmNzcygnZGlzcGxheScpPT09J25vbmUnKXttb2JpbGVTZWFyY2guY3NzKCdkaXNwbGF5JywnYmxvY2snKTttb2JpbGVTZWFyY2guY3NzKCdvcGFjaXR5JywxKX1lbHNle21vYmlsZVNlYXJjaC5jc3MoJ29wYWNpdHknLDApO3NldFRpbWVvdXQoZnVuY3Rpb24oKXttb2JpbGVTZWFyY2guY3NzKCdkaXNwbGF5Jywnbm9uZScpfSw1MDApfX19CnZhciBtb2JpbGVIZWFkZXJJc1Nob3dpbmc9ITE7ZnVuY3Rpb24gc2V0SGVhZGVyKCl7dmFyIHNjcm9sbFRvcD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO3ZhciBoZWFkZXJXcmFwcGVyPSQoJyNoZWFkZXJXcmFwcGVyJyk7dmFyIHJlZ3VsYXJIZWFkZXI9JCgnI2hlYWRlcicpO3ZhciBtb2JpbGVIZWFkZXI9JCgnI2hlYWRlci1tb2JpbGUnKTt2YXIgd2luZG93V2lkdGg9JCh3aW5kb3cpLndpZHRoKCk7aWYod2luZG93V2lkdGg8OTkyKXtpZihtb2JpbGVIZWFkZXJJc1Nob3dpbmc9PT0hMSl7cmVndWxhckhlYWRlci5jc3Moe29wYWNpdHk6MCx2aXNpYmlsaXR5OiJoaWRkZW4ifSk7c2V0VGltZW91dChmdW5jdGlvbigpe2hlYWRlcldyYXBwZXIuY3NzKCdiYWNrZ3JvdW5kJywnI2ZmZmZmZicpO21vYmlsZUhlYWRlci5jc3MoJ2Rpc3BsYXknLCdibG9jaycpO3JlZ3VsYXJIZWFkZXIuY3NzKCdkaXNwbGF5Jywnbm9uZScpO21vYmlsZUhlYWRlci5jc3Moe29wYWNpdHk6MSx2aXNpYmlsaXR5OiJ2aXNpYmxlIixoZWlnaHQ6IjY2cHgifSk7JCgnI2hlYWRlckxlZnQtbW9iaWxlJykuY3NzKCdoZWlnaHQnLCdhdXRvJyk7JCgnI2hlYWRlclJpZ2h0LW1vYmlsZScpLmNzcygnaGVpZ2h0JywnYXV0bycpfSwzMDApO21vYmlsZUhlYWRlcklzU2hvd2luZz0hMH19ZWxzZXtpZihzY3JvbGxUb3AhPT0wKXtpZihtb2JpbGVIZWFkZXJJc1Nob3dpbmc9PT0hMSl7cmVndWxhckhlYWRlci5jc3Moe29wYWNpdHk6MCx2aXNpYmlsaXR5OiJoaWRkZW4ifSk7c2V0VGltZW91dChmdW5jdGlvbigpe2hlYWRlcldyYXBwZXIuY3NzKCdiYWNrZ3JvdW5kJywnI2ZmZmZmZicpO21vYmlsZUhlYWRlci5jc3MoJ2Rpc3BsYXknLCdibG9jaycpO3JlZ3VsYXJIZWFkZXIuY3NzKCdkaXNwbGF5Jywnbm9uZScpO21vYmlsZUhlYWRlci5jc3Moe29wYWNpdHk6MSx2aXNpYmlsaXR5OiJ2aXNpYmxlIixoZWlnaHQ6IjY2cHgifSk7JCgnI2hlYWRlckxlZnQtbW9iaWxlJykuY3NzKCdoZWlnaHQnLCdhdXRvJyk7JCgnI2hlYWRlclJpZ2h0LW1vYmlsZScpLmNzcygnaGVpZ2h0JywnYXV0bycpfSwzMDApO21vYmlsZUhlYWRlcklzU2hvd2luZz0hMH19ZWxzZXtpZihtb2JpbGVIZWFkZXJJc1Nob3dpbmc9PT0hMCl7bW9iaWxlSGVhZGVyLmNzcyh7b3BhY2l0eTowLHZpc2liaWxpdHk6ImhpZGRlbiJ9KTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aGVhZGVyV3JhcHBlci5jc3MoJ2JhY2tncm91bmQnLCd0cmFuc3BhcmVudCcpO3JlZ3VsYXJIZWFkZXIuY3NzKCdkaXNwbGF5JywnYmxvY2snKTttb2JpbGVIZWFkZXIuY3NzKCdkaXNwbGF5Jywnbm9uZScpO3JlZ3VsYXJIZWFkZXIuY3NzKHtvcGFjaXR5OjEsdmlzaWJpbGl0eToidmlzaWJsZSIsaGVpZ2h0OiI2NnB4In0pOyQoJyNoZWFkZXJMZWZ0LW1vYmlsZScpLmNzcygnaGVpZ2h0JywnMHB4Jyk7JCgnI2hlYWRlclJpZ2h0LW1vYmlsZScpLmNzcygnaGVpZ2h0JywnMHB4Jyl9LDEwMCk7bW9iaWxlSGVhZGVySXNTaG93aW5nPSExfX19fQpmdW5jdGlvbiBzZXRDdXJyZW50WWVhckluRm9vdGVyKCl7dmFyIGN1cnJlbnRZZWFyPSQoJyNmb290ZXItY3VycmVudC15ZWFyJyk7aWYoY3VycmVudFllYXIubGVuZ3RoPjApe2N1cnJlbnRZZWFyLnRleHQobmV3IERhdGUoKS5nZXRGdWxsWWVhcigpKX19CmZ1bmN0aW9uIGhhbmRsZUNhdGVnb3J5TGlzdGluZ0l0ZW1Ib3Zlcigpe3ZhciBjYXRlZ29yeUxpc3RpbmdJdGVtcz0kKCcuY2F0TGlzdGluZ0JveCcpO2lmKGNhdGVnb3J5TGlzdGluZ0l0ZW1zLmxlbmd0aD4wKXtjYXRlZ29yeUxpc3RpbmdJdGVtcy5lYWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS5ob3ZlcihmdW5jdGlvbigpe3ZhciBpY29uPSQodGhpcykuZmluZCgnaW1nLmltZy1yZXNwb25zaXZlJyk7dmFyIGN1cnJlbnRTcmM9aWNvbi5hdHRyKCdzcmMnKTtpZighY3VycmVudFNyYy5pbmNsdWRlcygnX2hvdmVyLnBuZycpKXt2YXIgbmV3U3JjPWN1cnJlbnRTcmMuc2xpY2UoMCwtNCkrIl9ob3Zlci5wbmciO2ljb24uYXR0cignc3JjJyxuZXdTcmMpfX0sZnVuY3Rpb24oKXt2YXIgaWNvbj0kKHRoaXMpLmZpbmQoJ2ltZy5pbWctcmVzcG9uc2l2ZScpO3ZhciBjdXJyZW50U3JjPWljb24uYXR0cignc3JjJyk7aWYoY3VycmVudFNyYy5pbmNsdWRlcygnX2hvdmVyLnBuZycpKXt2YXIgbmV3U3JjPWN1cnJlbnRTcmMuc2xpY2UoMCwtMTApKyIucG5nIjtpY29uLmF0dHIoJ3NyYycsbmV3U3JjKX19KX0pfX0KZnVuY3Rpb24gcmVtb3ZlUGFnZVNlY3Rpb25CcmVha3MoKXt2YXIgcGFnZVNlY3Rpb25Sb3dzPSQoJy5wYWdlLXNlY3Rpb24gLnJvdycpO2lmKHBhZ2VTZWN0aW9uUm93cy5sZW5ndGg+MCl7cGFnZVNlY3Rpb25Sb3dzLmVhY2goZnVuY3Rpb24oKXt2YXIgY2hpbGRyZW49JCh0aGlzKS5jaGlsZHJlbigpO2Zvcih2YXIgY2hpbGQgaW4gY2hpbGRyZW4pe2lmKGNoaWxkcmVuLmhhc093blByb3BlcnR5KGNoaWxkKSl7aWYoY2hpbGRyZW5bY2hpbGRdLm5vZGVOYW1lPT09IkJSIil7JChjaGlsZHJlbltjaGlsZF0pLnJlbW92ZSgpfX19fSl9fQpmdW5jdGlvbiBzZXRVcEhvdmVyT25IZWFkZXJJY29ucygpe3ZhciBwb3J0Zm9saW9JbWFnZT0kKCdpbWdbc3JjPSJpbWFnZXMvaWNvbnMvcG9ydGZvbGlvLWljb24ucG5nIl0nKTt2YXIgc2VhcmNoSW1hZ2U9JCgnaW1nW3NyYz0iaW1hZ2VzL2ljb25zL3NlYXJjaC1pY29uLnBuZyJdJyk7cG9ydGZvbGlvSW1hZ2UuaG92ZXIoZnVuY3Rpb24oKXtwb3J0Zm9saW9JbWFnZS5hdHRyKCdzcmMnLCdpbWFnZXMvaWNvbnMvcG9ydGZvbGlvLWljb25faG92ZXIucG5nJyl9LGZ1bmN0aW9uKCl7cG9ydGZvbGlvSW1hZ2UuYXR0cignc3JjJywnaW1hZ2VzL2ljb25zL3BvcnRmb2xpby1pY29uLnBuZycpfSk7c2VhcmNoSW1hZ2UuaG92ZXIoZnVuY3Rpb24oKXtzZWFyY2hJbWFnZS5hdHRyKCdzcmMnLCdpbWFnZXMvaWNvbnMvc2VhcmNoLWljb25faG92ZXIucG5nJyl9LGZ1bmN0aW9uKCl7c2VhcmNoSW1hZ2UuYXR0cignc3JjJywnaW1hZ2VzL2ljb25zL3NlYXJjaC1pY29uLnBuZycpfSl9CmZ1bmN0aW9uIG9wZW5TZWFyY2goKXtsZXQgcXVpY2tTZWFyY2g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1aWNrc2VhcmNoJyk7aWYoIXF1aWNrU2VhcmNoLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpKXt2YXIgc2VhcmNoSW5wdXQ9JCgnI3F1aWNrc2VhcmNoX2tleXdvcmRzJyk7dmFyIHNlYXJjaEJ1dHRvbj0kKCcucXVpY2tzZWFyY2gtYnV0dG9uJyk7dmFyIGhlYWRlclNlYXJjaD0kKCcjaGVhZGVyX3NlYXJjaCcpO2lmKHNlYXJjaElucHV0LmNzcygndmlzaWJpbGl0eScpPT09J2hpZGRlbicpe2hlYWRlclNlYXJjaC5jc3MoJ3dpZHRoJywnMjkwcHgnKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VhcmNoQnV0dG9uLmNzcygnd2lkdGgnLCc3N3B4Jyk7c2VhcmNoSW5wdXQuY3NzKCd2aXNpYmlsaXR5JywndmlzaWJsZScpO3NlYXJjaEJ1dHRvbi5jc3MoJ3Zpc2liaWxpdHknLCd2aXNpYmxlJyk7c2VhcmNoSW5wdXQuY3NzKCdvcGFjaXR5JywnMScpO3NlYXJjaEJ1dHRvbi5jc3MoJ29wYWNpdHknLCcxJyl9LDUwMCl9CnF1aWNrU2VhcmNoLmNsYXNzTGlzdC5hZGQoJ29wZW4nKX19CmZ1bmN0aW9uIHJlc3BvbnNpZnlJZnJhbWVzKCl7dmFyIGlmcmFtZXM9JCgnI2Jsb2ctbWFpbi1jb250ZW50LWNvbnRhaW5lciBpZnJhbWUnKTtpZihpZnJhbWVzLmxlbmd0aD4wKXtpZnJhbWVzLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLmFkZENsYXNzKCdlbWJlZC1yZXNwb25zaXZlLWl0ZW0nKTskKHRoaXMpLndyYXAoJzxkaXYgY2xhc3M9InJlc3BvbnNpdmUtaWZyYW1lIj48ZGl2IGNsYXNzPSJlbWJlZC1yZXNwb25zaXZlIGVtYmVkLXJlc3BvbnNpdmUtMTZieTkiPjwvZGl2PjwvZGl2PicpfSl9fQpmdW5jdGlvbiB1cGRhdGVMYXlvdXRPZlJGUUZvcm1JdGVtcygpe3ZhciBpbnRlcmVzdGVkSW49JCgnI3JmZl9kYmZvcm1zX3JmcSAjcmZpX2ludGVyZXN0ZWRfaW4nKTtpZihpbnRlcmVzdGVkSW4ubGVuZ3RoPjApe3ZhciBvcHRpb25EaXZzPWludGVyZXN0ZWRJbi5maW5kKCcucmZfdmFsdWUgPiBkaXYnKTtvcHRpb25EaXZzLndyYXBBbGwoJzxkaXYgY2xhc3M9InJvdyI+PC9kaXY+Jyk7b3B0aW9uRGl2cy5lYWNoKGZ1bmN0aW9uKGksZSl7JChlKS53cmFwKCc8ZGl2IGNsYXNzPSJjb2wtc20tMTIgY29sLW1kLTItNCI+PC9kaXY+Jyl9KX19O3ZhciBrZXlTdHI9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IjtmdW5jdGlvbiBlbmNvZGU2NChpbnB1dCl7aW5wdXQ9ZXNjYXBlKGlucHV0KTt2YXIgb3V0cHV0PSIiO3ZhciBjaHIxLGNocjIsY2hyMz0iIjt2YXIgZW5jMSxlbmMyLGVuYzMsZW5jND0iIjt2YXIgaT0wO2Rve2NocjE9aW5wdXQuY2hhckNvZGVBdChpKyspO2NocjI9aW5wdXQuY2hhckNvZGVBdChpKyspO2NocjM9aW5wdXQuY2hhckNvZGVBdChpKyspO2VuYzE9Y2hyMT4+MjtlbmMyPSgoY2hyMSYzKTw8NCl8KGNocjI+PjQpO2VuYzM9KChjaHIyJjE1KTw8Mil8KGNocjM+PjYpO2VuYzQ9Y2hyMyY2MztpZihpc05hTihjaHIyKSl7ZW5jMz1lbmM0PTY0fWVsc2UgaWYoaXNOYU4oY2hyMykpe2VuYzQ9NjR9Cm91dHB1dD1vdXRwdXQra2V5U3RyLmNoYXJBdChlbmMxKStrZXlTdHIuY2hhckF0KGVuYzIpK2tleVN0ci5jaGFyQXQoZW5jMykra2V5U3RyLmNoYXJBdChlbmM0KTtjaHIxPWNocjI9Y2hyMz0iIjtlbmMxPWVuYzI9ZW5jMz1lbmM0PSIifXdoaWxlKGk8aW5wdXQubGVuZ3RoKTtyZXR1cm4gb3V0cHV0fQpmdW5jdGlvbiBkZWNvZGU2NChpbnB1dCl7dmFyIG91dHB1dD0iIjt2YXIgY2hyMSxjaHIyLGNocjM9IiI7dmFyIGVuYzEsZW5jMixlbmMzLGVuYzQ9IiI7dmFyIGk9MDt2YXIgYmFzZTY0dGVzdD0vW15BLVphLXowLTlcK1wvXD1dL2c7aWYoYmFzZTY0dGVzdC5leGVjKGlucHV0KSl7YWxlcnQoIlRoZXJlIHdlcmUgaW52YWxpZCBiYXNlNjQgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgdGV4dC5cbiIrIlZhbGlkIGJhc2U2NCBjaGFyYWN0ZXJzIGFyZSBBLVosIGEteiwgMC05LCAnKycsICcvJyxhbmQgJz0nXG4iKyJFeHBlY3QgZXJyb3JzIGluIGRlY29kaW5nLiIpfQppbnB1dD1pbnB1dC5yZXBsYWNlKC9bXkEtWmEtejAtOVwrXC9cPV0vZywiIik7ZG97ZW5jMT1rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7ZW5jMj1rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7ZW5jMz1rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7ZW5jND1rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7Y2hyMT0oZW5jMTw8Mil8KGVuYzI+PjQpO2NocjI9KChlbmMyJjE1KTw8NCl8KGVuYzM+PjIpO2NocjM9KChlbmMzJjMpPDw2KXxlbmM0O291dHB1dD1vdXRwdXQrU3RyaW5nLmZyb21DaGFyQ29kZShjaHIxKTtpZihlbmMzIT02NCl7b3V0cHV0PW91dHB1dCtTdHJpbmcuZnJvbUNoYXJDb2RlKGNocjIpfQppZihlbmM0IT02NCl7b3V0cHV0PW91dHB1dCtTdHJpbmcuZnJvbUNoYXJDb2RlKGNocjMpfQpjaHIxPWNocjI9Y2hyMz0iIjtlbmMxPWVuYzI9ZW5jMz1lbmM0PSIifXdoaWxlKGk8aW5wdXQubGVuZ3RoKTtyZXR1cm4gdW5lc2NhcGUob3V0cHV0KX07ZnVuY3Rpb24gdW5zZXJpYWxpemUoZGF0YSl7dmFyICRnbG9iYWw9KHR5cGVvZiB3aW5kb3chPT0ndW5kZWZpbmVkJz93aW5kb3c6Z2xvYmFsKQp2YXIgdXRmOE92ZXJoZWFkPWZ1bmN0aW9uKHN0cil7dmFyIHM9c3RyLmxlbmd0aApmb3IodmFyIGk9c3RyLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgY29kZT1zdHIuY2hhckNvZGVBdChpKQppZihjb2RlPjB4N2YmJmNvZGU8PTB4N2ZmKXtzKyt9ZWxzZSBpZihjb2RlPjB4N2ZmJiZjb2RlPD0weGZmZmYpe3MrPTJ9CmlmKGNvZGU+PTB4REMwMCYmY29kZTw9MHhERkZGKXtpLS19fQpyZXR1cm4gcy0xfQp2YXIgZXJyb3I9ZnVuY3Rpb24odHlwZSxtc2csZmlsZW5hbWUsbGluZSl7dGhyb3cgbmV3ICRnbG9iYWxbdHlwZV0obXNnLGZpbGVuYW1lLGxpbmUpfQp2YXIgcmVhZFVudGlsPWZ1bmN0aW9uKGRhdGEsb2Zmc2V0LHN0b3BjaHIpe3ZhciBpPTIKdmFyIGJ1Zj1bXQp2YXIgY2hyPWRhdGEuc2xpY2Uob2Zmc2V0LG9mZnNldCsxKQp3aGlsZShjaHIhPT1zdG9wY2hyKXtpZigoaStvZmZzZXQpPmRhdGEubGVuZ3RoKXtlcnJvcignRXJyb3InLCdJbnZhbGlkJyl9CmJ1Zi5wdXNoKGNocikKY2hyPWRhdGEuc2xpY2Uob2Zmc2V0KyhpLTEpLG9mZnNldCtpKQppKz0xfQpyZXR1cm5bYnVmLmxlbmd0aCxidWYuam9pbignJyldfQp2YXIgcmVhZENocnM9ZnVuY3Rpb24oZGF0YSxvZmZzZXQsbGVuZ3RoKXt2YXIgaSxjaHIsYnVmCmJ1Zj1bXQpmb3IoaT0wO2k8bGVuZ3RoO2krKyl7Y2hyPWRhdGEuc2xpY2Uob2Zmc2V0KyhpLTEpLG9mZnNldCtpKQpidWYucHVzaChjaHIpCmxlbmd0aC09dXRmOE92ZXJoZWFkKGNocil9CnJldHVybltidWYubGVuZ3RoLGJ1Zi5qb2luKCcnKV19CmZ1bmN0aW9uIF91bnNlcmlhbGl6ZShkYXRhLG9mZnNldCl7dmFyIGR0eXBlCnZhciBkYXRhb2Zmc2V0CnZhciBrZXlhbmRjaHJzCnZhciBrZXlzCnZhciBjb250aWcKdmFyIGxlbmd0aAp2YXIgYXJyYXkKdmFyIHJlYWRkYXRhCnZhciByZWFkRGF0YQp2YXIgY2NvdW50CnZhciBzdHJpbmdsZW5ndGgKdmFyIGkKdmFyIGtleQp2YXIga3Byb3BzCnZhciBrY2hycwp2YXIgdnByb3BzCnZhciB2Y2hycwp2YXIgdmFsdWUKdmFyIGNocnM9MAp2YXIgdHlwZWNvbnZlcnQ9ZnVuY3Rpb24oeCl7cmV0dXJuIHh9CmlmKCFvZmZzZXQpe29mZnNldD0wfQpkdHlwZT0oZGF0YS5zbGljZShvZmZzZXQsb2Zmc2V0KzEpKS50b0xvd2VyQ2FzZSgpCmRhdGFvZmZzZXQ9b2Zmc2V0KzIKc3dpdGNoKGR0eXBlKXtjYXNlICdpJzp0eXBlY29udmVydD1mdW5jdGlvbih4KXtyZXR1cm4gcGFyc2VJbnQoeCwxMCl9CnJlYWREYXRhPXJlYWRVbnRpbChkYXRhLGRhdGFvZmZzZXQsJzsnKQpjaHJzPXJlYWREYXRhWzBdCnJlYWRkYXRhPXJlYWREYXRhWzFdCmRhdGFvZmZzZXQrPWNocnMrMQpicmVhawpjYXNlICdiJzp0eXBlY29udmVydD1mdW5jdGlvbih4KXtyZXR1cm4gcGFyc2VJbnQoeCwxMCkhPT0wfQpyZWFkRGF0YT1yZWFkVW50aWwoZGF0YSxkYXRhb2Zmc2V0LCc7JykKY2hycz1yZWFkRGF0YVswXQpyZWFkZGF0YT1yZWFkRGF0YVsxXQpkYXRhb2Zmc2V0Kz1jaHJzKzEKYnJlYWsKY2FzZSAnZCc6dHlwZWNvbnZlcnQ9ZnVuY3Rpb24oeCl7cmV0dXJuIHBhcnNlRmxvYXQoeCl9CnJlYWREYXRhPXJlYWRVbnRpbChkYXRhLGRhdGFvZmZzZXQsJzsnKQpjaHJzPXJlYWREYXRhWzBdCnJlYWRkYXRhPXJlYWREYXRhWzFdCmRhdGFvZmZzZXQrPWNocnMrMQpicmVhawpjYXNlICduJzpyZWFkZGF0YT1udWxsCmJyZWFrCmNhc2UgJ3MnOmNjb3VudD1yZWFkVW50aWwoZGF0YSxkYXRhb2Zmc2V0LCc6JykKY2hycz1jY291bnRbMF0Kc3RyaW5nbGVuZ3RoPWNjb3VudFsxXQpkYXRhb2Zmc2V0Kz1jaHJzKzIKcmVhZERhdGE9cmVhZENocnMoZGF0YSxkYXRhb2Zmc2V0KzEscGFyc2VJbnQoc3RyaW5nbGVuZ3RoLDEwKSkKY2hycz1yZWFkRGF0YVswXQpyZWFkZGF0YT1yZWFkRGF0YVsxXQpkYXRhb2Zmc2V0Kz1jaHJzKzIKaWYoY2hycyE9PXBhcnNlSW50KHN0cmluZ2xlbmd0aCwxMCkmJmNocnMhPT1yZWFkZGF0YS5sZW5ndGgpe2Vycm9yKCdTeW50YXhFcnJvcicsJ1N0cmluZyBsZW5ndGggbWlzbWF0Y2gnKX0KYnJlYWsKY2FzZSAnYSc6cmVhZGRhdGE9e30Ka2V5YW5kY2hycz1yZWFkVW50aWwoZGF0YSxkYXRhb2Zmc2V0LCc6JykKY2hycz1rZXlhbmRjaHJzWzBdCmtleXM9a2V5YW5kY2hyc1sxXQpkYXRhb2Zmc2V0Kz1jaHJzKzIKbGVuZ3RoPXBhcnNlSW50KGtleXMsMTApCmNvbnRpZz0hMApmb3IoaT0wO2k8bGVuZ3RoO2krKyl7a3Byb3BzPV91bnNlcmlhbGl6ZShkYXRhLGRhdGFvZmZzZXQpCmtjaHJzPWtwcm9wc1sxXQprZXk9a3Byb3BzWzJdCmRhdGFvZmZzZXQrPWtjaHJzCnZwcm9wcz1fdW5zZXJpYWxpemUoZGF0YSxkYXRhb2Zmc2V0KQp2Y2hycz12cHJvcHNbMV0KdmFsdWU9dnByb3BzWzJdCmRhdGFvZmZzZXQrPXZjaHJzCmlmKGtleSE9PWkpe2NvbnRpZz0hMX0KcmVhZGRhdGFba2V5XT12YWx1ZX0KaWYoY29udGlnKXthcnJheT1uZXcgQXJyYXkobGVuZ3RoKQpmb3IoaT0wO2k8bGVuZ3RoO2krKyl7YXJyYXlbaV09cmVhZGRhdGFbaV19CnJlYWRkYXRhPWFycmF5fQpkYXRhb2Zmc2V0Kz0xCmJyZWFrCmRlZmF1bHQ6ZXJyb3IoJ1N5bnRheEVycm9yJywnVW5rbm93biAvIFVuaGFuZGxlZCBkYXRhIHR5cGUocyk6ICcrZHR5cGUpCmJyZWFrfQpyZXR1cm5bZHR5cGUsZGF0YW9mZnNldC1vZmZzZXQsdHlwZWNvbnZlcnQocmVhZGRhdGEpXX0KcmV0dXJuIF91bnNlcmlhbGl6ZSgoZGF0YSsnJyksMClbMl19CmZ1bmN0aW9uIHNlcmlhbGl6ZShtaXhlZFZhbHVlKXt2YXIgdmFsLGtleSxva2V5CnZhciBrdHlwZT0nJwp2YXIgdmFscz0nJwp2YXIgY291bnQ9MAp2YXIgX3V0ZjhTaXplPWZ1bmN0aW9uKHN0cil7dmFyIHNpemU9MAp2YXIgaT0wCnZhciBsPXN0ci5sZW5ndGgKdmFyIGNvZGU9JycKZm9yKGk9MDtpPGw7aSsrKXtjb2RlPXN0ci5jaGFyQ29kZUF0KGkpCmlmKGNvZGU8MHgwMDgwKXtzaXplKz0xfWVsc2UgaWYoY29kZTwweDA4MDApe3NpemUrPTJ9ZWxzZXtzaXplKz0zfX0KcmV0dXJuIHNpemV9CnZhciBfZ2V0VHlwZT1mdW5jdGlvbihpbnApe3ZhciBtYXRjaAp2YXIga2V5CnZhciBjb25zCnZhciB0eXBlcwp2YXIgdHlwZT10eXBlb2YgaW5wCmlmKHR5cGU9PT0nb2JqZWN0JyYmIWlucCl7cmV0dXJuJ251bGwnfQppZih0eXBlPT09J29iamVjdCcpe2lmKCFpbnAuY29uc3RydWN0b3Ipe3JldHVybidvYmplY3QnfQpjb25zPWlucC5jb25zdHJ1Y3Rvci50b1N0cmluZygpCm1hdGNoPWNvbnMubWF0Y2goLyhcdyspXCgvKQppZihtYXRjaCl7Y29ucz1tYXRjaFsxXS50b0xvd2VyQ2FzZSgpfQp0eXBlcz1bJ2Jvb2xlYW4nLCdudW1iZXInLCdzdHJpbmcnLCdhcnJheSddCmZvcihrZXkgaW4gdHlwZXMpe2lmKGNvbnM9PT10eXBlc1trZXldKXt0eXBlPXR5cGVzW2tleV0KYnJlYWt9fX0KcmV0dXJuIHR5cGV9CnZhciB0eXBlPV9nZXRUeXBlKG1peGVkVmFsdWUpCnN3aXRjaCh0eXBlKXtjYXNlICdmdW5jdGlvbic6dmFsPScnCmJyZWFrCmNhc2UgJ2Jvb2xlYW4nOnZhbD0nYjonKyhtaXhlZFZhbHVlPycxJzonMCcpCmJyZWFrCmNhc2UgJ251bWJlcic6dmFsPShNYXRoLnJvdW5kKG1peGVkVmFsdWUpPT09bWl4ZWRWYWx1ZT8naSc6J2QnKSsnOicrbWl4ZWRWYWx1ZQpicmVhawpjYXNlICdzdHJpbmcnOnZhbD0nczonK191dGY4U2l6ZShtaXhlZFZhbHVlKSsnOiInK21peGVkVmFsdWUrJyInCmJyZWFrCmNhc2UgJ2FycmF5JzpjYXNlICdvYmplY3QnOnZhbD0nYScKZm9yKGtleSBpbiBtaXhlZFZhbHVlKXtpZihtaXhlZFZhbHVlLmhhc093blByb3BlcnR5KGtleSkpe2t0eXBlPV9nZXRUeXBlKG1peGVkVmFsdWVba2V5XSkKaWYoa3R5cGU9PT0nZnVuY3Rpb24nKXtjb250aW51ZX0Kb2tleT0oa2V5Lm1hdGNoKC9eWzAtOV0rJC8pP3BhcnNlSW50KGtleSwxMCk6a2V5KQp2YWxzKz1zZXJpYWxpemUob2tleSkrc2VyaWFsaXplKG1peGVkVmFsdWVba2V5XSkKY291bnQrK319CnZhbCs9JzonK2NvdW50Kyc6eycrdmFscysnfScKYnJlYWsKY2FzZSAndW5kZWZpbmVkJzpkZWZhdWx0OnZhbD0nTicKYnJlYWt9CmlmKHR5cGUhPT0nb2JqZWN0JyYmdHlwZSE9PSdhcnJheScpe3ZhbCs9JzsnfQpyZXR1cm4gdmFsfTt2YXIgcmVzZXRQYWdlPSEwO3ZhciBhZGFwdGl2ZT0hMTt2YXIgY291bnQ9MTt2YXIgcHJldkNvdW50PTA7dmFyIGJhY2s9ITE7dmFyIGN1c3RvbVRhYnNFbmFibGVkPSExO3ZhciByZXNwb25zaXZlUGFyYW1ldGVycz0nJzt2YXIgZ3JpZFBhcmFtZXRlcnM9Jyc7dmFyIGJyZWFrUG9pbnQ9Jyc7dmFyIGJveGVzPScnO3ZhciBjaGFuZ2VkPSExO3ZhciBtb3ZlZD0hMTt2YXIgbXVsdGlwbGVGYWNldGVkU2VhcmNoPSExO3ZhciBwYWdlSGlzdG9yeT1uZXcgQXJyYXk7dmFyIGluZGV4PS0xO3ZhciBmYWNldGVkU2VhcmNoTXVsdGlwbGVDb3VudD0xMDt2YXIgdW53cmFwcGVkUGFyYW1ldGVyczt2YXIgcmVkaXJlY3RJZk9uZVByb2R1Y3Q9ITE7ZnVuY3Rpb24gY2hlY2tQcm9kdWN0TGlzdGluZ1N0YXRlKGhhc0NvbnRlbnQpe3ZhciAkd2lkdGg9JCh3aW5kb3cpLndpZHRoKCk7aWYoJHdpZHRoPDEyOTMpe2lmKG1vdmVkKXskKCcjcHJvZHVjdF9ib3hlc19tb3ZlZCcpLnNob3coKTskKCcjcHJvZHVjdF90YWJsZV9tb3ZlZCcpLmhpZGUoKTskKCcjcHJvZHVjdGJveGVzJykuaGlkZSgpOyQoJyNwcm9kdWN0dGFibGUnKS5oaWRlKCk7aWYoaGFzQ29udGVudCl7JCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe30sMjApfX1lbHNleyQoJyNwcm9kdWN0X2JveGVzX21vdmVkJykuaGlkZSgpOyQoJyNwcm9kdWN0X3RhYmxlX21vdmVkJykuaGlkZSgpOyQoJyNwcm9kdWN0Ym94ZXMnKS5zaG93KCk7JCgnI3Byb2R1Y3R0YWJsZScpLmhpZGUoKTtpZihoYXNDb250ZW50KXskKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7fSwyMCl9fX1lbHNle2lmKG1vdmVkKXskKCcjcHJvZHVjdF9ib3hlc19tb3ZlZCcpLmhpZGUoKTskKCcjcHJvZHVjdF90YWJsZV9tb3ZlZCcpLnNob3coKTskKCcjcHJvZHVjdGJveGVzJykuaGlkZSgpOyQoJyNwcm9kdWN0dGFibGUnKS5oaWRlKCk7aWYoaGFzQ29udGVudCl7JCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe30sMjApfX1lbHNleyQoJyNwcm9kdWN0X2JveGVzX21vdmVkJykuaGlkZSgpOyQoJyNwcm9kdWN0X3RhYmxlX21vdmVkJykuaGlkZSgpOyQoJyNwcm9kdWN0Ym94ZXMnKS5oaWRlKCk7JCgnI3Byb2R1Y3R0YWJsZScpLnNob3coKTtpZihoYXNDb250ZW50KXskKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7fSwyMCl9fX0KaWYoJHdpZHRoPjc2OCl7dmFyIG9iaj0kKCIubXVsdGlwbGUtZmFjZXRlZC1saW5rIikubGVuZ3RoPjE/JCgiLm11bHRpcGxlLWZhY2V0ZWQtbGluayIpOiQoIi5mYWNldGVkLWxpbmsiKTt2YXIgdmFyaWFibGVIZWlnaHQ9KChvYmouaGVpZ2h0KCkpKmZhY2V0ZWRTZWFyY2hNdWx0aXBsZUNvdW50KSsncHgnO29iai5jc3MoeydtYXgtaGVpZ2h0Jzp2YXJpYWJsZUhlaWdodH0pO3ZhciBoZWlnaHQsdmFsdWVIZWlnaHQ7aWYoJCgnLmZpbHRlcmNvbHVtbicpLmxlbmd0aD4wKXt2YWx1ZUhlaWdodD0kKCJhLmZhY2V0ZWQtbGluayIpLmhlaWdodCgpKzM7JCgnLmZpbHRlcmNvbHVtbicpLmVhY2goZnVuY3Rpb24oKXtpZihmYWNldGVkU2VhcmNoTXVsdGlwbGVDb3VudDwkKHRoaXMpLmNoaWxkcmVuKCkuY2hpbGRyZW4oKS5sZW5ndGgpe2hlaWdodD1mYWNldGVkU2VhcmNoTXVsdGlwbGVDb3VudCp2YWx1ZUhlaWdodH1lbHNle2hlaWdodD0kKHRoaXMpLmNoaWxkcmVuKCkuY2hpbGRyZW4oKS5sZW5ndGgqdmFsdWVIZWlnaHR9CmlmKCQodGhpcykuY2hpbGRyZW4oKS5oYXNDbGFzcygnZmFjZXRlZC1jb2x1bW5zJykpeyQodGhpcykuY3NzKHsnaGVpZ2h0JzpoZWlnaHQqMisncHgnLCdtYXgtaGVpZ2h0JzpoZWlnaHQqMisncHgnfSl9ZWxzZXskKHRoaXMpLmNzcyh7J2hlaWdodCc6aGVpZ2h0KydweCcsJ21heC1oZWlnaHQnOmhlaWdodCsncHgnfSl9fSl9ZWxzZSBpZigkKCcubXVsdGlwbGUtZmFjZXRlZC1saW5rJykubGVuZ3RoPjApe3ZhbHVlSGVpZ2h0PSQoImEubXVsdGlwbGUtZmFjZXRlZC1saW5rIikuaGVpZ2h0KCkrMzskKCcubXVsdGlwbGVfZmFjZXRlZF92YXJpYWJsZScpLmVhY2goZnVuY3Rpb24oKXtoZWlnaHQ9MDtpZihmYWNldGVkU2VhcmNoTXVsdGlwbGVDb3VudDwkKHRoaXMpLmNoaWxkcmVuKCkubGVuZ3RoKXtoZWlnaHQ9ZmFjZXRlZFNlYXJjaE11bHRpcGxlQ291bnQqdmFsdWVIZWlnaHQ7aGVpZ2h0Kz0xMDskKHRoaXMpLmNzcyh7J2hlaWdodCc6aGVpZ2h0KydweCcsJ21heC1oZWlnaHQnOmhlaWdodCsncHgnfSl9ZWxzZXtoZWlnaHQ9JCh0aGlzKS5jaGlsZHJlbigpLmxlbmd0aCp2YWx1ZUhlaWdodC8yO2hlaWdodCs9MTA7JCh0aGlzKS5jc3MoeydoZWlnaHQnOmhlaWdodCsncHgnLCdtYXgtaGVpZ2h0JzpoZWlnaHQrJ3B4J30pLmNvbHVtbml6ZSh7Y29sdW1uczoyLGxhc3ROZXZlclRhbGxlc3Q6ITB9KX19KX19CiQoIi5mYWNldGVkX2ltYWdlX3ZpZXdlciIpLmJ4U2xpZGVyKHttb2RlOiJmYWRlIixzcGVlZDozMDAsY29udHJvbHM6ITEsYXV0bzohMSxhZGFwdGl2ZUhlaWdodDohMCx0b3VjaEVuYWJsZWQ6ITEsb25TbGlkZXJMb2FkOmZ1bmN0aW9uKCl7JCgiLmZhY2V0ZWRfaW1hZ2Vfdmlld2VyIikuY3NzKCJ2aXNpYmlsaXR5IiwidmlzaWJsZSIpO3ZhciBzY3JpcHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7c2NyaXB0LnNyYz0iZXh0L2xpZ2h0Ym94Mi9kaXN0L2pzL2xpZ2h0Ym94Lm1pbi5qcyI7ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpfX0pfQokKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCl7Y2hlY2tQcm9kdWN0TGlzdGluZ1N0YXRlKCExKX0pOyQoZnVuY3Rpb24oKXskKHdpbmRvdykub24oJ2JlZm9yZXVubG9hZCAnLGZ1bmN0aW9uKCl7dmFyIHNjcm9sbFBvc2l0aW9uPSQod2luZG93KS5zY3JvbGxUb3AoKTtpZihzY3JvbGxQb3NpdGlvbj4wKXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgic2Nyb2xsUG9zaXRpb24iLHNjcm9sbFBvc2l0aW9uKX19KX0pO2Z1bmN0aW9uIHVwZGF0ZUZpbHRlcnMocGFyYW1ldGVycyxuZXdTZWxlY3RWYWx1ZSxuZXdTZWxlY3RJRCl7dmFyIHJlZmVycmVyPWdldFVybFZhcnMoKVsncmVmZXJyZXInXTtpZih0eXBlb2YgcmVmZXJyZXI9PSd1bmRlZmluZWQnKXtyZWZlcnJlcj0wfQppZihwYXJhbWV0ZXJzPT11bmRlZmluZWQpe3JldHVybiExfQp2YXIgcGFybXM9dW53cmFwUGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtpZih0eXBlb2YgbmV3U2VsZWN0SUQhPSd1bmRlZmluZWQnKXt2YXIgdmFya2V5PW5ld1NlbGVjdElELm1hdGNoKC8oXGQrKS8pWzFdO3Bhcm1zLmN1cnJlbnR2YXI9dmFya2V5O3Bhcm1zLmN1cnJlbnR2YWw9bmV3U2VsZWN0VmFsdWU7aWYodHlwZW9mIHBhcm1zLnNldHZhcmlhYmxlc1t2YXJrZXldPT0ndW5kZWZpbmVkJyl7cGFybXMuc2V0dmFyaWFibGVzW3ZhcmtleV09W119CnBhcm1zLnNldHZhcmlhYmxlc1t2YXJrZXldW25ld1NlbGVjdFZhbHVlXT0nIicrbmV3U2VsZWN0VmFsdWUrJyInfQpwYXJtcy5yZWZlcnJlcj1yZWZlcnJlcjtwYXJhbWV0ZXJzPXdyYXBQYXJhbWV0ZXJzKHBhcm1zKTskLmJsb2NrVUkoe21lc3NhZ2U6JzxpbWcgc3JjPSInK0JBU0VfSFJFRisnaW1hZ2VzL3NpdGUvbG9hZGluZy5naWYiIC8+Jyxjc3M6e2JhY2tncm91bmRDb2xvcjondHJhbnNwYXJlbnQnLGNvbG9yOicjMDAwJyxib3JkZXI6J25vbmUnfSxvdmVybGF5Q1NTOntiYWNrZ3JvdW5kQ29sb3I6JyMwMDAnLG9wYWNpdHk6MC4xLGN1cnNvcjond2FpdCd9LGZhZGVJbjowLGZhZGVPdXQ6MCxiYXNlWjoxMDAwfSk7JC5wb3N0KCdpbmNsdWRlcy9hamF4L2FqYXgudmFyaWFibGVzLnBocCcse3BhcmFtZXRlcnM6cGFyYW1ldGVycyxuZXdzZWxlY3R2YWw6bmV3U2VsZWN0VmFsdWV9LGZ1bmN0aW9uKGRhdGEpeyQudW5ibG9ja1VJKCk7Y291bnQ9ZGF0YS5wYWdlIT09bnVsbD9kYXRhLnBhZ2U6MTtpZigkKCcjZmFjZXRlZHNlYXJjaCcpLmxlbmd0aD4wKXtpZihkYXRhLmZhY2V0ZWRzZWFyY2ghPW51bGwmJmRhdGEuZmFjZXRlZHNlYXJjaCE9JycpeyQoJyNyZXNwb25zaXZlRmFjdGVkU2VhcmNoQnV0dG9uJykuY3NzKCdkaXNwbGF5JywnaW5saW5lLWJsb2NrJyk7JCgnI3Jlc3BvbnNpdmVfZmFjZXRlZF9zZWFyY2gnKS5yZW1vdmUoKTskKCcjcmVzcG9uc2l2ZV9mYWNldGVkX3NlYXJjaF9jb250YWluZXInKS5odG1sKGRhdGEucmVzcG9uc2l2ZV9mYWNldGVkX3NlYXJjaCk7JCgnI2ZhY2V0ZWRzZWFyY2gnKS5wYXJlbnQoKS5wYXJlbnQoKS5zaG93KCk7JCgnI2ZhY2V0ZWRzZWFyY2gnKS5odG1sKGRhdGEuZmFjZXRlZHNlYXJjaCk7JCgnI2ZhY2V0ZWRzZWFyY2ggYScpLmhvdmVyKGZ1bmN0aW9uKCl7JCh0aGlzKS5hZGRDbGFzcygndWktc3RhdGUtaG92ZXInKX0sZnVuY3Rpb24oKXskKHRoaXMpLnJlbW92ZUNsYXNzKCd1aS1zdGF0ZS1ob3ZlcicpfSl9ZWxzZXskKCcjcmVzcG9uc2l2ZUZhY3RlZFNlYXJjaEJ1dHRvbicpLmhpZGUoKTskKCdkaXYuZmFjZXRlZHNlYXJjaCcpLnJlbW92ZSgpfX0KcmVzZXRQYWdlPSExO2lmKChkYXRhLmZhY2V0ZWRzZWFyY2ghPW51bGx8fGRhdGEuc2VsZWN0cyE9JycpJiZkYXRhLnByb2R1Y3R0YWJsZSE9Jycpe2lmKG5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9NU0lFIDkvKSl7d2luZG93LmxvY2F0aW9uLmhhc2g9Y291bnR9ZWxzZXt2YXIgc3RhdGVPYmo9e3RpdGxlOiJQYWdlIix1cmw6bG9jYXRpb24uaHJlZn07aWYoIWxvY2F0aW9uLmhyZWYubWF0Y2goLyMvKSl7aGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGVPYmosImhhc2gtdXJsIixzdGF0ZU9iai51cmwrJyMnK2NvdW50KX1lbHNle3ZhciB1cmw9c3RhdGVPYmoudXJsLm1hdGNoKC9eKC4qPykoXCMoXGQrKSkuKj8kLyk7aWYoZGF0YS5yZXNldD09MCl7aGlzdG9yeS5wdXNoU3RhdGUoc3RhdGVPYmosImhhc2gtdXJsIix1cmxbMV0rJyMnK2NvdW50KX1lbHNle2hpc3RvcnkucHVzaFN0YXRlKHN0YXRlT2JqLCJoYXNoLXVybCIsdXJsWzFdKX19fQpwYWdlSGlzdG9yeS5wdXNoKGRhdGEucGFyYW1ldGVycyl9CnVud3JhcHBlZFBhcmFtZXRlcnM9dW53cmFwUGFyYW1ldGVycyhkYXRhLnBhcmFtZXRlcnMpO2lmKGRhdGEucmVzZXR8fCFsaXN0aW5nQWJvdmVDb250ZW50KXtpZigkKCcjc2VsZWN0bGlzdCcpLmxlbmd0aD4wKXskKCcjc2VsZWN0bGlzdCcpLmh0bWwoZGF0YS5zZWxlY3RzKX0KJCgnI3NlbGVjdF9saXN0X21vdmVkJykuaHRtbCgnJyk7JCgnI3Byb2R1Y3R0YWJsZScpLmh0bWwoZGF0YS5wcm9kdWN0dGFibGUpLmhpZGUoKTskKCcjcHJvZHVjdF90YWJsZV9tb3ZlZCcpLmh0bWwoJycpLmhpZGUoKTskKCcjcHJvZHVjdGJveGVzJykuaHRtbChkYXRhLnByb2R1Y3Rib3hlcykuaGlkZSgpOyQoJyNwcm9kdWN0X2JveGVzX21vdmVkJykuaHRtbCgnJykuaGlkZSgpO21vdmVkPSExO2lmKGZsb2F0SGVhZCl7dmFyIHRhYmxlPSQoJ3RhYmxlLnByb2R1Y3RMaXN0aW5nJyk7dGFibGUuZmxvYXRUaGVhZCgnZGVzdHJveScpO3RhYmxlLmZsb2F0VGhlYWQoe3pJbmRleDo1MDF9KX19ZWxzZXtpZigkKCcjc2VsZWN0X2xpc3RfbW92ZWQnKS5sZW5ndGg+MCl7JCgnI3NlbGVjdF9saXN0X21vdmVkJykuaHRtbChkYXRhLnNlbGVjdHMpfQokKCcjc2VsZWN0bGlzdCcpLmh0bWwoJycpOyQoJyNwcm9kdWN0X3RhYmxlX21vdmVkJykuaHRtbChkYXRhLnByb2R1Y3R0YWJsZSkuaGlkZSgpOyQoJyNwcm9kdWN0dGFibGUnKS5odG1sKCcnKS5oaWRlKCk7JCgnI3Byb2R1Y3RfYm94ZXNfbW92ZWQnKS5odG1sKGRhdGEucHJvZHVjdGJveGVzKS5oaWRlKCk7JCgnI3Byb2R1Y3Rib3hlcycpLmh0bWwoJycpLmhpZGUoKTttb3ZlZD0hMH0Kc2V0VGltZW91dChmdW5jdGlvbigpe2NoZWNrUHJvZHVjdExpc3RpbmdTdGF0ZSgoZGF0YS5wcm9kdWN0dGFibGUhPScnfHxkYXRhLnByb2R1Y3Rib3hlcyE9JycpKTt2YXIgbWVudT0kKCIjcmVzcG9uc2l2ZV9mYWNldGVkX3NlYXJjaCIpLm1tZW51KHtuYXZiYXI6e3RpdGxlOidGaWx0ZXInfSxvZmZDYW52YXM6e3Bvc2l0aW9uOiJsZWZ0Iix6cG9zaXRpb246ImZyb250In0sZXh0ZW5zaW9uczpbInBhZ2VkaW0tYmxhY2siLCJtdWx0aWxpbmUiXSxvbkNsaWNrOntjbG9zZTohMX19KTskKCd1bC5tdWx0aXBsZV9mYWNldGVkX3ZhcmlhYmxlJykub24oJ21vdXNld2hlZWwgRE9NTW91c2VTY3JvbGwnLGZ1bmN0aW9uKGUpe3ZhciBlMD1lLm9yaWdpbmFsRXZlbnQ7dmFyIGRlbHRhPWUwLndoZWVsRGVsdGF8fC1lMC5kZXRhaWw7dGhpcy5zY3JvbGxUb3ArPShkZWx0YTwwPzE6LTEpKjMwO2UucHJldmVudERlZmF1bHQoKX0pO2lmKGZsb2F0SGVhZCl7dmFyIHRhYmxlPSQoJ3RhYmxlLnByb2R1Y3RMaXN0aW5nJyk7dGFibGUuZmxvYXRUaGVhZCgnZGVzdHJveScpO3RhYmxlLmZsb2F0VGhlYWQoe3pJbmRleDo1MDF9KX19LDUwMCk7aWYoZGF0YS5yZXNldCl7JCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe3Njcm9sbFRvcDooMCl9LDApfWVsc2V7aWYoJCgnI3Byb2R1Y3R0YWJsZScpLmh0bWwoKT09JycpeyQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHtzY3JvbGxUb3A6KCQoJyNwcm9kdWN0X3RhYmxlX21vdmVkJykub2Zmc2V0KCkudG9wKX0sMCl9ZWxzZXskKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7c2Nyb2xsVG9wOigkKCcjcHJvZHVjdHRhYmxlJykub2Zmc2V0KCkudG9wKX0sMCl9fQppZihERUJVR19MVkw+MCl7Y29uc29sZS5sb2coZGF0YS5kZWJ1Zyl9CmlmKGRhdGEuY291bnRzPT0xJiYkKCd0ZC5jYWxsX3RvX2FjdGlvbiBhJykuYXR0cignaHJlZicpLm1hdGNoKC9qYXZhc2NyaXB0Lyk9PW51bGwmJnJlZGlyZWN0SWZPbmVQcm9kdWN0KXt3aW5kb3cubG9jYXRpb249JCgndGQuY2FsbF90b19hY3Rpb24gYScpLmF0dHIoJ2hyZWYnKX0KJCgnLmZhY2V0ZWQtY29sdW1ucycpLmNvbHVtbnMoMik7cmV0dXJuITF9LCdqc29uJykuZmFpbChmdW5jdGlvbihlcnIpeyQudW5ibG9ja1VJKCk7Y29uc29sZS5sb2coZXJyLnJlc3BvbnNlVGV4dCl9KX0KaWYobmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL01TSUUgOS8pfHwobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3NhZmFyaS8nKT4tMSYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2Nocm9tZS8nKT09LTEpKXskKHdpbmRvdykuYmluZCgnaGFzaGNoYW5nZScsZnVuY3Rpb24oKXtiYWNrPSEwO3VwZGF0ZUZpbHRlcnMocGFnZUhpc3RvcnkucG9wKCkpfSl9ZWxzZXt3aW5kb3cub25wb3BzdGF0ZT1mdW5jdGlvbihlKXtpZihwYWdlSGlzdG9yeS5sZW5ndGg9PTF8fCFsb2NhdGlvbi5ocmVmLm1hdGNoKC8jLykpe31lbHNle3BhZ2VIaXN0b3J5LnBvcCgpO3ZhciBwYXJhbXM9cGFnZUhpc3RvcnkucG9wKCk7dXBkYXRlRmlsdGVycyhwYXJhbXMpfX19CmZ1bmN0aW9uIGVkaXRWYXJpYWJsZShpZCl7aWYoJCgnI2VkaXR2YXJpYWJsZWRpYWxvZycpLmxlbmd0aD09MCl7JCgnYm9keScpLmFwcGVuZCgnPGRpdiBpZD0iZWRpdHZhcmlhYmxlZGlhbG9nIiAvPicpfQp2YXIgdGV4dD0ndGV4dCc7JCgnI2VkaXR2YXJpYWJsZWRpYWxvZycpLmRpYWxvZyh7bW9kYWw6ITAsb3BlbjpmdW5jdGlvbigpeyQoJyN2YXJpYWJsZW5hbWUnKS52YWwoJCgnc2VsZWN0W25hbWU9dmFyaWFibGVfdmFyaWFibGVcXFsnK2lkKydcXF1dIDpzZWxlY3RlZCcpLnRleHQoKSl9LGJ1dHRvbnM6e3VwZGF0ZTpmdW5jdGlvbigpe2lmKCQoJyN2YXJpYWJsZW5hbWUnKS52YWwoKSE9PScnKXskLnBvc3QoJy4uL2luY2x1ZGVzL2FqYXgvYWpheC52YXJpYWJsZXMucGhwJyx7dmFyaWFibGVpZDppZCx2YXJpYWJsZXRleHQ6JCgnI3ZhcmlhYmxlbmFtZScpLnZhbCgpfSxmdW5jdGlvbihkYXRhKXskKCdzZWxlY3RbbmFtZT12YXJpYWJsZV92YXJpYWJsZVxcWzFcXF1cXFsnK2lkKydcXF1dIDpzZWxlY3RlZCcpLnRleHQoJCgnI3ZhcmlhYmxlbmFtZScpLnZhbCgpKX0pLmZhaWwoZnVuY3Rpb24oZXJyKXthbGVydChlcnIucmVzcG9uc2VUZXh0KX0pOyQodGhpcykuZGlhbG9nKCdjbG9zZScpfWVsc2V7YWxlcnQoJ1ZhcmlhYmxlIE5hbWUgQ2Fubm90IEJlIEJsYW5rJywnRW50cnkgRXJyb3InKX19LGNsb3NlOmZ1bmN0aW9uKCl7JCh0aGlzKS5kaWFsb2coJ2Nsb3NlJyl9fX0pfQpmdW5jdGlvbiBjaGVja0NhcnRRdWFudGl0aWVzKHR5cGUsaWQpe3ZhciBxdHk9MDtpZih0eXBlb2YgdHlwZSE9J3VuZGVmaW5lZCcpe2lmKHR5cGU9PSdyZnEnKXskKCcjYWN0aW9uXFxbJytpZCsnXFxdJykudmFsKCdib3hfcmZxJyl9ZWxzZSBpZih0eXBlPT0nYnV5Jyl7JCgnI2FjdGlvblxcWycraWQrJ1xcXScpLnZhbCgnYm94X2J1eScpfQppZigkKCcjcHJvZHVjdGJveGVzJykuaXMoJzp2aXNpYmxlJykmJiQoJyNjYXJ0X3F1YW50aXR5X2JveGVzXFxbJytpZCsnXFxdJykubGVuZ3RoPjApeyQoJyNjYXJ0X3F1YW50aXR5X2JveGVzXFxbJytpZCsnXFxdJykuc3VibWl0KCl9ZWxzZSBpZigkKCcjcHJvZHVjdGJveGVzJykuaXMoJzp2aXNpYmxlJykmJiQoJyNjYXJ0X3F1YW50aXR5X3Jlc3BvbnNpdmUnKS5sZW5ndGg+MCl7JCgnI2NhcnRfcXVhbnRpdHlfcmVzcG9uc2l2ZScpLnN1Ym1pdCgpO3JldHVybiExfWVsc2V7JCgnI2NhcnRfcXVhbnRpdHlcXFsnK2lkKydcXF0nKS5zdWJtaXQoKX19CmlmKCQoJ2lucHV0LmNhcnRxdHknKS5sZW5ndGg+MCl7JCgnaW5wdXQuY2FydHF0eScpLmVhY2goZnVuY3Rpb24oKXtxdHkrPXBhcnNlSW50KCQodGhpcykudmFsKCkpO2lmKHR5cGU9PSdyZnEnKXskKHRoaXMpLmF0dHIoJ25hbWUnLCQodGhpcykuYXR0cignbmFtZScpLnJlcGxhY2UoJ3F0eV9jaGlsZElkJywncXR5X2NoaWxkUkZRSWQnKSl9fSl9CmlmKHF0eT4wKXskKCcjY2FydF9xdWFudGl0eScpLnN1Ym1pdCgpfWVsc2V7JCgnaW5wdXQuY2FydHF0eScpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsJ1RvbWF0bycpLnZhbCgwKX19CmZ1bmN0aW9uIGhpZGVDb2x1bW5zKGZpbHRlcmNsYXNzKXskKCdkaXYuJytmaWx0ZXJjbGFzcykuZWFjaChmdW5jdGlvbigpe3ZhciBlbGVtPSQodGhpcykuZmluZCgnYScpfSl9CmZ1bmN0aW9uIHNldEZpbHRlckhlaWdodChkZXB0aCl7JCgnZGl2LmZpbHRlcmNvbHVtbicpLmNzcygnaGVpZ2h0JywoMjAqZGVwdGgpKzcpOyQoJ2Rpdi5yZXNwb25zaXZlZmlsdGVyY29sdW1uJykuY3NzKCdoZWlnaHQnLCgyMCpkZXB0aCkrNyl9CmZ1bmN0aW9uIHRyaWdnZXJQQih0aWQpeyQoIiNwYl8iK3RpZCsiIC5wcmljZWJyZWFrc0xpc3RpbmdTZXQiKS50b2dnbGVDbGFzcygiaGlkZS1wYiIpfQpmdW5jdGlvbiB1cGRhdGVQcmljaW5nKGJiaWFycmF5KXskLnBvc3QoJ2luY2x1ZGVzL2FqYXgvYWpheC50YmUucGhwJyx7bW9kZWxzOmJiaWFycmF5fSxmdW5jdGlvbihkYXRhKXtmb3IodmFyIGtleSBpbiBkYXRhLm1vZGVscyl7dmFyIHByaWNlT2JqPSQoJyNyb3ctJytrZXkrIiB0ZC5wcm9kdWN0c19wcmljZSIpO3ZhciBwa2dTaXplT2JqPSQoJyNyb3ctJytrZXkrIiB0ZC5wcm9kdWN0X3F1YW50aXR5Iik7dmFyIGJ1eU9iaj0kKCcjcm93LScra2V5KyIgdGQuY2FsbF90b19hY3Rpb24iKTtwcmljZU9iai5odG1sKGRhdGEubW9kZWxzW2tleV0uaHRtbCk7cGtnU2l6ZU9iai5odG1sKGRhdGEubW9kZWxzW2tleV0ucGtnX3F0eSk7aWYoZGF0YS5tb2RlbHNba2V5XS5odG1sPT0nUkZRJyl7JCgnI2J1eV9waWQtJytkYXRhLm1vZGVsc1trZXldLnBpZCkucmVtb3ZlKCl9fQpyZXR1cm4hMX0sJ2pzb24nKS5mYWlsKGZ1bmN0aW9uKGVycil7Y29uc29sZS5sb2coZXJyLnJlc3BvbnNlVGV4dCl9KX0KZnVuY3Rpb24gcGxhY2VGYWNldGVkU2VhcmNoKCl7dmFyIHdpbmRvd1dpZHRoO2lmKCQoJy51aS13aWRnZXQuaW5mb0JveENvbnRhaW5lci5mYWNldGVkX3NlYXJjaCcpLmxlbmd0aD4wKXt3aW5kb3dXaWR0aD0kKHdpbmRvdykud2lkdGgoKTtpZih3aW5kb3dXaWR0aDw3NjgpeyQoJy51aS13aWRnZXQuaW5mb0JveENvbnRhaW5lci5mYWNldGVkX3NlYXJjaCcpLmFwcGVuZFRvKCcjZmFjZXRlZFNlYXJjaFBsYWNlaG9sZGVyJyl9ZWxzZXtpZigkKCcjZmFjZXRlZFNlYXJjaFBsYWNlaG9sZGVyIC51aS13aWRnZXQuaW5mb0JveENvbnRhaW5lci5mYWNldGVkX3NlYXJjaCcpLmxlbmd0aD4wKXskKCcudWktd2lkZ2V0LmluZm9Cb3hDb250YWluZXIuZmFjZXRlZF9zZWFyY2gnKS5hcHBlbmRUbygnI2NvbHVtbkxlZnQgI2xlZnRDb2x1bW5GYWNldGVkU2VhcmNoUGxhY2Vob2xkZXInKX19fX0KZnVuY3Rpb24gY2xvc2VSZXNwb25zaXZlRmFjZXRlZFNlYXJjaCgpe3ZhciBBUEk9JCgiI3Jlc3BvbnNpdmVfZmFjZXRlZF9zZWFyY2giKS5kYXRhKCJtbWVudSIpO0FQSS5jbG9zZSgpfQpmdW5jdGlvbiBjaGFuZ2VDaGVja2JveCh2YXJrZXksdmFsa2V5KXt2YXIgYm94PSQoJyN2YWx1ZVxcWycrdmFya2V5KydcXF1cXFsnK3ZhbGtleSsnXFxdJyk7Ym94LmNsaWNrKCk7dmFyIGJveD0kKCcjdmFsdWVfcmVzcG9uc2l2ZVxcWycrdmFya2V5KydcXF1cXFsnK3ZhbGtleSsnXFxdJyk7Ym94LmNsaWNrKCl9CmZ1bmN0aW9uIHVud3JhcFBhcmFtZXRlcnMoc3RyaW5nKXt2YXIgcGFyYW1zPXVuc2VyaWFsaXplKGRlY29kZTY0KHN0cmluZykpO3ZhciB2YXJzPVtdO2lmKHR5cGVvZiBwYXJhbXMuc2V0dmFyaWFibGVzIT0ndW5kZWZpbmVkJyl7Zm9yKHZhciBrZXkgaW4gcGFyYW1zLnNldHZhcmlhYmxlcyl7a2V5PWtleS5yZXBsYWNlKC9cIisvZywnIicpO3ZhcnNba2V5XT1bXTtmb3IodmFyIHZhbCBpbiBwYXJhbXMuc2V0dmFyaWFibGVzW2tleV0pe3ZhbD12YWwucmVwbGFjZSgvXCIrL2csJyInKTt2YXJzW2tleV1bdmFsXT12YWx9fTtwYXJhbXMuc2V0dmFyaWFibGVzPXZhcnN9CnJldHVybiBwYXJhbXN9CmZ1bmN0aW9uIHdyYXBQYXJhbWV0ZXJzKHN0cmluZyl7cmV0dXJuIGVuY29kZTY0KHNlcmlhbGl6ZShzdHJpbmcpKX0KZnVuY3Rpb24gbG9hZFBhcmFtZXRlcnModmFya2V5LHZhbGtleSl7aWYodHlwZW9mIHZhcmtleT09J3VuZGVmaW5lZCd8fHR5cGVvZiB2YWxrZXk9PSd1bmRlZmluZWQnKXtyZXR1cm4hMX0KaWYodHlwZW9mIHVud3JhcHBlZFBhcmFtZXRlcnMuc2V0dmFyaWFibGVzW3ZhcmtleV0hPSd1bmRlZmluZWQnJiZ0eXBlb2YgdW53cmFwcGVkUGFyYW1ldGVycy5zZXR2YXJpYWJsZXNbdmFya2V5XVt2YWxrZXldIT0ndW5kZWZpbmVkJyl7ZGVsZXRlIHVud3JhcHBlZFBhcmFtZXRlcnMuc2V0dmFyaWFibGVzW3ZhcmtleV1bdmFsa2V5XX0KaWYodHlwZW9mIHVud3JhcHBlZFBhcmFtZXRlcnMuc2V0dmFyaWFibGVzW3ZhcmtleV09PSd1bmRlZmluZWQnKXt1bndyYXBwZWRQYXJhbWV0ZXJzLnNldHZhcmlhYmxlc1t2YXJrZXldPVtdfQp1bndyYXBwZWRQYXJhbWV0ZXJzLnNldHZhcmlhYmxlc1t2YXJrZXldW3ZhbGtleV09dmFsa2V5O3Vud3JhcHBlZFBhcmFtZXRlcnMucmVzZXQ9MH0KZnVuY3Rpb24gc3VibWl0RmlsdGVycyh2YXJrZXkpeyQuZWFjaCgkKCcubXVsdGlwbGUtZmFjZXRlZC1jaGVja2JveCcpLGZ1bmN0aW9uKGtleSx2YWx1ZSl7aWYoJCh0aGlzKS5wcm9wKCdjaGVja2VkJyk9PSEwJiYkKHRoaXMpLmRhdGEoJ2tleScpPT12YXJrZXkpe2xvYWRQYXJhbWV0ZXJzKHZhcmtleSwkKHRoaXMpLmRhdGEoJ3ZhbCcpKX1lbHNlIGlmKCQodGhpcykuZGF0YSgna2V5Jyk9PXZhcmtleSl7aWYodHlwZW9mIHVud3JhcHBlZFBhcmFtZXRlcnMuc2V0dmFyaWFibGVzW3ZhcmtleV0hPSd1bmRlZmluZWQnJiZ0eXBlb2YgdW53cmFwcGVkUGFyYW1ldGVycy5zZXR2YXJpYWJsZXNbdmFya2V5XVskKHRoaXMpLmRhdGEoJ3ZhbCcpXSE9J3VuZGVmaW5lZCcpe2RlbGV0ZSB1bndyYXBwZWRQYXJhbWV0ZXJzLnNldHZhcmlhYmxlc1t2YXJrZXldWyQodGhpcykuZGF0YSgndmFsJyldfX19KTt1bndyYXBwZWRQYXJhbWV0ZXJzLmN1cnJlbnR2YXI9dmFya2V5O3VwZGF0ZUZpbHRlcnMod3JhcFBhcmFtZXRlcnModW53cmFwcGVkUGFyYW1ldGVycykpfQpmdW5jdGlvbiBjbGVhck1pbk1heCh2YXJpYWJsZSx2YWx1ZSl7JCgnI21pblxcWycrdmFyaWFibGUrJ1xcXScpLnZhbCgnJyk7JCgnI21heFxcWycrdmFyaWFibGUrJ1xcXScpLnZhbCgnJyk7JCgnI21pbnJlc3BcXFsnK3ZhcmlhYmxlKydcXF0nKS52YWwoJycpOyQoJyNtYXhyZXNwXFxbJyt2YXJpYWJsZSsnXFxdJykudmFsKCcnKTt1bndyYXBwZWRQYXJhbWV0ZXJzLm1pbj0wO3Vud3JhcHBlZFBhcmFtZXRlcnMubWF4PTB9CmZ1bmN0aW9uIGNoZWNrTWluTWF4KHZhcmtleSl7aWYoJCgnI21pblxcWycrdmFya2V5KydcXF0nKS52YWwoKT09Jycpe3Vud3JhcHBlZFBhcmFtZXRlcnMubWluPTB9ZWxzZXt1bndyYXBwZWRQYXJhbWV0ZXJzLnJlc2V0PTA7dW53cmFwcGVkUGFyYW1ldGVycy5taW49W107dW53cmFwcGVkUGFyYW1ldGVycy5taW5bdmFya2V5XT0kKCcjbWluXFxbJyt2YXJrZXkrJ1xcXScpLnZhbCgpfQppZigkKCcjbWF4XFxbJyt2YXJrZXkrJ1xcXScpLnZhbCgpPT0nJyl7dW53cmFwcGVkUGFyYW1ldGVycy5tYXg9MH1lbHNle3Vud3JhcHBlZFBhcmFtZXRlcnMucmVzZXQ9MDt1bndyYXBwZWRQYXJhbWV0ZXJzLm1heD1bXTt1bndyYXBwZWRQYXJhbWV0ZXJzLm1heFt2YXJrZXldPSQoJyNtYXhcXFsnK3ZhcmtleSsnXFxdJykudmFsKCl9fQpmdW5jdGlvbiBjbGVhckNoZWNrYm94ZXModmFyaWFibGUpeyQuZWFjaCgkKCcubXVsdGlwbGUtZmFjZXRlZC1jaGVja2JveCcpLGZ1bmN0aW9uKGtleSx2YWx1ZSl7aWYoJCh0aGlzKS5wcm9wKCdjaGVja2VkJyk9PSEwJiYkKHRoaXMpLmRhdGEoJ2tleScpPT12YXJpYWJsZSl7JCh0aGlzKS5wcm9wKCdjaGVja2VkJywhMSl9fSl9CmZ1bmN0aW9uIGNsZWFyVXBkYXRlKHBhcmFtZXRlcnMpeyQoJ2lucHV0Lm1pbicpLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLnZhbCgnJyl9KTskKCdpbnB1dC5tYXgnKS5lYWNoKGZ1bmN0aW9uKCl7JCh0aGlzKS52YWwoJycpfSk7dXBkYXRlRmlsdGVycyhwYXJhbWV0ZXJzKX0KZnVuY3Rpb24gc2VsZWN0QWxsRmlsdGVycyh2YXJrZXkpeyQuZWFjaCgkKCcubXVsdGlwbGUtZmFjZXRlZC1jaGVja2JveCcpLGZ1bmN0aW9uKGtleSx2YWx1ZSl7aWYoJCh0aGlzKS5kYXRhKCdrZXknKT09dmFya2V5KXskKHRoaXMpLnByb3AoJ2NoZWNrZWQnLCEwKX19KX0KZnVuY3Rpb24gdXBkYXRlTWluKHZhcmtleSl7dmFyIG1pbj0kKCcjbWluXFxbJyt2YXJrZXkrJ1xcXScpO3ZhciBtaW5yZXNwPSQoJyNtaW5yZXNwXFxbJyt2YXJrZXkrJ1xcXScpO2lmKG1pbi52YWwoKT09JycmJm1pbnJlc3AudmFsKCkhPScnKXttaW4udmFsKG1pbnJlc3AudmFsKCkpfX0KZnVuY3Rpb24gdXBkYXRlTWF4KHZhcmtleSl7dmFyIG1heD0kKCcjbWF4XFxbJyt2YXJrZXkrJ1xcXScpO3ZhciBtYXhyZXNwPSQoJyNtYXhyZXNwXFxbJyt2YXJrZXkrJ1xcXScpO2lmKG1heC52YWwoKT09JycmJm1heHJlc3AudmFsKCkhPScnKXttYXgudmFsKG1heHJlc3AudmFsKCkpfX0KJC5mbi5jb2x1bW5zPWZ1bmN0aW9uKG51bV9jb2xzKXt2YXIgY29udGFpbmVyPXRoaXMsbGlzdEl0ZW09J2xpJyxsaXN0Q2xhc3M9J3N1Yi1saXN0Jztjb250YWluZXIuZWFjaChmdW5jdGlvbigpe3ZhciBpdGVtc19wZXJfY29sPW5ldyBBcnJheSgpLGl0ZW1zPSQodGhpcykuZmluZChsaXN0SXRlbSksbWluX2l0ZW1zX3Blcl9jb2w9TWF0aC5mbG9vcihpdGVtcy5sZW5ndGgvbnVtX2NvbHMpLGRpZmZlcmVuY2U9aXRlbXMubGVuZ3RoLShtaW5faXRlbXNfcGVyX2NvbCpudW1fY29scyk7Zm9yKHZhciBpPTA7aTxudW1fY29scztpKyspe2lmKGk8ZGlmZmVyZW5jZSl7aXRlbXNfcGVyX2NvbFtpXT1taW5faXRlbXNfcGVyX2NvbCsxfWVsc2V7aXRlbXNfcGVyX2NvbFtpXT1taW5faXRlbXNfcGVyX2NvbH19CmZvcih2YXIgaT0wO2k8bnVtX2NvbHM7aSsrKXskKHRoaXMpLmFwcGVuZCgkKCc8dWw+PC91bD4nKS5hZGRDbGFzcyhsaXN0Q2xhc3MpKTtmb3IodmFyIGo9MDtqPGl0ZW1zX3Blcl9jb2xbaV07aisrKXt2YXIgcG9pbnRlcj0wO2Zvcih2YXIgaz0wO2s8aTtrKyspe3BvaW50ZXIrPWl0ZW1zX3Blcl9jb2xba119CiQodGhpcykuZmluZCgnLicrbGlzdENsYXNzKS5sYXN0KCkuYXBwZW5kKGl0ZW1zW2orcG9pbnRlcl0pfX19KTskKCcuc3ViLWxpc3QnKS53cmFwKCc8bGkgY2xhc3M9InN1Yi1saXN0LWxpIj48L2xpPicpO2NvbnRhaW5lci5hZGRDbGFzcygndWktY29ybmVyLWFsbCcpfTshZnVuY3Rpb24oZmFjdG9yeSl7InVzZSBzdHJpY3QiOyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5Il0sZmFjdG9yeSk6alF1ZXJ5JiYhalF1ZXJ5LmZuLmhvdmVySW50ZW50JiZmYWN0b3J5KGpRdWVyeSl9KGZ1bmN0aW9uKCQpeyJ1c2Ugc3RyaWN0Ijt2YXIgY1gsY1ksX2NmZz17aW50ZXJ2YWw6MTAwLHNlbnNpdGl2aXR5OjYsdGltZW91dDowfSxJTlNUQU5DRV9DT1VOVD0wLHRyYWNrPWZ1bmN0aW9uKGV2KXtjWD1ldi5wYWdlWCxjWT1ldi5wYWdlWX0sY29tcGFyZT1mdW5jdGlvbihldiwkZWwscyxjZmcpe2lmKE1hdGguc3FydCgocy5wWC1jWCkqKHMucFgtY1gpKyhzLnBZLWNZKSoocy5wWS1jWSkpPGNmZy5zZW5zaXRpdml0eSlyZXR1cm4gJGVsLm9mZihzLmV2ZW50LHRyYWNrKSxkZWxldGUgcy50aW1lb3V0SWQscy5pc0FjdGl2ZT0hMCxldi5wYWdlWD1jWCxldi5wYWdlWT1jWSxkZWxldGUgcy5wWCxkZWxldGUgcy5wWSxjZmcub3Zlci5hcHBseSgkZWxbMF0sW2V2XSk7cy5wWD1jWCxzLnBZPWNZLHMudGltZW91dElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtjb21wYXJlKGV2LCRlbCxzLGNmZyl9LGNmZy5pbnRlcnZhbCl9LGRlbGF5PWZ1bmN0aW9uKGV2LCRlbCxzLG91dCl7cmV0dXJuIGRlbGV0ZSAkZWwuZGF0YSgiaG92ZXJJbnRlbnQiKVtzLmlkXSxvdXQuYXBwbHkoJGVsWzBdLFtldl0pfTskLmZuLmhvdmVySW50ZW50PWZ1bmN0aW9uKGhhbmRsZXJJbixoYW5kbGVyT3V0LHNlbGVjdG9yKXt2YXIgaW5zdGFuY2VJZD1JTlNUQU5DRV9DT1VOVCsrLGNmZz0kLmV4dGVuZCh7fSxfY2ZnKTskLmlzUGxhaW5PYmplY3QoaGFuZGxlckluKT8oY2ZnPSQuZXh0ZW5kKGNmZyxoYW5kbGVySW4pLCQuaXNGdW5jdGlvbihjZmcub3V0KXx8KGNmZy5vdXQ9Y2ZnLm92ZXIpKTpjZmc9JC5pc0Z1bmN0aW9uKGhhbmRsZXJPdXQpPyQuZXh0ZW5kKGNmZyx7b3ZlcjpoYW5kbGVySW4sb3V0OmhhbmRsZXJPdXQsc2VsZWN0b3I6c2VsZWN0b3J9KTokLmV4dGVuZChjZmcse292ZXI6aGFuZGxlckluLG91dDpoYW5kbGVySW4sc2VsZWN0b3I6aGFuZGxlck91dH0pO3ZhciBoYW5kbGVIb3Zlcj1mdW5jdGlvbihlKXt2YXIgZXY9JC5leHRlbmQoe30sZSksJGVsPSQodGhpcyksaG92ZXJJbnRlbnREYXRhPSRlbC5kYXRhKCJob3ZlckludGVudCIpO2hvdmVySW50ZW50RGF0YXx8JGVsLmRhdGEoImhvdmVySW50ZW50Iixob3ZlckludGVudERhdGE9e30pO3ZhciBzdGF0ZT1ob3ZlckludGVudERhdGFbaW5zdGFuY2VJZF07c3RhdGV8fChob3ZlckludGVudERhdGFbaW5zdGFuY2VJZF09c3RhdGU9e2lkOmluc3RhbmNlSWR9KSxzdGF0ZS50aW1lb3V0SWQmJihzdGF0ZS50aW1lb3V0SWQ9Y2xlYXJUaW1lb3V0KHN0YXRlLnRpbWVvdXRJZCkpO3ZhciBtb3VzZW1vdmU9c3RhdGUuZXZlbnQ9Im1vdXNlbW92ZS5ob3ZlckludGVudC5ob3ZlckludGVudCIraW5zdGFuY2VJZDtpZigibW91c2VlbnRlciI9PT1lLnR5cGUpe2lmKHN0YXRlLmlzQWN0aXZlKXJldHVybjtzdGF0ZS5wWD1ldi5wYWdlWCxzdGF0ZS5wWT1ldi5wYWdlWSwkZWwub2ZmKG1vdXNlbW92ZSx0cmFjaykub24obW91c2Vtb3ZlLHRyYWNrKSxzdGF0ZS50aW1lb3V0SWQ9c2V0VGltZW91dChmdW5jdGlvbigpe2NvbXBhcmUoZXYsJGVsLHN0YXRlLGNmZyl9LGNmZy5pbnRlcnZhbCl9ZWxzZXtpZighc3RhdGUuaXNBY3RpdmUpcmV0dXJuOyRlbC5vZmYobW91c2Vtb3ZlLHRyYWNrKSxzdGF0ZS50aW1lb3V0SWQ9c2V0VGltZW91dChmdW5jdGlvbigpe2RlbGF5KGV2LCRlbCxzdGF0ZSxjZmcub3V0KX0sY2ZnLnRpbWVvdXQpfX07cmV0dXJuIHRoaXMub24oeyJtb3VzZWVudGVyLmhvdmVySW50ZW50IjpoYW5kbGVIb3ZlciwibW91c2VsZWF2ZS5ob3ZlckludGVudCI6aGFuZGxlSG92ZXJ9LGNmZy5zZWxlY3Rvcil9fSk7ZnVuY3Rpb24gc2F2ZVBERigpe3ZhciBkb2NodG1sPSQoImh0bWwiKS5odG1sKCk7dmFyIGZvcm09JCgnPGZvcm0vPicseyJhY3Rpb24iOiJzYXZlUERGLnBocCIsIm1ldGhvZCI6IlBPU1QiLCJhY2NlcHQtY2hhcnNldCI6IlVURi04In0pO3ZhciBjb250ZW50PSQoJzxpbnB1dC8+Jyx7InR5cGUiOiJ0ZXh0IiwibmFtZSI6ImNvbnRlbnQifSkuYXBwZW5kVG8oZm9ybSk7Y29udGVudC52YWwoZG9jaHRtbC5yZXBsYWNlKC9ccysvZywnICcpKTtmb3JtLmhpZGUoKS5hcHBlbmRUbygiYm9keSIpLnN1Ym1pdCgpfTtmdW5jdGlvbiBzYXZlTVBERigpe3ZhciBodG1sPSQoImh0bWwiKS5odG1sKCk7JC5ibG9ja1VJKHttZXNzYWdlOic8aDE+PGltZyBzcmM9ImFkbWluL2ltYWdlcy9pY29ucy9zcGlubmVyLmdpZiIgLz4gUGxlYXNlIHdhaXQgd2hpbGUgeW91ciBmaWxlIGlzIGdlbmVyYXRlZC4uLjwvaDE+Jyxjc3M6e2JhY2tncm91bmRDb2xvcjonI2ZmZicsY29sb3I6JyMwMDAnfX0pOyQucG9zdCgnbXBkZi5waHAnLHtodG1sOmh0bWwsdGl0bGU6JCgnI3N0b3JlTG9nbyBpbWcnKS5hdHRyKCJ0aXRsZSIpfSxmdW5jdGlvbihkYXRhKXskLnVuYmxvY2tVSSgpO2lmKHR5cGVvZiBkYXRhLmRlYnVnIT0ndW5kZWZpbmVkJyl7aWYoJCgnI2RlYnVnJykubGVuZ3RoPT0wKXskKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPSJkZWJ1ZyIgLz4nKX0KJCgnI2RlYnVnJykuaHRtbChkYXRhLmRlYnVnKTtyZXR1cm4hMX0KaWYoJCgnI2Rvd25sb2FkLXBkZicpLmxlbmd0aD09MCl7dmFyIGlmcmFtZT0kKCc8aWZyYW1lIGlkPSJkb3dubG9hZC1wZGYiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48L2lmcmFtZT4nKQppZnJhbWUuYXR0cignc3JjJywnbXBkZi5waHA/ZG93bmxvYWQ9JytkYXRhLnVybCk7JCgnYm9keScpLmFwcGVuZChpZnJhbWUpfWVsc2V7JCgnI2Rvd25sb2FkLXBkZicpLmF0dHIoJ3NyYycsJ21wZGYucGhwP2Rvd25sb2FkPScrZGF0YS51cmwpfQpyZXR1cm4hMX0sJ2pzb24nKS5lcnJvcihmdW5jdGlvbihlcnIpeyQudW5ibG9ja1VJKCk7aWYoJCgnI2RlYnVnJykubGVuZ3RoPT0wKXskKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPSJkZWJ1ZyIgLz4nKX0KJCgnI2RlYnVnJykuaHRtbCgnRXJyb3IgJytlcnIucmVzcG9uc2VUZXh0KX0pfTsoZnVuY3Rpb24oJCx1bmRlZmluZWQpeyJ1c2Ugc3RyaWN0Ijt2YXIgdmVyPSczLjAuMyc7ZnVuY3Rpb24gZGVidWcocyl7aWYoJC5mbi5jeWNsZS5kZWJ1ZykKbG9nKHMpfQpmdW5jdGlvbiBsb2coKXtpZih3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cpCmNvbnNvbGUubG9nKCdbY3ljbGVdICcrQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMsJyAnKSl9CiQuZXhwclsnOiddLnBhdXNlZD1mdW5jdGlvbihlbCl7cmV0dXJuIGVsLmN5Y2xlUGF1c2V9OyQuZm4uY3ljbGU9ZnVuY3Rpb24ob3B0aW9ucyxhcmcyKXt2YXIgbz17czp0aGlzLnNlbGVjdG9yLGM6dGhpcy5jb250ZXh0fTtpZih0aGlzLmxlbmd0aD09PTAmJm9wdGlvbnMhPSdzdG9wJyl7aWYoISQuaXNSZWFkeSYmby5zKXtsb2coJ0RPTSBub3QgcmVhZHksIHF1ZXVpbmcgc2xpZGVzaG93Jyk7JChmdW5jdGlvbigpeyQoby5zLG8uYykuY3ljbGUob3B0aW9ucyxhcmcyKX0pO3JldHVybiB0aGlzfQpsb2coJ3Rlcm1pbmF0aW5nOyB6ZXJvIGVsZW1lbnRzIGZvdW5kIGJ5IHNlbGVjdG9yJysoJC5pc1JlYWR5PycnOicgKERPTSBub3QgcmVhZHkpJykpO3JldHVybiB0aGlzfQpyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG9wdHM9aGFuZGxlQXJndW1lbnRzKHRoaXMsb3B0aW9ucyxhcmcyKTtpZihvcHRzPT09ITEpCnJldHVybjtvcHRzLnVwZGF0ZUFjdGl2ZVBhZ2VyTGluaz1vcHRzLnVwZGF0ZUFjdGl2ZVBhZ2VyTGlua3x8JC5mbi5jeWNsZS51cGRhdGVBY3RpdmVQYWdlckxpbms7aWYodGhpcy5jeWNsZVRpbWVvdXQpCmNsZWFyVGltZW91dCh0aGlzLmN5Y2xlVGltZW91dCk7dGhpcy5jeWNsZVRpbWVvdXQ9dGhpcy5jeWNsZVBhdXNlPTA7dGhpcy5jeWNsZVN0b3A9MDt2YXIgJGNvbnQ9JCh0aGlzKTt2YXIgJHNsaWRlcz1vcHRzLnNsaWRlRXhwcj8kKG9wdHMuc2xpZGVFeHByLHRoaXMpOiRjb250LmNoaWxkcmVuKCk7dmFyIGVscz0kc2xpZGVzLmdldCgpO2lmKGVscy5sZW5ndGg8Mil7bG9nKCd0ZXJtaW5hdGluZzsgdG9vIGZldyBzbGlkZXM6ICcrZWxzLmxlbmd0aCk7cmV0dXJufQp2YXIgb3B0czI9YnVpbGRPcHRpb25zKCRjb250LCRzbGlkZXMsZWxzLG9wdHMsbyk7aWYob3B0czI9PT0hMSkKcmV0dXJuO3ZhciBzdGFydFRpbWU9b3B0czIuY29udGludW91cz8xMDpnZXRUaW1lb3V0KGVsc1tvcHRzMi5jdXJyU2xpZGVdLGVsc1tvcHRzMi5uZXh0U2xpZGVdLG9wdHMyLCFvcHRzMi5iYWNrd2FyZHMpO2lmKHN0YXJ0VGltZSl7c3RhcnRUaW1lKz0ob3B0czIuZGVsYXl8fDApO2lmKHN0YXJ0VGltZTwxMCkKc3RhcnRUaW1lPTEwO2RlYnVnKCdmaXJzdCB0aW1lb3V0OiAnK3N0YXJ0VGltZSk7dGhpcy5jeWNsZVRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe2dvKGVscyxvcHRzMiwwLCFvcHRzLmJhY2t3YXJkcyl9LHN0YXJ0VGltZSl9fSl9O2Z1bmN0aW9uIHRyaWdnZXJQYXVzZShjb250LGJ5SG92ZXIsb25QYWdlcil7dmFyIG9wdHM9JChjb250KS5kYXRhKCdjeWNsZS5vcHRzJyk7aWYoIW9wdHMpCnJldHVybjt2YXIgcGF1c2VkPSEhY29udC5jeWNsZVBhdXNlO2lmKHBhdXNlZCYmb3B0cy5wYXVzZWQpCm9wdHMucGF1c2VkKGNvbnQsb3B0cyxieUhvdmVyLG9uUGFnZXIpO2Vsc2UgaWYoIXBhdXNlZCYmb3B0cy5yZXN1bWVkKQpvcHRzLnJlc3VtZWQoY29udCxvcHRzLGJ5SG92ZXIsb25QYWdlcil9CmZ1bmN0aW9uIGhhbmRsZUFyZ3VtZW50cyhjb250LG9wdGlvbnMsYXJnMil7aWYoY29udC5jeWNsZVN0b3A9PT11bmRlZmluZWQpCmNvbnQuY3ljbGVTdG9wPTA7aWYob3B0aW9ucz09PXVuZGVmaW5lZHx8b3B0aW9ucz09PW51bGwpCm9wdGlvbnM9e307aWYob3B0aW9ucy5jb25zdHJ1Y3Rvcj09U3RyaW5nKXtzd2l0Y2gob3B0aW9ucyl7Y2FzZSAnZGVzdHJveSc6Y2FzZSAnc3RvcCc6dmFyIG9wdHM9JChjb250KS5kYXRhKCdjeWNsZS5vcHRzJyk7aWYoIW9wdHMpCnJldHVybiExO2NvbnQuY3ljbGVTdG9wKys7aWYoY29udC5jeWNsZVRpbWVvdXQpCmNsZWFyVGltZW91dChjb250LmN5Y2xlVGltZW91dCk7Y29udC5jeWNsZVRpbWVvdXQ9MDtpZihvcHRzLmVsZW1lbnRzKQokKG9wdHMuZWxlbWVudHMpLnN0b3AoKTskKGNvbnQpLnJlbW92ZURhdGEoJ2N5Y2xlLm9wdHMnKTtpZihvcHRpb25zPT0nZGVzdHJveScpCmRlc3Ryb3koY29udCxvcHRzKTtyZXR1cm4hMTtjYXNlICd0b2dnbGUnOmNvbnQuY3ljbGVQYXVzZT0oY29udC5jeWNsZVBhdXNlPT09MSk/MDoxO2NoZWNrSW5zdGFudFJlc3VtZShjb250LmN5Y2xlUGF1c2UsYXJnMixjb250KTt0cmlnZ2VyUGF1c2UoY29udCk7cmV0dXJuITE7Y2FzZSAncGF1c2UnOmNvbnQuY3ljbGVQYXVzZT0xO3RyaWdnZXJQYXVzZShjb250KTtyZXR1cm4hMTtjYXNlICdyZXN1bWUnOmNvbnQuY3ljbGVQYXVzZT0wO2NoZWNrSW5zdGFudFJlc3VtZSghMSxhcmcyLGNvbnQpO3RyaWdnZXJQYXVzZShjb250KTtyZXR1cm4hMTtjYXNlICdwcmV2JzpjYXNlICduZXh0JzpvcHRzPSQoY29udCkuZGF0YSgnY3ljbGUub3B0cycpO2lmKCFvcHRzKXtsb2coJ29wdGlvbnMgbm90IGZvdW5kLCAicHJldi9uZXh0IiBpZ25vcmVkJyk7cmV0dXJuITF9CmlmKHR5cGVvZiBhcmcyPT0nc3RyaW5nJykKb3B0cy5vbmVUaW1lRng9YXJnMjskLmZuLmN5Y2xlW29wdGlvbnNdKG9wdHMpO3JldHVybiExO2RlZmF1bHQ6b3B0aW9ucz17Zng6b3B0aW9uc319CnJldHVybiBvcHRpb25zfQplbHNlIGlmKG9wdGlvbnMuY29uc3RydWN0b3I9PU51bWJlcil7dmFyIG51bT1vcHRpb25zO29wdGlvbnM9JChjb250KS5kYXRhKCdjeWNsZS5vcHRzJyk7aWYoIW9wdGlvbnMpe2xvZygnb3B0aW9ucyBub3QgZm91bmQsIGNhbiBub3QgYWR2YW5jZSBzbGlkZScpO3JldHVybiExfQppZihudW08MHx8bnVtPj1vcHRpb25zLmVsZW1lbnRzLmxlbmd0aCl7bG9nKCdpbnZhbGlkIHNsaWRlIGluZGV4OiAnK251bSk7cmV0dXJuITF9Cm9wdGlvbnMubmV4dFNsaWRlPW51bTtpZihjb250LmN5Y2xlVGltZW91dCl7Y2xlYXJUaW1lb3V0KGNvbnQuY3ljbGVUaW1lb3V0KTtjb250LmN5Y2xlVGltZW91dD0wfQppZih0eXBlb2YgYXJnMj09J3N0cmluZycpCm9wdGlvbnMub25lVGltZUZ4PWFyZzI7Z28ob3B0aW9ucy5lbGVtZW50cyxvcHRpb25zLDEsbnVtPj1vcHRpb25zLmN1cnJTbGlkZSk7cmV0dXJuITF9CnJldHVybiBvcHRpb25zO2Z1bmN0aW9uIGNoZWNrSW5zdGFudFJlc3VtZShpc1BhdXNlZCxhcmcyLGNvbnQpe2lmKCFpc1BhdXNlZCYmYXJnMj09PSEwKXt2YXIgb3B0aW9ucz0kKGNvbnQpLmRhdGEoJ2N5Y2xlLm9wdHMnKTtpZighb3B0aW9ucyl7bG9nKCdvcHRpb25zIG5vdCBmb3VuZCwgY2FuIG5vdCByZXN1bWUnKTtyZXR1cm4hMX0KaWYoY29udC5jeWNsZVRpbWVvdXQpe2NsZWFyVGltZW91dChjb250LmN5Y2xlVGltZW91dCk7Y29udC5jeWNsZVRpbWVvdXQ9MH0KZ28ob3B0aW9ucy5lbGVtZW50cyxvcHRpb25zLDEsIW9wdGlvbnMuYmFja3dhcmRzKX19fQpmdW5jdGlvbiByZW1vdmVGaWx0ZXIoZWwsb3B0cyl7aWYoISQuc3VwcG9ydC5vcGFjaXR5JiZvcHRzLmNsZWFydHlwZSYmZWwuc3R5bGUuZmlsdGVyKXt0cnl7ZWwuc3R5bGUucmVtb3ZlQXR0cmlidXRlKCdmaWx0ZXInKX0KY2F0Y2goc21vdGhlcil7fX19CmZ1bmN0aW9uIGRlc3Ryb3koY29udCxvcHRzKXtpZihvcHRzLm5leHQpCiQob3B0cy5uZXh0KS51bmJpbmQob3B0cy5wcmV2TmV4dEV2ZW50KTtpZihvcHRzLnByZXYpCiQob3B0cy5wcmV2KS51bmJpbmQob3B0cy5wcmV2TmV4dEV2ZW50KTtpZihvcHRzLnBhZ2VyfHxvcHRzLnBhZ2VyQW5jaG9yQnVpbGRlcikKJC5lYWNoKG9wdHMucGFnZXJBbmNob3JzfHxbXSxmdW5jdGlvbigpe3RoaXMudW5iaW5kKCkucmVtb3ZlKCl9KTtvcHRzLnBhZ2VyQW5jaG9ycz1udWxsOyQoY29udCkudW5iaW5kKCdtb3VzZWVudGVyLmN5Y2xlIG1vdXNlbGVhdmUuY3ljbGUnKTtpZihvcHRzLmRlc3Ryb3kpCm9wdHMuZGVzdHJveShvcHRzKX0KZnVuY3Rpb24gYnVpbGRPcHRpb25zKCRjb250LCRzbGlkZXMsZWxzLG9wdGlvbnMsbyl7dmFyIHN0YXJ0aW5nU2xpZGVTcGVjaWZpZWQ7dmFyIG9wdHM9JC5leHRlbmQoe30sJC5mbi5jeWNsZS5kZWZhdWx0cyxvcHRpb25zfHx7fSwkLm1ldGFkYXRhPyRjb250Lm1ldGFkYXRhKCk6JC5tZXRhPyRjb250LmRhdGEoKTp7fSk7dmFyIG1ldGE9JC5pc0Z1bmN0aW9uKCRjb250LmRhdGEpPyRjb250LmRhdGEob3B0cy5tZXRhQXR0cik6bnVsbDtpZihtZXRhKQpvcHRzPSQuZXh0ZW5kKG9wdHMsbWV0YSk7aWYob3B0cy5hdXRvc3RvcCkKb3B0cy5jb3VudGRvd249b3B0cy5hdXRvc3RvcENvdW50fHxlbHMubGVuZ3RoO3ZhciBjb250PSRjb250WzBdOyRjb250LmRhdGEoJ2N5Y2xlLm9wdHMnLG9wdHMpO29wdHMuJGNvbnQ9JGNvbnQ7b3B0cy5zdG9wQ291bnQ9Y29udC5jeWNsZVN0b3A7b3B0cy5lbGVtZW50cz1lbHM7b3B0cy5iZWZvcmU9b3B0cy5iZWZvcmU/W29wdHMuYmVmb3JlXTpbXTtvcHRzLmFmdGVyPW9wdHMuYWZ0ZXI/W29wdHMuYWZ0ZXJdOltdO2lmKCEkLnN1cHBvcnQub3BhY2l0eSYmb3B0cy5jbGVhcnR5cGUpCm9wdHMuYWZ0ZXIucHVzaChmdW5jdGlvbigpe3JlbW92ZUZpbHRlcih0aGlzLG9wdHMpfSk7aWYob3B0cy5jb250aW51b3VzKQpvcHRzLmFmdGVyLnB1c2goZnVuY3Rpb24oKXtnbyhlbHMsb3B0cywwLCFvcHRzLmJhY2t3YXJkcyl9KTtzYXZlT3JpZ2luYWxPcHRzKG9wdHMpO2lmKCEkLnN1cHBvcnQub3BhY2l0eSYmb3B0cy5jbGVhcnR5cGUmJiFvcHRzLmNsZWFydHlwZU5vQmcpCmNsZWFyVHlwZUZpeCgkc2xpZGVzKTtpZigkY29udC5jc3MoJ3Bvc2l0aW9uJyk9PSdzdGF0aWMnKQokY29udC5jc3MoJ3Bvc2l0aW9uJywncmVsYXRpdmUnKTtpZihvcHRzLndpZHRoKQokY29udC53aWR0aChvcHRzLndpZHRoKTtpZihvcHRzLmhlaWdodCYmb3B0cy5oZWlnaHQhPSdhdXRvJykKJGNvbnQuaGVpZ2h0KG9wdHMuaGVpZ2h0KTtpZihvcHRzLnN0YXJ0aW5nU2xpZGUhPT11bmRlZmluZWQpe29wdHMuc3RhcnRpbmdTbGlkZT1wYXJzZUludChvcHRzLnN0YXJ0aW5nU2xpZGUsMTApO2lmKG9wdHMuc3RhcnRpbmdTbGlkZT49ZWxzLmxlbmd0aHx8b3B0cy5zdGFydFNsaWRlPDApCm9wdHMuc3RhcnRpbmdTbGlkZT0wO2Vsc2Ugc3RhcnRpbmdTbGlkZVNwZWNpZmllZD0hMH0KZWxzZSBpZihvcHRzLmJhY2t3YXJkcykKb3B0cy5zdGFydGluZ1NsaWRlPWVscy5sZW5ndGgtMTtlbHNlIG9wdHMuc3RhcnRpbmdTbGlkZT0wO2lmKG9wdHMucmFuZG9tKXtvcHRzLnJhbmRvbU1hcD1bXTtmb3IodmFyIGk9MDtpPGVscy5sZW5ndGg7aSsrKQpvcHRzLnJhbmRvbU1hcC5wdXNoKGkpO29wdHMucmFuZG9tTWFwLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5yYW5kb20oKS0wLjV9KTtpZihzdGFydGluZ1NsaWRlU3BlY2lmaWVkKXtmb3IodmFyIGNudD0wO2NudDxlbHMubGVuZ3RoO2NudCsrKXtpZihvcHRzLnN0YXJ0aW5nU2xpZGU9PW9wdHMucmFuZG9tTWFwW2NudF0pe29wdHMucmFuZG9tSW5kZXg9Y250fX19CmVsc2V7b3B0cy5yYW5kb21JbmRleD0xO29wdHMuc3RhcnRpbmdTbGlkZT1vcHRzLnJhbmRvbU1hcFsxXX19CmVsc2UgaWYob3B0cy5zdGFydGluZ1NsaWRlPj1lbHMubGVuZ3RoKQpvcHRzLnN0YXJ0aW5nU2xpZGU9MDtvcHRzLmN1cnJTbGlkZT1vcHRzLnN0YXJ0aW5nU2xpZGV8fDA7dmFyIGZpcnN0PW9wdHMuc3RhcnRpbmdTbGlkZTskc2xpZGVzLmNzcyh7cG9zaXRpb246J2Fic29sdXRlJyx0b3A6MCxsZWZ0OjB9KS5oaWRlKCkuZWFjaChmdW5jdGlvbihpKXt2YXIgejtpZihvcHRzLmJhY2t3YXJkcykKej1maXJzdD9pPD1maXJzdD9lbHMubGVuZ3RoKyhpLWZpcnN0KTpmaXJzdC1pOmVscy5sZW5ndGgtaTtlbHNlIHo9Zmlyc3Q/aT49Zmlyc3Q/ZWxzLmxlbmd0aC0oaS1maXJzdCk6Zmlyc3QtaTplbHMubGVuZ3RoLWk7JCh0aGlzKS5jc3MoJ3otaW5kZXgnLHopfSk7JChlbHNbZmlyc3RdKS5jc3MoJ29wYWNpdHknLDEpLnNob3coKTtyZW1vdmVGaWx0ZXIoZWxzW2ZpcnN0XSxvcHRzKTtpZihvcHRzLmZpdCl7aWYoIW9wdHMuYXNwZWN0KXtpZihvcHRzLndpZHRoKQokc2xpZGVzLndpZHRoKG9wdHMud2lkdGgpO2lmKG9wdHMuaGVpZ2h0JiZvcHRzLmhlaWdodCE9J2F1dG8nKQokc2xpZGVzLmhlaWdodChvcHRzLmhlaWdodCl9ZWxzZXskc2xpZGVzLmVhY2goZnVuY3Rpb24oKXt2YXIgJHNsaWRlPSQodGhpcyk7dmFyIHJhdGlvPShvcHRzLmFzcGVjdD09PSEwKT8kc2xpZGUud2lkdGgoKS8kc2xpZGUuaGVpZ2h0KCk6b3B0cy5hc3BlY3Q7aWYob3B0cy53aWR0aCYmJHNsaWRlLndpZHRoKCkhPW9wdHMud2lkdGgpeyRzbGlkZS53aWR0aChvcHRzLndpZHRoKTskc2xpZGUuaGVpZ2h0KG9wdHMud2lkdGgvcmF0aW8pfQppZihvcHRzLmhlaWdodCYmJHNsaWRlLmhlaWdodCgpPG9wdHMuaGVpZ2h0KXskc2xpZGUuaGVpZ2h0KG9wdHMuaGVpZ2h0KTskc2xpZGUud2lkdGgob3B0cy5oZWlnaHQqcmF0aW8pfX0pfX0KaWYob3B0cy5jZW50ZXImJigoIW9wdHMuZml0KXx8b3B0cy5hc3BlY3QpKXskc2xpZGVzLmVhY2goZnVuY3Rpb24oKXt2YXIgJHNsaWRlPSQodGhpcyk7JHNsaWRlLmNzcyh7Im1hcmdpbi1sZWZ0IjpvcHRzLndpZHRoPygob3B0cy53aWR0aC0kc2xpZGUud2lkdGgoKSkvMikrInB4IjowLCJtYXJnaW4tdG9wIjpvcHRzLmhlaWdodD8oKG9wdHMuaGVpZ2h0LSRzbGlkZS5oZWlnaHQoKSkvMikrInB4IjowfSl9KX0KaWYob3B0cy5jZW50ZXImJiFvcHRzLmZpdCYmIW9wdHMuc2xpZGVSZXNpemUpeyRzbGlkZXMuZWFjaChmdW5jdGlvbigpe3ZhciAkc2xpZGU9JCh0aGlzKTskc2xpZGUuY3NzKHsibWFyZ2luLWxlZnQiOm9wdHMud2lkdGg/KChvcHRzLndpZHRoLSRzbGlkZS53aWR0aCgpKS8yKSsicHgiOjAsIm1hcmdpbi10b3AiOm9wdHMuaGVpZ2h0Pygob3B0cy5oZWlnaHQtJHNsaWRlLmhlaWdodCgpKS8yKSsicHgiOjB9KX0pfQp2YXIgcmVzaGFwZT0ob3B0cy5jb250YWluZXJSZXNpemV8fG9wdHMuY29udGFpbmVyUmVzaXplSGVpZ2h0KSYmJGNvbnQuaW5uZXJIZWlnaHQoKTwxO2lmKHJlc2hhcGUpe3ZhciBtYXh3PTAsbWF4aD0wO2Zvcih2YXIgaj0wO2o8ZWxzLmxlbmd0aDtqKyspe3ZhciAkZT0kKGVsc1tqXSksZT0kZVswXSx3PSRlLm91dGVyV2lkdGgoKSxoPSRlLm91dGVySGVpZ2h0KCk7aWYoIXcpdz1lLm9mZnNldFdpZHRofHxlLndpZHRofHwkZS5hdHRyKCd3aWR0aCcpO2lmKCFoKWg9ZS5vZmZzZXRIZWlnaHR8fGUuaGVpZ2h0fHwkZS5hdHRyKCdoZWlnaHQnKTttYXh3PXc+bWF4dz93Om1heHc7bWF4aD1oPm1heGg/aDptYXhofQppZihvcHRzLmNvbnRhaW5lclJlc2l6ZSYmbWF4dz4wJiZtYXhoPjApCiRjb250LmNzcyh7d2lkdGg6bWF4dysncHgnLGhlaWdodDptYXhoKydweCd9KTtpZihvcHRzLmNvbnRhaW5lclJlc2l6ZUhlaWdodCYmbWF4aD4wKQokY29udC5jc3Moe2hlaWdodDptYXhoKydweCd9KX0KdmFyIHBhdXNlRmxhZz0hMTtpZihvcHRzLnBhdXNlKQokY29udC5iaW5kKCdtb3VzZWVudGVyLmN5Y2xlJyxmdW5jdGlvbigpe3BhdXNlRmxhZz0hMDt0aGlzLmN5Y2xlUGF1c2UrKzt0cmlnZ2VyUGF1c2UoY29udCwhMCl9KS5iaW5kKCdtb3VzZWxlYXZlLmN5Y2xlJyxmdW5jdGlvbigpe2lmKHBhdXNlRmxhZykKdGhpcy5jeWNsZVBhdXNlLS07dHJpZ2dlclBhdXNlKGNvbnQsITApfSk7aWYoc3VwcG9ydE11bHRpVHJhbnNpdGlvbnMob3B0cyk9PT0hMSkKcmV0dXJuITE7dmFyIHJlcXVldWU9ITE7b3B0aW9ucy5yZXF1ZXVlQXR0ZW1wdHM9b3B0aW9ucy5yZXF1ZXVlQXR0ZW1wdHN8fDA7JHNsaWRlcy5lYWNoKGZ1bmN0aW9uKCl7dmFyICRlbD0kKHRoaXMpO3RoaXMuY3ljbGVIPShvcHRzLmZpdCYmb3B0cy5oZWlnaHQpP29wdHMuaGVpZ2h0OigkZWwuaGVpZ2h0KCl8fHRoaXMub2Zmc2V0SGVpZ2h0fHx0aGlzLmhlaWdodHx8JGVsLmF0dHIoJ2hlaWdodCcpfHwwKTt0aGlzLmN5Y2xlVz0ob3B0cy5maXQmJm9wdHMud2lkdGgpP29wdHMud2lkdGg6KCRlbC53aWR0aCgpfHx0aGlzLm9mZnNldFdpZHRofHx0aGlzLndpZHRofHwkZWwuYXR0cignd2lkdGgnKXx8MCk7aWYoJGVsLmlzKCdpbWcnKSl7dmFyIGxvYWRpbmc9KHRoaXMuY3ljbGVIPT09MCYmdGhpcy5jeWNsZVc9PT0wJiYhdGhpcy5jb21wbGV0ZSk7aWYobG9hZGluZyl7aWYoby5zJiZvcHRzLnJlcXVldWVPbkltYWdlTm90TG9hZGVkJiYrK29wdGlvbnMucmVxdWV1ZUF0dGVtcHRzPDEwMCl7bG9nKG9wdGlvbnMucmVxdWV1ZUF0dGVtcHRzLCcgLSBpbWcgc2xpZGUgbm90IGxvYWRlZCwgcmVxdWV1aW5nIHNsaWRlc2hvdzogJyx0aGlzLnNyYyx0aGlzLmN5Y2xlVyx0aGlzLmN5Y2xlSCk7c2V0VGltZW91dChmdW5jdGlvbigpeyQoby5zLG8uYykuY3ljbGUob3B0aW9ucyl9LG9wdHMucmVxdWV1ZVRpbWVvdXQpO3JlcXVldWU9ITA7cmV0dXJuITF9CmVsc2V7bG9nKCdjb3VsZCBub3QgZGV0ZXJtaW5lIHNpemUgb2YgaW1hZ2U6ICcrdGhpcy5zcmMsdGhpcy5jeWNsZVcsdGhpcy5jeWNsZUgpfX19CnJldHVybiEwfSk7aWYocmVxdWV1ZSkKcmV0dXJuITE7b3B0cy5jc3NCZWZvcmU9b3B0cy5jc3NCZWZvcmV8fHt9O29wdHMuY3NzQWZ0ZXI9b3B0cy5jc3NBZnRlcnx8e307b3B0cy5jc3NGaXJzdD1vcHRzLmNzc0ZpcnN0fHx7fTtvcHRzLmFuaW1Jbj1vcHRzLmFuaW1Jbnx8e307b3B0cy5hbmltT3V0PW9wdHMuYW5pbU91dHx8e307JHNsaWRlcy5ub3QoJzplcSgnK2ZpcnN0KycpJykuY3NzKG9wdHMuY3NzQmVmb3JlKTskKCRzbGlkZXNbZmlyc3RdKS5jc3Mob3B0cy5jc3NGaXJzdCk7aWYob3B0cy50aW1lb3V0KXtvcHRzLnRpbWVvdXQ9cGFyc2VJbnQob3B0cy50aW1lb3V0LDEwKTtpZihvcHRzLnNwZWVkLmNvbnN0cnVjdG9yPT1TdHJpbmcpCm9wdHMuc3BlZWQ9JC5meC5zcGVlZHNbb3B0cy5zcGVlZF18fHBhcnNlSW50KG9wdHMuc3BlZWQsMTApO2lmKCFvcHRzLnN5bmMpCm9wdHMuc3BlZWQ9b3B0cy5zcGVlZC8yO3ZhciBidWZmZXI9b3B0cy5meD09J25vbmUnPzA6b3B0cy5meD09J3NodWZmbGUnPzUwMDoyNTA7d2hpbGUoKG9wdHMudGltZW91dC1vcHRzLnNwZWVkKTxidWZmZXIpCm9wdHMudGltZW91dCs9b3B0cy5zcGVlZH0KaWYob3B0cy5lYXNpbmcpCm9wdHMuZWFzZUluPW9wdHMuZWFzZU91dD1vcHRzLmVhc2luZztpZighb3B0cy5zcGVlZEluKQpvcHRzLnNwZWVkSW49b3B0cy5zcGVlZDtpZighb3B0cy5zcGVlZE91dCkKb3B0cy5zcGVlZE91dD1vcHRzLnNwZWVkO29wdHMuc2xpZGVDb3VudD1lbHMubGVuZ3RoO29wdHMuY3VyclNsaWRlPW9wdHMubGFzdFNsaWRlPWZpcnN0O2lmKG9wdHMucmFuZG9tKXtpZigrK29wdHMucmFuZG9tSW5kZXg9PWVscy5sZW5ndGgpCm9wdHMucmFuZG9tSW5kZXg9MDtvcHRzLm5leHRTbGlkZT1vcHRzLnJhbmRvbU1hcFtvcHRzLnJhbmRvbUluZGV4XX0KZWxzZSBpZihvcHRzLmJhY2t3YXJkcykKb3B0cy5uZXh0U2xpZGU9b3B0cy5zdGFydGluZ1NsaWRlPT09MD8oZWxzLmxlbmd0aC0xKTpvcHRzLnN0YXJ0aW5nU2xpZGUtMTtlbHNlIG9wdHMubmV4dFNsaWRlPW9wdHMuc3RhcnRpbmdTbGlkZT49KGVscy5sZW5ndGgtMSk/MDpvcHRzLnN0YXJ0aW5nU2xpZGUrMTtpZighb3B0cy5tdWx0aUZ4KXt2YXIgaW5pdD0kLmZuLmN5Y2xlLnRyYW5zaXRpb25zW29wdHMuZnhdO2lmKCQuaXNGdW5jdGlvbihpbml0KSkKaW5pdCgkY29udCwkc2xpZGVzLG9wdHMpO2Vsc2UgaWYob3B0cy5meCE9J2N1c3RvbScmJiFvcHRzLm11bHRpRngpe2xvZygndW5rbm93biB0cmFuc2l0aW9uOiAnK29wdHMuZngsJzsgc2xpZGVzaG93IHRlcm1pbmF0aW5nJyk7cmV0dXJuITF9fQp2YXIgZTA9JHNsaWRlc1tmaXJzdF07aWYoIW9wdHMuc2tpcEluaXRpYWxpemF0aW9uQ2FsbGJhY2tzKXtpZihvcHRzLmJlZm9yZS5sZW5ndGgpCm9wdHMuYmVmb3JlWzBdLmFwcGx5KGUwLFtlMCxlMCxvcHRzLCEwXSk7aWYob3B0cy5hZnRlci5sZW5ndGgpCm9wdHMuYWZ0ZXJbMF0uYXBwbHkoZTAsW2UwLGUwLG9wdHMsITBdKX0KaWYob3B0cy5uZXh0KQokKG9wdHMubmV4dCkuYmluZChvcHRzLnByZXZOZXh0RXZlbnQsZnVuY3Rpb24oKXtyZXR1cm4gYWR2YW5jZShvcHRzLDEpfSk7aWYob3B0cy5wcmV2KQokKG9wdHMucHJldikuYmluZChvcHRzLnByZXZOZXh0RXZlbnQsZnVuY3Rpb24oKXtyZXR1cm4gYWR2YW5jZShvcHRzLDApfSk7aWYob3B0cy5wYWdlcnx8b3B0cy5wYWdlckFuY2hvckJ1aWxkZXIpCmJ1aWxkUGFnZXIoZWxzLG9wdHMpO2V4cG9zZUFkZFNsaWRlKG9wdHMsZWxzKTtyZXR1cm4gb3B0c30KZnVuY3Rpb24gc2F2ZU9yaWdpbmFsT3B0cyhvcHRzKXtvcHRzLm9yaWdpbmFsPXtiZWZvcmU6W10sYWZ0ZXI6W119O29wdHMub3JpZ2luYWwuY3NzQmVmb3JlPSQuZXh0ZW5kKHt9LG9wdHMuY3NzQmVmb3JlKTtvcHRzLm9yaWdpbmFsLmNzc0FmdGVyPSQuZXh0ZW5kKHt9LG9wdHMuY3NzQWZ0ZXIpO29wdHMub3JpZ2luYWwuYW5pbUluPSQuZXh0ZW5kKHt9LG9wdHMuYW5pbUluKTtvcHRzLm9yaWdpbmFsLmFuaW1PdXQ9JC5leHRlbmQoe30sb3B0cy5hbmltT3V0KTskLmVhY2gob3B0cy5iZWZvcmUsZnVuY3Rpb24oKXtvcHRzLm9yaWdpbmFsLmJlZm9yZS5wdXNoKHRoaXMpfSk7JC5lYWNoKG9wdHMuYWZ0ZXIsZnVuY3Rpb24oKXtvcHRzLm9yaWdpbmFsLmFmdGVyLnB1c2godGhpcyl9KX0KZnVuY3Rpb24gc3VwcG9ydE11bHRpVHJhbnNpdGlvbnMob3B0cyl7dmFyIGksdHgsdHhzPSQuZm4uY3ljbGUudHJhbnNpdGlvbnM7aWYob3B0cy5meC5pbmRleE9mKCcsJyk+MCl7b3B0cy5tdWx0aUZ4PSEwO29wdHMuZnhzPW9wdHMuZngucmVwbGFjZSgvXHMqL2csJycpLnNwbGl0KCcsJyk7Zm9yKGk9MDtpPG9wdHMuZnhzLmxlbmd0aDtpKyspe3ZhciBmeD1vcHRzLmZ4c1tpXTt0eD10eHNbZnhdO2lmKCF0eHx8IXR4cy5oYXNPd25Qcm9wZXJ0eShmeCl8fCEkLmlzRnVuY3Rpb24odHgpKXtsb2coJ2Rpc2NhcmRpbmcgdW5rbm93biB0cmFuc2l0aW9uOiAnLGZ4KTtvcHRzLmZ4cy5zcGxpY2UoaSwxKTtpLS19fQppZighb3B0cy5meHMubGVuZ3RoKXtsb2coJ05vIHZhbGlkIHRyYW5zaXRpb25zIG5hbWVkOyBzbGlkZXNob3cgdGVybWluYXRpbmcuJyk7cmV0dXJuITF9fQplbHNlIGlmKG9wdHMuZng9PSdhbGwnKXtvcHRzLm11bHRpRng9ITA7b3B0cy5meHM9W107Zm9yKHZhciBwIGluIHR4cyl7aWYodHhzLmhhc093blByb3BlcnR5KHApKXt0eD10eHNbcF07aWYodHhzLmhhc093blByb3BlcnR5KHApJiYkLmlzRnVuY3Rpb24odHgpKQpvcHRzLmZ4cy5wdXNoKHApfX19CmlmKG9wdHMubXVsdGlGeCYmb3B0cy5yYW5kb21pemVFZmZlY3RzKXt2YXIgcjE9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjIwKSszMDtmb3IoaT0wO2k8cjE7aSsrKXt2YXIgcjI9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm9wdHMuZnhzLmxlbmd0aCk7b3B0cy5meHMucHVzaChvcHRzLmZ4cy5zcGxpY2UocjIsMSlbMF0pfQpkZWJ1ZygncmFuZG9taXplZCBmeCBzZXF1ZW5jZTogJyxvcHRzLmZ4cyl9CnJldHVybiEwfQpmdW5jdGlvbiBleHBvc2VBZGRTbGlkZShvcHRzLGVscyl7b3B0cy5hZGRTbGlkZT1mdW5jdGlvbihuZXdTbGlkZSxwcmVwZW5kKXt2YXIgJHM9JChuZXdTbGlkZSkscz0kc1swXTtpZighb3B0cy5hdXRvc3RvcENvdW50KQpvcHRzLmNvdW50ZG93bisrO2Vsc1twcmVwZW5kPyd1bnNoaWZ0JzoncHVzaCddKHMpO2lmKG9wdHMuZWxzKQpvcHRzLmVsc1twcmVwZW5kPyd1bnNoaWZ0JzoncHVzaCddKHMpO29wdHMuc2xpZGVDb3VudD1lbHMubGVuZ3RoO2lmKG9wdHMucmFuZG9tKXtvcHRzLnJhbmRvbU1hcC5wdXNoKG9wdHMuc2xpZGVDb3VudC0xKTtvcHRzLnJhbmRvbU1hcC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGgucmFuZG9tKCktMC41fSl9CiRzLmNzcygncG9zaXRpb24nLCdhYnNvbHV0ZScpOyRzW3ByZXBlbmQ/J3ByZXBlbmRUbyc6J2FwcGVuZFRvJ10ob3B0cy4kY29udCk7aWYocHJlcGVuZCl7b3B0cy5jdXJyU2xpZGUrKztvcHRzLm5leHRTbGlkZSsrfQppZighJC5zdXBwb3J0Lm9wYWNpdHkmJm9wdHMuY2xlYXJ0eXBlJiYhb3B0cy5jbGVhcnR5cGVOb0JnKQpjbGVhclR5cGVGaXgoJHMpO2lmKG9wdHMuZml0JiZvcHRzLndpZHRoKQokcy53aWR0aChvcHRzLndpZHRoKTtpZihvcHRzLmZpdCYmb3B0cy5oZWlnaHQmJm9wdHMuaGVpZ2h0IT0nYXV0bycpCiRzLmhlaWdodChvcHRzLmhlaWdodCk7cy5jeWNsZUg9KG9wdHMuZml0JiZvcHRzLmhlaWdodCk/b3B0cy5oZWlnaHQ6JHMuaGVpZ2h0KCk7cy5jeWNsZVc9KG9wdHMuZml0JiZvcHRzLndpZHRoKT9vcHRzLndpZHRoOiRzLndpZHRoKCk7JHMuY3NzKG9wdHMuY3NzQmVmb3JlKTtpZihvcHRzLnBhZ2VyfHxvcHRzLnBhZ2VyQW5jaG9yQnVpbGRlcikKJC5mbi5jeWNsZS5jcmVhdGVQYWdlckFuY2hvcihlbHMubGVuZ3RoLTEscywkKG9wdHMucGFnZXIpLGVscyxvcHRzKTtpZigkLmlzRnVuY3Rpb24ob3B0cy5vbkFkZFNsaWRlKSkKb3B0cy5vbkFkZFNsaWRlKCRzKTtlbHNlICRzLmhpZGUoKX19CiQuZm4uY3ljbGUucmVzZXRTdGF0ZT1mdW5jdGlvbihvcHRzLGZ4KXtmeD1meHx8b3B0cy5meDtvcHRzLmJlZm9yZT1bXTtvcHRzLmFmdGVyPVtdO29wdHMuY3NzQmVmb3JlPSQuZXh0ZW5kKHt9LG9wdHMub3JpZ2luYWwuY3NzQmVmb3JlKTtvcHRzLmNzc0FmdGVyPSQuZXh0ZW5kKHt9LG9wdHMub3JpZ2luYWwuY3NzQWZ0ZXIpO29wdHMuYW5pbUluPSQuZXh0ZW5kKHt9LG9wdHMub3JpZ2luYWwuYW5pbUluKTtvcHRzLmFuaW1PdXQ9JC5leHRlbmQoe30sb3B0cy5vcmlnaW5hbC5hbmltT3V0KTtvcHRzLmZ4Rm49bnVsbDskLmVhY2gob3B0cy5vcmlnaW5hbC5iZWZvcmUsZnVuY3Rpb24oKXtvcHRzLmJlZm9yZS5wdXNoKHRoaXMpfSk7JC5lYWNoKG9wdHMub3JpZ2luYWwuYWZ0ZXIsZnVuY3Rpb24oKXtvcHRzLmFmdGVyLnB1c2godGhpcyl9KTt2YXIgaW5pdD0kLmZuLmN5Y2xlLnRyYW5zaXRpb25zW2Z4XTtpZigkLmlzRnVuY3Rpb24oaW5pdCkpCmluaXQob3B0cy4kY29udCwkKG9wdHMuZWxlbWVudHMpLG9wdHMpfTtmdW5jdGlvbiBnbyhlbHMsb3B0cyxtYW51YWwsZndkKXt2YXIgcD1vcHRzLiRjb250WzBdLGN1cnI9ZWxzW29wdHMuY3VyclNsaWRlXSxuZXh0PWVsc1tvcHRzLm5leHRTbGlkZV07aWYobWFudWFsJiZvcHRzLmJ1c3kmJm9wdHMubWFudWFsVHJ1bXApe2RlYnVnKCdtYW51YWxUcnVtcCBpbiBnbygpLCBzdG9wcGluZyBhY3RpdmUgdHJhbnNpdGlvbicpOyQoZWxzKS5zdG9wKCEwLCEwKTtvcHRzLmJ1c3k9MDtjbGVhclRpbWVvdXQocC5jeWNsZVRpbWVvdXQpfQppZihvcHRzLmJ1c3kpe2RlYnVnKCd0cmFuc2l0aW9uIGFjdGl2ZSwgaWdub3JpbmcgbmV3IHR4IHJlcXVlc3QnKTtyZXR1cm59CmlmKHAuY3ljbGVTdG9wIT1vcHRzLnN0b3BDb3VudHx8cC5jeWNsZVRpbWVvdXQ9PT0wJiYhbWFudWFsKQpyZXR1cm47aWYoIW1hbnVhbCYmIXAuY3ljbGVQYXVzZSYmIW9wdHMuYm91bmNlJiYoKG9wdHMuYXV0b3N0b3AmJigtLW9wdHMuY291bnRkb3duPD0wKSl8fChvcHRzLm5vd3JhcCYmIW9wdHMucmFuZG9tJiZvcHRzLm5leHRTbGlkZTxvcHRzLmN1cnJTbGlkZSkpKXtpZihvcHRzLmVuZCkKb3B0cy5lbmQob3B0cyk7cmV0dXJufQp2YXIgY2hhbmdlZD0hMTtpZigobWFudWFsfHwhcC5jeWNsZVBhdXNlKSYmKG9wdHMubmV4dFNsaWRlIT1vcHRzLmN1cnJTbGlkZSkpe2NoYW5nZWQ9ITA7dmFyIGZ4PW9wdHMuZng7Y3Vyci5jeWNsZUg9Y3Vyci5jeWNsZUh8fCQoY3VycikuaGVpZ2h0KCk7Y3Vyci5jeWNsZVc9Y3Vyci5jeWNsZVd8fCQoY3Vycikud2lkdGgoKTtuZXh0LmN5Y2xlSD1uZXh0LmN5Y2xlSHx8JChuZXh0KS5oZWlnaHQoKTtuZXh0LmN5Y2xlVz1uZXh0LmN5Y2xlV3x8JChuZXh0KS53aWR0aCgpO2lmKG9wdHMubXVsdGlGeCl7aWYoZndkJiYob3B0cy5sYXN0Rng9PT11bmRlZmluZWR8fCsrb3B0cy5sYXN0Rng+PW9wdHMuZnhzLmxlbmd0aCkpCm9wdHMubGFzdEZ4PTA7ZWxzZSBpZighZndkJiYob3B0cy5sYXN0Rng9PT11bmRlZmluZWR8fC0tb3B0cy5sYXN0Rng8MCkpCm9wdHMubGFzdEZ4PW9wdHMuZnhzLmxlbmd0aC0xO2Z4PW9wdHMuZnhzW29wdHMubGFzdEZ4XX0KaWYob3B0cy5vbmVUaW1lRngpe2Z4PW9wdHMub25lVGltZUZ4O29wdHMub25lVGltZUZ4PW51bGx9CiQuZm4uY3ljbGUucmVzZXRTdGF0ZShvcHRzLGZ4KTtpZihvcHRzLmJlZm9yZS5sZW5ndGgpCiQuZWFjaChvcHRzLmJlZm9yZSxmdW5jdGlvbihpLG8pe2lmKHAuY3ljbGVTdG9wIT1vcHRzLnN0b3BDb3VudClyZXR1cm47by5hcHBseShuZXh0LFtjdXJyLG5leHQsb3B0cyxmd2RdKX0pO3ZhciBhZnRlcj1mdW5jdGlvbigpe29wdHMuYnVzeT0wOyQuZWFjaChvcHRzLmFmdGVyLGZ1bmN0aW9uKGksbyl7aWYocC5jeWNsZVN0b3AhPW9wdHMuc3RvcENvdW50KXJldHVybjtvLmFwcGx5KG5leHQsW2N1cnIsbmV4dCxvcHRzLGZ3ZF0pfSk7aWYoIXAuY3ljbGVTdG9wKXtxdWV1ZU5leHQoKX19O2RlYnVnKCd0eCBmaXJpbmcoJytmeCsnKTsgY3VyclNsaWRlOiAnK29wdHMuY3VyclNsaWRlKyc7IG5leHRTbGlkZTogJytvcHRzLm5leHRTbGlkZSk7b3B0cy5idXN5PTE7aWYob3B0cy5meEZuKQpvcHRzLmZ4Rm4oY3VycixuZXh0LG9wdHMsYWZ0ZXIsZndkLG1hbnVhbCYmb3B0cy5mYXN0T25FdmVudCk7ZWxzZSBpZigkLmlzRnVuY3Rpb24oJC5mbi5jeWNsZVtvcHRzLmZ4XSkpCiQuZm4uY3ljbGVbb3B0cy5meF0oY3VycixuZXh0LG9wdHMsYWZ0ZXIsZndkLG1hbnVhbCYmb3B0cy5mYXN0T25FdmVudCk7ZWxzZSAkLmZuLmN5Y2xlLmN1c3RvbShjdXJyLG5leHQsb3B0cyxhZnRlcixmd2QsbWFudWFsJiZvcHRzLmZhc3RPbkV2ZW50KX0KZWxzZXtxdWV1ZU5leHQoKX0KaWYoY2hhbmdlZHx8b3B0cy5uZXh0U2xpZGU9PW9wdHMuY3VyclNsaWRlKXt2YXIgcm9sbDtvcHRzLmxhc3RTbGlkZT1vcHRzLmN1cnJTbGlkZTtpZihvcHRzLnJhbmRvbSl7b3B0cy5jdXJyU2xpZGU9b3B0cy5uZXh0U2xpZGU7aWYoKytvcHRzLnJhbmRvbUluZGV4PT1lbHMubGVuZ3RoKXtvcHRzLnJhbmRvbUluZGV4PTA7b3B0cy5yYW5kb21NYXAuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLnJhbmRvbSgpLTAuNX0pfQpvcHRzLm5leHRTbGlkZT1vcHRzLnJhbmRvbU1hcFtvcHRzLnJhbmRvbUluZGV4XTtpZihvcHRzLm5leHRTbGlkZT09b3B0cy5jdXJyU2xpZGUpCm9wdHMubmV4dFNsaWRlPShvcHRzLmN1cnJTbGlkZT09b3B0cy5zbGlkZUNvdW50LTEpPzA6b3B0cy5jdXJyU2xpZGUrMX0KZWxzZSBpZihvcHRzLmJhY2t3YXJkcyl7cm9sbD0ob3B0cy5uZXh0U2xpZGUtMSk8MDtpZihyb2xsJiZvcHRzLmJvdW5jZSl7b3B0cy5iYWNrd2FyZHM9IW9wdHMuYmFja3dhcmRzO29wdHMubmV4dFNsaWRlPTE7b3B0cy5jdXJyU2xpZGU9MH0KZWxzZXtvcHRzLm5leHRTbGlkZT1yb2xsPyhlbHMubGVuZ3RoLTEpOm9wdHMubmV4dFNsaWRlLTE7b3B0cy5jdXJyU2xpZGU9cm9sbD8wOm9wdHMubmV4dFNsaWRlKzF9fQplbHNle3JvbGw9KG9wdHMubmV4dFNsaWRlKzEpPT1lbHMubGVuZ3RoO2lmKHJvbGwmJm9wdHMuYm91bmNlKXtvcHRzLmJhY2t3YXJkcz0hb3B0cy5iYWNrd2FyZHM7b3B0cy5uZXh0U2xpZGU9ZWxzLmxlbmd0aC0yO29wdHMuY3VyclNsaWRlPWVscy5sZW5ndGgtMX0KZWxzZXtvcHRzLm5leHRTbGlkZT1yb2xsPzA6b3B0cy5uZXh0U2xpZGUrMTtvcHRzLmN1cnJTbGlkZT1yb2xsP2Vscy5sZW5ndGgtMTpvcHRzLm5leHRTbGlkZS0xfX19CmlmKGNoYW5nZWQmJm9wdHMucGFnZXIpCm9wdHMudXBkYXRlQWN0aXZlUGFnZXJMaW5rKG9wdHMucGFnZXIsb3B0cy5jdXJyU2xpZGUsb3B0cy5hY3RpdmVQYWdlckNsYXNzKTtmdW5jdGlvbiBxdWV1ZU5leHQoKXt2YXIgbXM9MCx0aW1lb3V0PW9wdHMudGltZW91dDtpZihvcHRzLnRpbWVvdXQmJiFvcHRzLmNvbnRpbnVvdXMpe21zPWdldFRpbWVvdXQoZWxzW29wdHMuY3VyclNsaWRlXSxlbHNbb3B0cy5uZXh0U2xpZGVdLG9wdHMsZndkKTtpZihvcHRzLmZ4PT0nc2h1ZmZsZScpCm1zLT1vcHRzLnNwZWVkT3V0fQplbHNlIGlmKG9wdHMuY29udGludW91cyYmcC5jeWNsZVBhdXNlKQptcz0xMDtpZihtcz4wKQpwLmN5Y2xlVGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Z28oZWxzLG9wdHMsMCwhb3B0cy5iYWNrd2FyZHMpfSxtcyl9fQokLmZuLmN5Y2xlLnVwZGF0ZUFjdGl2ZVBhZ2VyTGluaz1mdW5jdGlvbihwYWdlcixjdXJyU2xpZGUsY2xzTmFtZSl7JChwYWdlcikuZWFjaChmdW5jdGlvbigpeyQodGhpcykuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcyhjbHNOYW1lKS5lcShjdXJyU2xpZGUpLmFkZENsYXNzKGNsc05hbWUpfSl9O2Z1bmN0aW9uIGdldFRpbWVvdXQoY3VycixuZXh0LG9wdHMsZndkKXtpZihvcHRzLnRpbWVvdXRGbil7dmFyIHQ9b3B0cy50aW1lb3V0Rm4uY2FsbChjdXJyLGN1cnIsbmV4dCxvcHRzLGZ3ZCk7d2hpbGUob3B0cy5meCE9J25vbmUnJiYodC1vcHRzLnNwZWVkKTwyNTApCnQrPW9wdHMuc3BlZWQ7ZGVidWcoJ2NhbGN1bGF0ZWQgdGltZW91dDogJyt0Kyc7IHNwZWVkOiAnK29wdHMuc3BlZWQpO2lmKHQhPT0hMSkKcmV0dXJuIHR9CnJldHVybiBvcHRzLnRpbWVvdXR9CiQuZm4uY3ljbGUubmV4dD1mdW5jdGlvbihvcHRzKXthZHZhbmNlKG9wdHMsMSl9OyQuZm4uY3ljbGUucHJldj1mdW5jdGlvbihvcHRzKXthZHZhbmNlKG9wdHMsMCl9O2Z1bmN0aW9uIGFkdmFuY2Uob3B0cyxtb3ZlRm9yd2FyZCl7dmFyIHZhbD1tb3ZlRm9yd2FyZD8xOi0xO3ZhciBlbHM9b3B0cy5lbGVtZW50czt2YXIgcD1vcHRzLiRjb250WzBdLHRpbWVvdXQ9cC5jeWNsZVRpbWVvdXQ7aWYodGltZW91dCl7Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO3AuY3ljbGVUaW1lb3V0PTB9CmlmKG9wdHMucmFuZG9tJiZ2YWw8MCl7b3B0cy5yYW5kb21JbmRleC0tO2lmKC0tb3B0cy5yYW5kb21JbmRleD09LTIpCm9wdHMucmFuZG9tSW5kZXg9ZWxzLmxlbmd0aC0yO2Vsc2UgaWYob3B0cy5yYW5kb21JbmRleD09LTEpCm9wdHMucmFuZG9tSW5kZXg9ZWxzLmxlbmd0aC0xO29wdHMubmV4dFNsaWRlPW9wdHMucmFuZG9tTWFwW29wdHMucmFuZG9tSW5kZXhdfQplbHNlIGlmKG9wdHMucmFuZG9tKXtvcHRzLm5leHRTbGlkZT1vcHRzLnJhbmRvbU1hcFtvcHRzLnJhbmRvbUluZGV4XX0KZWxzZXtvcHRzLm5leHRTbGlkZT1vcHRzLmN1cnJTbGlkZSt2YWw7aWYob3B0cy5uZXh0U2xpZGU8MCl7aWYob3B0cy5ub3dyYXApcmV0dXJuITE7b3B0cy5uZXh0U2xpZGU9ZWxzLmxlbmd0aC0xfQplbHNlIGlmKG9wdHMubmV4dFNsaWRlPj1lbHMubGVuZ3RoKXtpZihvcHRzLm5vd3JhcClyZXR1cm4hMTtvcHRzLm5leHRTbGlkZT0wfX0KdmFyIGNiPW9wdHMub25QcmV2TmV4dEV2ZW50fHxvcHRzLnByZXZOZXh0Q2xpY2s7aWYoJC5pc0Z1bmN0aW9uKGNiKSkKY2IodmFsPjAsb3B0cy5uZXh0U2xpZGUsZWxzW29wdHMubmV4dFNsaWRlXSk7Z28oZWxzLG9wdHMsMSxtb3ZlRm9yd2FyZCk7cmV0dXJuITF9CmZ1bmN0aW9uIGJ1aWxkUGFnZXIoZWxzLG9wdHMpe3ZhciAkcD0kKG9wdHMucGFnZXIpOyQuZWFjaChlbHMsZnVuY3Rpb24oaSxvKXskLmZuLmN5Y2xlLmNyZWF0ZVBhZ2VyQW5jaG9yKGksbywkcCxlbHMsb3B0cyl9KTtvcHRzLnVwZGF0ZUFjdGl2ZVBhZ2VyTGluayhvcHRzLnBhZ2VyLG9wdHMuc3RhcnRpbmdTbGlkZSxvcHRzLmFjdGl2ZVBhZ2VyQ2xhc3MpfQokLmZuLmN5Y2xlLmNyZWF0ZVBhZ2VyQW5jaG9yPWZ1bmN0aW9uKGksZWwsJHAsZWxzLG9wdHMpe3ZhciBhO2lmKCQuaXNGdW5jdGlvbihvcHRzLnBhZ2VyQW5jaG9yQnVpbGRlcikpe2E9b3B0cy5wYWdlckFuY2hvckJ1aWxkZXIoaSxlbCk7ZGVidWcoJ3BhZ2VyQW5jaG9yQnVpbGRlcignK2krJywgZWwpIHJldHVybmVkOiAnK2EpfQplbHNlIGE9JzxhIGhyZWY9IiMiPicrKGkrMSkrJzwvYT4nO2lmKCFhKQpyZXR1cm47dmFyICRhPSQoYSk7aWYoJGEucGFyZW50cygnYm9keScpLmxlbmd0aD09PTApe3ZhciBhcnI9W107aWYoJHAubGVuZ3RoPjEpeyRwLmVhY2goZnVuY3Rpb24oKXt2YXIgJGNsb25lPSRhLmNsb25lKCEwKTskKHRoaXMpLmFwcGVuZCgkY2xvbmUpO2Fyci5wdXNoKCRjbG9uZVswXSl9KTskYT0kKGFycil9CmVsc2V7JGEuYXBwZW5kVG8oJHApfX0Kb3B0cy5wYWdlckFuY2hvcnM9b3B0cy5wYWdlckFuY2hvcnN8fFtdO29wdHMucGFnZXJBbmNob3JzLnB1c2goJGEpO3ZhciBwYWdlckZuPWZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKTtvcHRzLm5leHRTbGlkZT1pO3ZhciBwPW9wdHMuJGNvbnRbMF0sdGltZW91dD1wLmN5Y2xlVGltZW91dDtpZih0aW1lb3V0KXtjbGVhclRpbWVvdXQodGltZW91dCk7cC5jeWNsZVRpbWVvdXQ9MH0KdmFyIGNiPW9wdHMub25QYWdlckV2ZW50fHxvcHRzLnBhZ2VyQ2xpY2s7aWYoJC5pc0Z1bmN0aW9uKGNiKSkKY2Iob3B0cy5uZXh0U2xpZGUsZWxzW29wdHMubmV4dFNsaWRlXSk7Z28oZWxzLG9wdHMsMSxvcHRzLmN1cnJTbGlkZTxpKX07aWYoL21vdXNlZW50ZXJ8bW91c2VvdmVyL2kudGVzdChvcHRzLnBhZ2VyRXZlbnQpKXskYS5ob3ZlcihwYWdlckZuLGZ1bmN0aW9uKCl7fSl9CmVsc2V7JGEuYmluZChvcHRzLnBhZ2VyRXZlbnQscGFnZXJGbil9CmlmKCEvXmNsaWNrLy50ZXN0KG9wdHMucGFnZXJFdmVudCkmJiFvcHRzLmFsbG93UGFnZXJDbGlja0J1YmJsZSkKJGEuYmluZCgnY2xpY2suY3ljbGUnLGZ1bmN0aW9uKCl7cmV0dXJuITF9KTt2YXIgY29udD1vcHRzLiRjb250WzBdO3ZhciBwYXVzZUZsYWc9ITE7aWYob3B0cy5wYXVzZU9uUGFnZXJIb3Zlcil7JGEuaG92ZXIoZnVuY3Rpb24oKXtwYXVzZUZsYWc9ITA7Y29udC5jeWNsZVBhdXNlKys7dHJpZ2dlclBhdXNlKGNvbnQsITAsITApfSxmdW5jdGlvbigpe2lmKHBhdXNlRmxhZykKY29udC5jeWNsZVBhdXNlLS07dHJpZ2dlclBhdXNlKGNvbnQsITAsITApfSl9fTskLmZuLmN5Y2xlLmhvcHNGcm9tTGFzdD1mdW5jdGlvbihvcHRzLGZ3ZCl7dmFyIGhvcHMsbD1vcHRzLmxhc3RTbGlkZSxjPW9wdHMuY3VyclNsaWRlO2lmKGZ3ZCkKaG9wcz1jPmw/Yy1sOm9wdHMuc2xpZGVDb3VudC1sO2Vsc2UgaG9wcz1jPGw/bC1jOmwrb3B0cy5zbGlkZUNvdW50LWM7cmV0dXJuIGhvcHN9O2Z1bmN0aW9uIGNsZWFyVHlwZUZpeCgkc2xpZGVzKXtkZWJ1ZygnYXBwbHlpbmcgY2xlYXJUeXBlIGJhY2tncm91bmQtY29sb3IgaGFjaycpO2Z1bmN0aW9uIGhleChzKXtzPXBhcnNlSW50KHMsMTApLnRvU3RyaW5nKDE2KTtyZXR1cm4gcy5sZW5ndGg8Mj8nMCcrczpzfQpmdW5jdGlvbiBnZXRCZyhlKXtmb3IoO2UmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9J2h0bWwnO2U9ZS5wYXJlbnROb2RlKXt2YXIgdj0kLmNzcyhlLCdiYWNrZ3JvdW5kLWNvbG9yJyk7aWYodiYmdi5pbmRleE9mKCdyZ2InKT49MCl7dmFyIHJnYj12Lm1hdGNoKC9cZCsvZyk7cmV0dXJuJyMnK2hleChyZ2JbMF0pK2hleChyZ2JbMV0pK2hleChyZ2JbMl0pfQppZih2JiZ2IT0ndHJhbnNwYXJlbnQnKQpyZXR1cm4gdn0KcmV0dXJuJyNmZmZmZmYnfQokc2xpZGVzLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsZ2V0QmcodGhpcykpfSl9CiQuZm4uY3ljbGUuY29tbW9uUmVzZXQ9ZnVuY3Rpb24oY3VycixuZXh0LG9wdHMsdyxoLHJldil7JChvcHRzLmVsZW1lbnRzKS5ub3QoY3VycikuaGlkZSgpO2lmKHR5cGVvZiBvcHRzLmNzc0JlZm9yZS5vcGFjaXR5PT0ndW5kZWZpbmVkJykKb3B0cy5jc3NCZWZvcmUub3BhY2l0eT0xO29wdHMuY3NzQmVmb3JlLmRpc3BsYXk9J2Jsb2NrJztpZihvcHRzLnNsaWRlUmVzaXplJiZ3IT09ITEmJm5leHQuY3ljbGVXPjApCm9wdHMuY3NzQmVmb3JlLndpZHRoPW5leHQuY3ljbGVXO2lmKG9wdHMuc2xpZGVSZXNpemUmJmghPT0hMSYmbmV4dC5jeWNsZUg+MCkKb3B0cy5jc3NCZWZvcmUuaGVpZ2h0PW5leHQuY3ljbGVIO29wdHMuY3NzQWZ0ZXI9b3B0cy5jc3NBZnRlcnx8e307b3B0cy5jc3NBZnRlci5kaXNwbGF5PSdub25lJzskKGN1cnIpLmNzcygnekluZGV4JyxvcHRzLnNsaWRlQ291bnQrKHJldj09PSEwPzE6MCkpOyQobmV4dCkuY3NzKCd6SW5kZXgnLG9wdHMuc2xpZGVDb3VudCsocmV2PT09ITA/MDoxKSl9OyQuZm4uY3ljbGUuY3VzdG9tPWZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzLGNiLGZ3ZCxzcGVlZE92ZXJyaWRlKXt2YXIgJGw9JChjdXJyKSwkbj0kKG5leHQpO3ZhciBzcGVlZEluPW9wdHMuc3BlZWRJbixzcGVlZE91dD1vcHRzLnNwZWVkT3V0LGVhc2VJbj1vcHRzLmVhc2VJbixlYXNlT3V0PW9wdHMuZWFzZU91dCxhbmltSW5EZWxheT1vcHRzLmFuaW1JbkRlbGF5LGFuaW1PdXREZWxheT1vcHRzLmFuaW1PdXREZWxheTskbi5jc3Mob3B0cy5jc3NCZWZvcmUpO2lmKHNwZWVkT3ZlcnJpZGUpe2lmKHR5cGVvZiBzcGVlZE92ZXJyaWRlPT0nbnVtYmVyJykKc3BlZWRJbj1zcGVlZE91dD1zcGVlZE92ZXJyaWRlO2Vsc2Ugc3BlZWRJbj1zcGVlZE91dD0xO2Vhc2VJbj1lYXNlT3V0PW51bGx9CnZhciBmbj1mdW5jdGlvbigpeyRuLmRlbGF5KGFuaW1JbkRlbGF5KS5hbmltYXRlKG9wdHMuYW5pbUluLHNwZWVkSW4sZWFzZUluLGZ1bmN0aW9uKCl7Y2IoKX0pfTskbC5kZWxheShhbmltT3V0RGVsYXkpLmFuaW1hdGUob3B0cy5hbmltT3V0LHNwZWVkT3V0LGVhc2VPdXQsZnVuY3Rpb24oKXskbC5jc3Mob3B0cy5jc3NBZnRlcik7aWYoIW9wdHMuc3luYykKZm4oKX0pO2lmKG9wdHMuc3luYylmbigpfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zPXtmYWRlOmZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7JHNsaWRlcy5ub3QoJzplcSgnK29wdHMuY3VyclNsaWRlKycpJykuY3NzKCdvcGFjaXR5JywwKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzKTtvcHRzLmNzc0JlZm9yZS5vcGFjaXR5PTB9KTtvcHRzLmFuaW1Jbj17b3BhY2l0eToxfTtvcHRzLmFuaW1PdXQ9e29wYWNpdHk6MH07b3B0cy5jc3NCZWZvcmU9e3RvcDowLGxlZnQ6MH19fTskLmZuLmN5Y2xlLnZlcj1mdW5jdGlvbigpe3JldHVybiB2ZXJ9OyQuZm4uY3ljbGUuZGVmYXVsdHM9e2FjdGl2ZVBhZ2VyQ2xhc3M6J2FjdGl2ZVNsaWRlJyxhZnRlcjpudWxsLGFsbG93UGFnZXJDbGlja0J1YmJsZTohMSxhbmltSW46bnVsbCxhbmltSW5EZWxheTowLGFuaW1PdXQ6bnVsbCxhbmltT3V0RGVsYXk6MCxhc3BlY3Q6ITEsYXV0b3N0b3A6MCxhdXRvc3RvcENvdW50OjAsYmFja3dhcmRzOiExLGJlZm9yZTpudWxsLGNlbnRlcjpudWxsLGNsZWFydHlwZTohJC5zdXBwb3J0Lm9wYWNpdHksY2xlYXJ0eXBlTm9CZzohMSxjb250YWluZXJSZXNpemU6MSxjb250YWluZXJSZXNpemVIZWlnaHQ6MCxjb250aW51b3VzOjAsY3NzQWZ0ZXI6bnVsbCxjc3NCZWZvcmU6bnVsbCxkZWxheTowLGVhc2VJbjpudWxsLGVhc2VPdXQ6bnVsbCxlYXNpbmc6bnVsbCxlbmQ6bnVsbCxmYXN0T25FdmVudDowLGZpdDowLGZ4OidmYWRlJyxmeEZuOm51bGwsaGVpZ2h0OidhdXRvJyxtYW51YWxUcnVtcDohMCxtZXRhQXR0cjonY3ljbGUnLG5leHQ6bnVsbCxub3dyYXA6MCxvblBhZ2VyRXZlbnQ6bnVsbCxvblByZXZOZXh0RXZlbnQ6bnVsbCxwYWdlcjpudWxsLHBhZ2VyQW5jaG9yQnVpbGRlcjpudWxsLHBhZ2VyRXZlbnQ6J2NsaWNrLmN5Y2xlJyxwYXVzZTowLHBhdXNlT25QYWdlckhvdmVyOjAscHJldjpudWxsLHByZXZOZXh0RXZlbnQ6J2NsaWNrLmN5Y2xlJyxyYW5kb206MCxyYW5kb21pemVFZmZlY3RzOjEscmVxdWV1ZU9uSW1hZ2VOb3RMb2FkZWQ6ITAscmVxdWV1ZVRpbWVvdXQ6MjUwLHJldjowLHNodWZmbGU6bnVsbCxza2lwSW5pdGlhbGl6YXRpb25DYWxsYmFja3M6ITEsc2xpZGVFeHByOm51bGwsc2xpZGVSZXNpemU6MSxzcGVlZDoxMDAwLHNwZWVkSW46bnVsbCxzcGVlZE91dDpudWxsLHN0YXJ0aW5nU2xpZGU6dW5kZWZpbmVkLHN5bmM6MSx0aW1lb3V0OjQwMDAsdGltZW91dEZuOm51bGwsdXBkYXRlQWN0aXZlUGFnZXJMaW5rOm51bGwsd2lkdGg6bnVsbH19KShqUXVlcnkpOyhmdW5jdGlvbigkKXsidXNlIHN0cmljdCI7JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5ub25lPWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7b3B0cy5meEZuPWZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzLGFmdGVyKXskKG5leHQpLnNob3coKTskKGN1cnIpLmhpZGUoKTthZnRlcigpfX07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5mYWRlb3V0PWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7JHNsaWRlcy5ub3QoJzplcSgnK29wdHMuY3VyclNsaWRlKycpJykuY3NzKHtkaXNwbGF5OidibG9jaycsJ29wYWNpdHknOjF9KTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzLHcsaCxyZXYpeyQoY3VycikuY3NzKCd6SW5kZXgnLG9wdHMuc2xpZGVDb3VudCsocmV2IT09ITA/MTowKSk7JChuZXh0KS5jc3MoJ3pJbmRleCcsb3B0cy5zbGlkZUNvdW50KyhyZXYhPT0hMD8wOjEpKX0pO29wdHMuYW5pbUluLm9wYWNpdHk9MTtvcHRzLmFuaW1PdXQub3BhY2l0eT0wO29wdHMuY3NzQmVmb3JlLm9wYWNpdHk9MTtvcHRzLmNzc0JlZm9yZS5kaXNwbGF5PSdibG9jayc7b3B0cy5jc3NBZnRlci56SW5kZXg9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5zY3JvbGxVcD1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpeyRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKTtvcHRzLmJlZm9yZS5wdXNoKCQuZm4uY3ljbGUuY29tbW9uUmVzZXQpO3ZhciBoPSRjb250LmhlaWdodCgpO29wdHMuY3NzQmVmb3JlLnRvcD1oO29wdHMuY3NzQmVmb3JlLmxlZnQ9MDtvcHRzLmNzc0ZpcnN0LnRvcD0wO29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbU91dC50b3A9LWh9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2Nyb2xsRG93bj1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpeyRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKTtvcHRzLmJlZm9yZS5wdXNoKCQuZm4uY3ljbGUuY29tbW9uUmVzZXQpO3ZhciBoPSRjb250LmhlaWdodCgpO29wdHMuY3NzRmlyc3QudG9wPTA7b3B0cy5jc3NCZWZvcmUudG9wPS1oO29wdHMuY3NzQmVmb3JlLmxlZnQ9MDtvcHRzLmFuaW1Jbi50b3A9MDtvcHRzLmFuaW1PdXQudG9wPWh9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2Nyb2xsTGVmdD1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpeyRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKTtvcHRzLmJlZm9yZS5wdXNoKCQuZm4uY3ljbGUuY29tbW9uUmVzZXQpO3ZhciB3PSRjb250LndpZHRoKCk7b3B0cy5jc3NGaXJzdC5sZWZ0PTA7b3B0cy5jc3NCZWZvcmUubGVmdD13O29wdHMuY3NzQmVmb3JlLnRvcD0wO29wdHMuYW5pbUluLmxlZnQ9MDtvcHRzLmFuaW1PdXQubGVmdD0wLXd9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2Nyb2xsUmlnaHQ9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXskY29udC5jc3MoJ292ZXJmbG93JywnaGlkZGVuJyk7b3B0cy5iZWZvcmUucHVzaCgkLmZuLmN5Y2xlLmNvbW1vblJlc2V0KTt2YXIgdz0kY29udC53aWR0aCgpO29wdHMuY3NzRmlyc3QubGVmdD0wO29wdHMuY3NzQmVmb3JlLmxlZnQ9LXc7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5hbmltSW4ubGVmdD0wO29wdHMuYW5pbU91dC5sZWZ0PXd9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2Nyb2xsSG9yej1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpeyRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKS53aWR0aCgpO29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMsZndkKXtpZihvcHRzLnJldikKZndkPSFmd2Q7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cyk7b3B0cy5jc3NCZWZvcmUubGVmdD1md2Q/KG5leHQuY3ljbGVXLTEpOigxLW5leHQuY3ljbGVXKTtvcHRzLmFuaW1PdXQubGVmdD1md2Q/LWN1cnIuY3ljbGVXOmN1cnIuY3ljbGVXfSk7b3B0cy5jc3NGaXJzdC5sZWZ0PTA7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5hbmltSW4ubGVmdD0wO29wdHMuYW5pbU91dC50b3A9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5zY3JvbGxWZXJ0PWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7JGNvbnQuY3NzKCdvdmVyZmxvdycsJ2hpZGRlbicpO29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMsZndkKXtpZihvcHRzLnJldikKZndkPSFmd2Q7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cyk7b3B0cy5jc3NCZWZvcmUudG9wPWZ3ZD8oMS1uZXh0LmN5Y2xlSCk6KG5leHQuY3ljbGVILTEpO29wdHMuYW5pbU91dC50b3A9ZndkP2N1cnIuY3ljbGVIOi1jdXJyLmN5Y2xlSH0pO29wdHMuY3NzRmlyc3QudG9wPTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wO29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbU91dC5sZWZ0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2xpZGVYPWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7b3B0cy5iZWZvcmUucHVzaChmdW5jdGlvbihjdXJyLG5leHQsb3B0cyl7JChvcHRzLmVsZW1lbnRzKS5ub3QoY3VycikuaGlkZSgpOyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITEsITApO29wdHMuYW5pbUluLndpZHRoPW5leHQuY3ljbGVXfSk7b3B0cy5jc3NCZWZvcmUubGVmdD0wO29wdHMuY3NzQmVmb3JlLnRvcD0wO29wdHMuY3NzQmVmb3JlLndpZHRoPTA7b3B0cy5hbmltSW4ud2lkdGg9J3Nob3cnO29wdHMuYW5pbU91dC53aWR0aD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnNsaWRlWT1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQob3B0cy5lbGVtZW50cykubm90KGN1cnIpLmhpZGUoKTskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCExKTtvcHRzLmFuaW1Jbi5oZWlnaHQ9bmV4dC5jeWNsZUh9KTtvcHRzLmNzc0JlZm9yZS5sZWZ0PTA7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5hbmltSW4uaGVpZ2h0PSdzaG93JztvcHRzLmFuaW1PdXQuaGVpZ2h0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuc2h1ZmZsZT1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe3ZhciBpLHc9JGNvbnQuY3NzKCdvdmVyZmxvdycsJ3Zpc2libGUnKS53aWR0aCgpOyRzbGlkZXMuY3NzKHtsZWZ0OjAsdG9wOjB9KTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCEwLCEwKX0pO2lmKCFvcHRzLnNwZWVkQWRqdXN0ZWQpe29wdHMuc3BlZWQ9b3B0cy5zcGVlZC8yO29wdHMuc3BlZWRBZGp1c3RlZD0hMH0Kb3B0cy5yYW5kb209MDtvcHRzLnNodWZmbGU9b3B0cy5zaHVmZmxlfHx7bGVmdDotdyx0b3A6MTV9O29wdHMuZWxzPVtdO2ZvcihpPTA7aTwkc2xpZGVzLmxlbmd0aDtpKyspCm9wdHMuZWxzLnB1c2goJHNsaWRlc1tpXSk7Zm9yKGk9MDtpPG9wdHMuY3VyclNsaWRlO2krKykKb3B0cy5lbHMucHVzaChvcHRzLmVscy5zaGlmdCgpKTtvcHRzLmZ4Rm49ZnVuY3Rpb24oY3VycixuZXh0LG9wdHMsY2IsZndkKXtpZihvcHRzLnJldikKZndkPSFmd2Q7dmFyICRlbD1md2Q/JChjdXJyKTokKG5leHQpOyQobmV4dCkuY3NzKG9wdHMuY3NzQmVmb3JlKTt2YXIgY291bnQ9b3B0cy5zbGlkZUNvdW50OyRlbC5hbmltYXRlKG9wdHMuc2h1ZmZsZSxvcHRzLnNwZWVkSW4sb3B0cy5lYXNlSW4sZnVuY3Rpb24oKXt2YXIgaG9wcz0kLmZuLmN5Y2xlLmhvcHNGcm9tTGFzdChvcHRzLGZ3ZCk7Zm9yKHZhciBrPTA7azxob3BzO2srKyl7aWYoZndkKQpvcHRzLmVscy5wdXNoKG9wdHMuZWxzLnNoaWZ0KCkpO2Vsc2Ugb3B0cy5lbHMudW5zaGlmdChvcHRzLmVscy5wb3AoKSl9CmlmKGZ3ZCl7Zm9yKHZhciBpPTAsbGVuPW9wdHMuZWxzLmxlbmd0aDtpPGxlbjtpKyspCiQob3B0cy5lbHNbaV0pLmNzcygnei1pbmRleCcsbGVuLWkrY291bnQpO30KZWxzZXt2YXIgej0kKGN1cnIpLmNzcygnei1pbmRleCcpOyRlbC5jc3MoJ3otaW5kZXgnLHBhcnNlSW50KHosMTApKzErY291bnQpfQokZWwuYW5pbWF0ZSh7bGVmdDowLHRvcDowfSxvcHRzLnNwZWVkT3V0LG9wdHMuZWFzZU91dCxmdW5jdGlvbigpeyQoZndkP3RoaXM6Y3VycikuaGlkZSgpO2lmKGNiKWNiKCl9KX0pfTskLmV4dGVuZChvcHRzLmNzc0JlZm9yZSx7ZGlzcGxheTonYmxvY2snLG9wYWNpdHk6MSx0b3A6MCxsZWZ0OjB9KX07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy50dXJuVXA9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCExKTtvcHRzLmNzc0JlZm9yZS50b3A9bmV4dC5jeWNsZUg7b3B0cy5hbmltSW4uaGVpZ2h0PW5leHQuY3ljbGVIO29wdHMuYW5pbU91dC53aWR0aD1uZXh0LmN5Y2xlV30pO29wdHMuY3NzRmlyc3QudG9wPTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wO29wdHMuY3NzQmVmb3JlLmhlaWdodD0wO29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbU91dC5oZWlnaHQ9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy50dXJuRG93bj1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITAsITEpO29wdHMuYW5pbUluLmhlaWdodD1uZXh0LmN5Y2xlSDtvcHRzLmFuaW1PdXQudG9wPWN1cnIuY3ljbGVIfSk7b3B0cy5jc3NGaXJzdC50b3A9MDtvcHRzLmNzc0JlZm9yZS5sZWZ0PTA7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5hbmltT3V0LmhlaWdodD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnR1cm5MZWZ0PWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7b3B0cy5iZWZvcmUucHVzaChmdW5jdGlvbihjdXJyLG5leHQsb3B0cyl7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cywhMSwhMCk7b3B0cy5jc3NCZWZvcmUubGVmdD1uZXh0LmN5Y2xlVztvcHRzLmFuaW1Jbi53aWR0aD1uZXh0LmN5Y2xlV30pO29wdHMuY3NzQmVmb3JlLnRvcD0wO29wdHMuY3NzQmVmb3JlLndpZHRoPTA7b3B0cy5hbmltSW4ubGVmdD0wO29wdHMuYW5pbU91dC53aWR0aD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnR1cm5SaWdodD1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITEsITApO29wdHMuYW5pbUluLndpZHRoPW5leHQuY3ljbGVXO29wdHMuYW5pbU91dC5sZWZ0PWN1cnIuY3ljbGVXfSk7JC5leHRlbmQob3B0cy5jc3NCZWZvcmUse3RvcDowLGxlZnQ6MCx3aWR0aDowfSk7b3B0cy5hbmltSW4ubGVmdD0wO29wdHMuYW5pbU91dC53aWR0aD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnpvb209ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCExLCExLCEwKTtvcHRzLmNzc0JlZm9yZS50b3A9bmV4dC5jeWNsZUgvMjtvcHRzLmNzc0JlZm9yZS5sZWZ0PW5leHQuY3ljbGVXLzI7JC5leHRlbmQob3B0cy5hbmltSW4se3RvcDowLGxlZnQ6MCx3aWR0aDpuZXh0LmN5Y2xlVyxoZWlnaHQ6bmV4dC5jeWNsZUh9KTskLmV4dGVuZChvcHRzLmFuaW1PdXQse3dpZHRoOjAsaGVpZ2h0OjAsdG9wOmN1cnIuY3ljbGVILzIsbGVmdDpjdXJyLmN5Y2xlVy8yfSl9KTtvcHRzLmNzc0ZpcnN0LnRvcD0wO29wdHMuY3NzRmlyc3QubGVmdD0wO29wdHMuY3NzQmVmb3JlLndpZHRoPTA7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuZmFkZVpvb209ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCExLCExKTtvcHRzLmNzc0JlZm9yZS5sZWZ0PW5leHQuY3ljbGVXLzI7b3B0cy5jc3NCZWZvcmUudG9wPW5leHQuY3ljbGVILzI7JC5leHRlbmQob3B0cy5hbmltSW4se3RvcDowLGxlZnQ6MCx3aWR0aDpuZXh0LmN5Y2xlVyxoZWlnaHQ6bmV4dC5jeWNsZUh9KX0pO29wdHMuY3NzQmVmb3JlLndpZHRoPTA7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5hbmltT3V0Lm9wYWNpdHk9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5ibGluZFg9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXt2YXIgdz0kY29udC5jc3MoJ292ZXJmbG93JywnaGlkZGVuJykud2lkdGgoKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzKTtvcHRzLmFuaW1Jbi53aWR0aD1uZXh0LmN5Y2xlVztvcHRzLmFuaW1PdXQubGVmdD1jdXJyLmN5Y2xlV30pO29wdHMuY3NzQmVmb3JlLmxlZnQ9dztvcHRzLmNzc0JlZm9yZS50b3A9MDtvcHRzLmFuaW1Jbi5sZWZ0PTA7b3B0cy5hbmltT3V0LmxlZnQ9d307JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5ibGluZFk9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXt2YXIgaD0kY29udC5jc3MoJ292ZXJmbG93JywnaGlkZGVuJykuaGVpZ2h0KCk7b3B0cy5iZWZvcmUucHVzaChmdW5jdGlvbihjdXJyLG5leHQsb3B0cyl7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cyk7b3B0cy5hbmltSW4uaGVpZ2h0PW5leHQuY3ljbGVIO29wdHMuYW5pbU91dC50b3A9Y3Vyci5jeWNsZUh9KTtvcHRzLmNzc0JlZm9yZS50b3A9aDtvcHRzLmNzc0JlZm9yZS5sZWZ0PTA7b3B0cy5hbmltSW4udG9wPTA7b3B0cy5hbmltT3V0LnRvcD1ofTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLmJsaW5kWj1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe3ZhciBoPSRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKS5oZWlnaHQoKTt2YXIgdz0kY29udC53aWR0aCgpO29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMpO29wdHMuYW5pbUluLmhlaWdodD1uZXh0LmN5Y2xlSDtvcHRzLmFuaW1PdXQudG9wPWN1cnIuY3ljbGVIfSk7b3B0cy5jc3NCZWZvcmUudG9wPWg7b3B0cy5jc3NCZWZvcmUubGVmdD13O29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbUluLmxlZnQ9MDtvcHRzLmFuaW1PdXQudG9wPWg7b3B0cy5hbmltT3V0LmxlZnQ9d307JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5ncm93WD1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITEsITApO29wdHMuY3NzQmVmb3JlLmxlZnQ9dGhpcy5jeWNsZVcvMjtvcHRzLmFuaW1Jbi5sZWZ0PTA7b3B0cy5hbmltSW4ud2lkdGg9dGhpcy5jeWNsZVc7b3B0cy5hbmltT3V0LmxlZnQ9MH0pO29wdHMuY3NzQmVmb3JlLnRvcD0wO29wdHMuY3NzQmVmb3JlLndpZHRoPTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMuZ3Jvd1k9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCExKTtvcHRzLmNzc0JlZm9yZS50b3A9dGhpcy5jeWNsZUgvMjtvcHRzLmFuaW1Jbi50b3A9MDtvcHRzLmFuaW1Jbi5oZWlnaHQ9dGhpcy5jeWNsZUg7b3B0cy5hbmltT3V0LnRvcD0wfSk7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLmN1cnRhaW5YPWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7b3B0cy5iZWZvcmUucHVzaChmdW5jdGlvbihjdXJyLG5leHQsb3B0cyl7JC5mbi5jeWNsZS5jb21tb25SZXNldChjdXJyLG5leHQsb3B0cywhMSwhMCwhMCk7b3B0cy5jc3NCZWZvcmUubGVmdD1uZXh0LmN5Y2xlVy8yO29wdHMuYW5pbUluLmxlZnQ9MDtvcHRzLmFuaW1Jbi53aWR0aD10aGlzLmN5Y2xlVztvcHRzLmFuaW1PdXQubGVmdD1jdXJyLmN5Y2xlVy8yO29wdHMuYW5pbU91dC53aWR0aD0wfSk7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5jc3NCZWZvcmUud2lkdGg9MH07JC5mbi5jeWNsZS50cmFuc2l0aW9ucy5jdXJ0YWluWT1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITAsITEsITApO29wdHMuY3NzQmVmb3JlLnRvcD1uZXh0LmN5Y2xlSC8yO29wdHMuYW5pbUluLnRvcD0wO29wdHMuYW5pbUluLmhlaWdodD1uZXh0LmN5Y2xlSDtvcHRzLmFuaW1PdXQudG9wPWN1cnIuY3ljbGVILzI7b3B0cy5hbmltT3V0LmhlaWdodD0wfSk7b3B0cy5jc3NCZWZvcmUuaGVpZ2h0PTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLmNvdmVyPWZ1bmN0aW9uKCRjb250LCRzbGlkZXMsb3B0cyl7dmFyIGQ9b3B0cy5kaXJlY3Rpb258fCdsZWZ0Jzt2YXIgdz0kY29udC5jc3MoJ292ZXJmbG93JywnaGlkZGVuJykud2lkdGgoKTt2YXIgaD0kY29udC5oZWlnaHQoKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzKTtvcHRzLmNzc0FmdGVyLmRpc3BsYXk9Jyc7aWYoZD09J3JpZ2h0JykKb3B0cy5jc3NCZWZvcmUubGVmdD0tdztlbHNlIGlmKGQ9PSd1cCcpCm9wdHMuY3NzQmVmb3JlLnRvcD1oO2Vsc2UgaWYoZD09J2Rvd24nKQpvcHRzLmNzc0JlZm9yZS50b3A9LWg7ZWxzZSBvcHRzLmNzc0JlZm9yZS5sZWZ0PXd9KTtvcHRzLmFuaW1Jbi5sZWZ0PTA7b3B0cy5hbmltSW4udG9wPTA7b3B0cy5jc3NCZWZvcmUudG9wPTA7b3B0cy5jc3NCZWZvcmUubGVmdD0wfTskLmZuLmN5Y2xlLnRyYW5zaXRpb25zLnVuY292ZXI9ZnVuY3Rpb24oJGNvbnQsJHNsaWRlcyxvcHRzKXt2YXIgZD1vcHRzLmRpcmVjdGlvbnx8J2xlZnQnO3ZhciB3PSRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKS53aWR0aCgpO3ZhciBoPSRjb250LmhlaWdodCgpO29wdHMuYmVmb3JlLnB1c2goZnVuY3Rpb24oY3VycixuZXh0LG9wdHMpeyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITAsITAsITApO2lmKGQ9PSdyaWdodCcpCm9wdHMuYW5pbU91dC5sZWZ0PXc7ZWxzZSBpZihkPT0ndXAnKQpvcHRzLmFuaW1PdXQudG9wPS1oO2Vsc2UgaWYoZD09J2Rvd24nKQpvcHRzLmFuaW1PdXQudG9wPWg7ZWxzZSBvcHRzLmFuaW1PdXQubGVmdD0td30pO29wdHMuYW5pbUluLmxlZnQ9MDtvcHRzLmFuaW1Jbi50b3A9MDtvcHRzLmNzc0JlZm9yZS50b3A9MDtvcHRzLmNzc0JlZm9yZS5sZWZ0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMudG9zcz1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe3ZhciB3PSRjb250LmNzcygnb3ZlcmZsb3cnLCd2aXNpYmxlJykud2lkdGgoKTt2YXIgaD0kY29udC5oZWlnaHQoKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXskLmZuLmN5Y2xlLmNvbW1vblJlc2V0KGN1cnIsbmV4dCxvcHRzLCEwLCEwLCEwKTtpZighb3B0cy5hbmltT3V0LmxlZnQmJiFvcHRzLmFuaW1PdXQudG9wKQokLmV4dGVuZChvcHRzLmFuaW1PdXQse2xlZnQ6dyoyLHRvcDotaC8yLG9wYWNpdHk6MH0pO2Vsc2Ugb3B0cy5hbmltT3V0Lm9wYWNpdHk9MH0pO29wdHMuY3NzQmVmb3JlLmxlZnQ9MDtvcHRzLmNzc0JlZm9yZS50b3A9MDtvcHRzLmFuaW1Jbi5sZWZ0PTB9OyQuZm4uY3ljbGUudHJhbnNpdGlvbnMud2lwZT1mdW5jdGlvbigkY29udCwkc2xpZGVzLG9wdHMpe3ZhciB3PSRjb250LmNzcygnb3ZlcmZsb3cnLCdoaWRkZW4nKS53aWR0aCgpO3ZhciBoPSRjb250LmhlaWdodCgpO29wdHMuY3NzQmVmb3JlPW9wdHMuY3NzQmVmb3JlfHx7fTt2YXIgY2xpcDtpZihvcHRzLmNsaXApe2lmKC9sMnIvLnRlc3Qob3B0cy5jbGlwKSkKY2xpcD0ncmVjdCgwcHggMHB4ICcraCsncHggMHB4KSc7ZWxzZSBpZigvcjJsLy50ZXN0KG9wdHMuY2xpcCkpCmNsaXA9J3JlY3QoMHB4ICcrdysncHggJytoKydweCAnK3crJ3B4KSc7ZWxzZSBpZigvdDJiLy50ZXN0KG9wdHMuY2xpcCkpCmNsaXA9J3JlY3QoMHB4ICcrdysncHggMHB4IDBweCknO2Vsc2UgaWYoL2IydC8udGVzdChvcHRzLmNsaXApKQpjbGlwPSdyZWN0KCcraCsncHggJyt3KydweCAnK2grJ3B4IDBweCknO2Vsc2UgaWYoL3pvb20vLnRlc3Qob3B0cy5jbGlwKSl7dmFyIHRvcD1wYXJzZUludChoLzIsMTApO3ZhciBsZWZ0PXBhcnNlSW50KHcvMiwxMCk7Y2xpcD0ncmVjdCgnK3RvcCsncHggJytsZWZ0KydweCAnK3RvcCsncHggJytsZWZ0KydweCknfX0Kb3B0cy5jc3NCZWZvcmUuY2xpcD1vcHRzLmNzc0JlZm9yZS5jbGlwfHxjbGlwfHwncmVjdCgwcHggMHB4IDBweCAwcHgpJzt2YXIgZD1vcHRzLmNzc0JlZm9yZS5jbGlwLm1hdGNoKC8oXGQrKS9nKTt2YXIgdD1wYXJzZUludChkWzBdLDEwKSxyPXBhcnNlSW50KGRbMV0sMTApLGI9cGFyc2VJbnQoZFsyXSwxMCksbD1wYXJzZUludChkWzNdLDEwKTtvcHRzLmJlZm9yZS5wdXNoKGZ1bmN0aW9uKGN1cnIsbmV4dCxvcHRzKXtpZihjdXJyPT1uZXh0KXJldHVybjt2YXIgJGN1cnI9JChjdXJyKSwkbmV4dD0kKG5leHQpOyQuZm4uY3ljbGUuY29tbW9uUmVzZXQoY3VycixuZXh0LG9wdHMsITAsITAsITEpO29wdHMuY3NzQWZ0ZXIuZGlzcGxheT0nYmxvY2snO3ZhciBzdGVwPTEsY291bnQ9cGFyc2VJbnQoKG9wdHMuc3BlZWRJbi8xMyksMTApLTE7KGZ1bmN0aW9uIGYoKXt2YXIgdHQ9dD90LXBhcnNlSW50KHN0ZXAqKHQvY291bnQpLDEwKTowO3ZhciBsbD1sP2wtcGFyc2VJbnQoc3RlcCoobC9jb3VudCksMTApOjA7dmFyIGJiPWI8aD9iK3BhcnNlSW50KHN0ZXAqKChoLWIpL2NvdW50fHwxKSwxMCk6aDt2YXIgcnI9cjx3P3IrcGFyc2VJbnQoc3RlcCooKHctcikvY291bnR8fDEpLDEwKTp3OyRuZXh0LmNzcyh7Y2xpcDoncmVjdCgnK3R0KydweCAnK3JyKydweCAnK2JiKydweCAnK2xsKydweCknfSk7KHN0ZXArKzw9Y291bnQpP3NldFRpbWVvdXQoZiwxMyk6JGN1cnIuY3NzKCdkaXNwbGF5Jywnbm9uZScpfSkoKX0pOyQuZXh0ZW5kKG9wdHMuY3NzQmVmb3JlLHtkaXNwbGF5OidibG9jaycsb3BhY2l0eToxLHRvcDowLGxlZnQ6MH0pO29wdHMuYW5pbUluPXtsZWZ0OjB9O29wdHMuYW5pbU91dD17bGVmdDowfX19KShqUXVlcnkpO3ZhciBtZW51RGVsYXk9MTUwOyQoZnVuY3Rpb24oKXtpZigkKCcubWVnYS1uYXYnKS5sZW5ndGg+MCl7dmFyIGNvbHVtbnM9W107JCgndWwuY29sdW1uJykuZWFjaChmdW5jdGlvbigpe2NvbHVtbnMucHVzaCgkKHRoaXMpLmRhdGEoJ2NvbHVtbmlkJykpfSk7Y29sdW1ucz0kLnVuaXF1ZShjb2x1bW5zKTskLmVhY2goY29sdW1ucyxmdW5jdGlvbihrZXksdmFsdWUpe3ZhciBjb2w9dmFsdWUubWF0Y2goL1x3Ky1cZCstKFxkKykvKVsxXTskKCcuJyt2YWx1ZSsnID4gLm5hdl8xJykudW53cmFwKCkud3JhcEFsbCgnPGxpIGlkPSInK3ZhbHVlKyciIGNsYXNzPSJjb2x1bW4gY29sdW1uLScrY29sKyciPjwvbGk+Jyl9KX0KJCgndWwubWVnYS1uYXYudG9wLWxldmVsLW5hdiB1bC5uYXZfMScpLmVhY2goZnVuY3Rpb24oKXtzZXRNZW51UG9zaXRpb24oJCh0aGlzKSl9KTtoYW5kbGVUb3BOYXZJdGVtSG92ZXIoKX0pO2Z1bmN0aW9uIHNldE1lbnVQb3NpdGlvbihuYXYpe3ZhciBwYXJlbnRMaVBvc2l0aW9uO3ZhciBsZWZ0O25hdi5lYWNoKGZ1bmN0aW9uKCl7aWYoISQodGhpcykucGFyZW50KCkuaGFzQ2xhc3MoJ2Z1bGwtd2lkdGgnKSl7dmFyIG1lZ2FOYXY9JCh0aGlzKS5wYXJlbnRzKCdkaXYubWVnYV9uYXYnKTt2YXIgbWVnYU5hdldpZHRoPW1lZ2FOYXYud2lkdGgoKTt2YXIgcGFyZW50TGk9JCh0aGlzKS5wYXJlbnQoKTtwYXJlbnRMaVBvc2l0aW9uPXBhcmVudExpLnBvc2l0aW9uKCk7aWYoJCh0aGlzKS53aWR0aCgpPm1lZ2FOYXZXaWR0aCl7dmFyIGNoaWxkcmVuPSQodGhpcykuY2hpbGRyZW4oKTt2YXIgY29sdW1uV2lkdGg9cGFyc2VJbnQobWVnYU5hdldpZHRoL2NoaWxkcmVuLmxlbmd0aCk7Y2hpbGRyZW4uZWFjaChmdW5jdGlvbigpeyQodGhpcykuY3NzKCdtaW4td2lkdGgnLGNvbHVtbldpZHRoKydweCcpfSl9CnZhciByaWdodFNpZGVQb3NpdGlvbj0kKHRoaXMpLndpZHRoKCkrcGFyZW50TGlQb3NpdGlvbi5sZWZ0O2lmKHJpZ2h0U2lkZVBvc2l0aW9uPm1lZ2FOYXZXaWR0aCl7bGVmdD1yaWdodFNpZGVQb3NpdGlvbi1tZWdhTmF2V2lkdGg7JCh0aGlzKS5jc3MoJ2xlZnQnLChsZWZ0Ki0xKSsncHgnKX19ZWxzZXt2YXIgbGlDb3VudD0kKHRoaXMpLmNoaWxkcmVuKCdsaS5jb2x1bW4nKS5sZW5ndGg7dmFyIHdpZHRoPTEwMC9saUNvdW50OyQodGhpcykuY2hpbGRyZW4oJ2xpJykuY3NzKCd3aWR0aCcsd2lkdGgrJyUnKX19KX0KZnVuY3Rpb24gaGFuZGxlVG9wTmF2SXRlbUhvdmVyKCl7dmFyIHRvcE5hdkl0ZW1zPSQoJy5tZWdhX25hdiBsaS5uYXZfMScpO3RvcE5hdkl0ZW1zLmhvdmVyKGZ1bmN0aW9uKCl7dmFyIGljb249JCh0aGlzKS5maW5kKCdpbWcuaW1nLXJlc3BvbnNpdmUnKTt2YXIgY3VycmVudFNyYz1pY29uLmF0dHIoJ3NyYycpO2lmKCFjdXJyZW50U3JjLmluY2x1ZGVzKCdfaG92ZXIucG5nJykpe3ZhciBuZXdTcmM9Y3VycmVudFNyYy5zbGljZSgwLC00KSsiX2hvdmVyLnBuZyI7aWNvbi5hdHRyKCdzcmMnLG5ld1NyYyl9fSxmdW5jdGlvbigpe3ZhciBpY29uPSQodGhpcykuZmluZCgnaW1nLmltZy1yZXNwb25zaXZlJyk7dmFyIGN1cnJlbnRTcmM9aWNvbi5hdHRyKCdzcmMnKTtpZihjdXJyZW50U3JjLmluY2x1ZGVzKCdfaG92ZXIucG5nJykpe3ZhciBuZXdTcmM9Y3VycmVudFNyYy5zbGljZSgwLC0xMCkrIi5wbmciO2ljb24uYXR0cignc3JjJyxuZXdTcmMpfX0pfTskKGZ1bmN0aW9uKCl7aWYoYXV0b2NvbXBsZXRlPT0hMCl7JCgiI3F1aWNrc2VhcmNoX2tleXdvcmRzIikuYXV0b2NvbXBsZXRlKHttaW5MZW5ndGg6MyxkZWxheTo1MDAscG9zaXRpb246e215OiJyaWdodCB0b3AiLGF0OiJyaWdodCBib3R0b20ifSxzZWxlY3Q6ZnVuY3Rpb24oZXZlbnQsdWkpe2lmKHVpLml0ZW0ubGFiZWwhPSJObyBSZXN1bHRzIEZvdW5kIil7d2luZG93LmxvY2F0aW9uLmhyZWY9dWkuaXRlbS5saW5rfX0sc291cmNlOmZ1bmN0aW9uKHJlcXVlc3QscmVzcG9uc2UpeyQucG9zdCgiaW5jbHVkZXMvYWpheC9hamF4LnNlYXJjaF9hdXRvY29tcGxldGUucGhwIix7cmVxdWVzdDpyZXF1ZXN0LnRlcm0sdHlwZTokKCJpbnB1dC5zZWFyY2hfdHlwZTpjaGVja2VkIikudmFsKCl9LGZ1bmN0aW9uKGRhdGEpe3Jlc3BvbnNlKGRhdGEpfSwianNvbiIpLmZhaWwoZnVuY3Rpb24oZXJyKXtjb25zb2xlLmxvZyhlcnIucmVzcG9uc2VUZXh0KX0pfX0pfQokKCIuc2VhcmNoX3R5cGUiKS5jbGljayhmdW5jdGlvbigpeyQoIiN0eXBlIikudmFsKCQodGhpcykudmFsKCkpfSl9KTtmdW5jdGlvbiBjaGFuZ2VQYWdlKHBhZ2UpeyQoJyNwYWdlJykudmFsKHBhZ2UpfTshZnVuY3Rpb24odCl7dmFyIGU9e21vZGU6Imhvcml6b250YWwiLHNsaWRlU2VsZWN0b3I6IiIsaW5maW5pdGVMb29wOiEwLGhpZGVDb250cm9sT25FbmQ6ITEsc3BlZWQ6NTAwLGVhc2luZzpudWxsLHNsaWRlTWFyZ2luOjAsc3RhcnRTbGlkZTowLHJhbmRvbVN0YXJ0OiExLGNhcHRpb25zOiExLHRpY2tlcjohMSx0aWNrZXJIb3ZlcjohMSxhZGFwdGl2ZUhlaWdodDohMSxhZGFwdGl2ZUhlaWdodFNwZWVkOjUwMCx2aWRlbzohMSx1c2VDU1M6ITAscHJlbG9hZEltYWdlczoidmlzaWJsZSIscmVzcG9uc2l2ZTohMCxzbGlkZVpJbmRleDo1MCx3cmFwcGVyQ2xhc3M6ImJ4LXdyYXBwZXIiLHRvdWNoRW5hYmxlZDohMCxzd2lwZVRocmVzaG9sZDo1MCxvbmVUb09uZVRvdWNoOiEwLHByZXZlbnREZWZhdWx0U3dpcGVYOiEwLHByZXZlbnREZWZhdWx0U3dpcGVZOiExLGFyaWFMaXZlOiEwLGFyaWFIaWRkZW46ITAsa2V5Ym9hcmRFbmFibGVkOiExLHBhZ2VyOiEwLHBhZ2VyVHlwZToiZnVsbCIscGFnZXJTaG9ydFNlcGFyYXRvcjoiIC8gIixwYWdlclNlbGVjdG9yOm51bGwsYnVpbGRQYWdlcjpudWxsLHBhZ2VyQ3VzdG9tOm51bGwsY29udHJvbHM6ITAsbmV4dFRleHQ6Ik5leHQiLHByZXZUZXh0OiJQcmV2IixuZXh0U2VsZWN0b3I6bnVsbCxwcmV2U2VsZWN0b3I6bnVsbCxhdXRvQ29udHJvbHM6ITEsc3RhcnRUZXh0OiJTdGFydCIsc3RvcFRleHQ6IlN0b3AiLGF1dG9Db250cm9sc0NvbWJpbmU6ITEsYXV0b0NvbnRyb2xzU2VsZWN0b3I6bnVsbCxhdXRvOiExLHBhdXNlOjRlMyxhdXRvU3RhcnQ6ITAsYXV0b0RpcmVjdGlvbjoibmV4dCIsc3RvcEF1dG9PbkNsaWNrOiExLGF1dG9Ib3ZlcjohMSxhdXRvRGVsYXk6MCxhdXRvU2xpZGVGb3JPbmVQYWdlOiExLG1pblNsaWRlczoxLG1heFNsaWRlczoxLG1vdmVTbGlkZXM6MCxzbGlkZVdpZHRoOjAsc2hyaW5rSXRlbXM6ITEsb25TbGlkZXJMb2FkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG9uU2xpZGVCZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sb25TbGlkZUFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuITB9LG9uU2xpZGVOZXh0OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG9uU2xpZGVQcmV2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG9uU2xpZGVyUmVzaXplOmZ1bmN0aW9uKCl7cmV0dXJuITB9fTt0LmZuLmJ4U2xpZGVyPWZ1bmN0aW9uKG4pe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4gdGhpcztpZih0aGlzLmxlbmd0aD4xKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLmJ4U2xpZGVyKG4pfSksdGhpczt2YXIgcz17fSxvPXRoaXMscj10KHdpbmRvdykud2lkdGgoKSxhPXQod2luZG93KS5oZWlnaHQoKTtpZighdChvKS5kYXRhKCJieFNsaWRlciIpKXt2YXIgbD1mdW5jdGlvbigpe3QobykuZGF0YSgiYnhTbGlkZXIiKXx8KHMuc2V0dGluZ3M9dC5leHRlbmQoe30sZSxuKSxzLnNldHRpbmdzLnNsaWRlV2lkdGg9cGFyc2VJbnQocy5zZXR0aW5ncy5zbGlkZVdpZHRoKSxzLmNoaWxkcmVuPW8uY2hpbGRyZW4ocy5zZXR0aW5ncy5zbGlkZVNlbGVjdG9yKSxzLmNoaWxkcmVuLmxlbmd0aDxzLnNldHRpbmdzLm1pblNsaWRlcyYmKHMuc2V0dGluZ3MubWluU2xpZGVzPXMuY2hpbGRyZW4ubGVuZ3RoKSxzLmNoaWxkcmVuLmxlbmd0aDxzLnNldHRpbmdzLm1heFNsaWRlcyYmKHMuc2V0dGluZ3MubWF4U2xpZGVzPXMuY2hpbGRyZW4ubGVuZ3RoKSxzLnNldHRpbmdzLnJhbmRvbVN0YXJ0JiYocy5zZXR0aW5ncy5zdGFydFNsaWRlPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpzLmNoaWxkcmVuLmxlbmd0aCkpLHMuYWN0aXZlPXtpbmRleDpzLnNldHRpbmdzLnN0YXJ0U2xpZGV9LHMuY2Fyb3VzZWw9cy5zZXR0aW5ncy5taW5TbGlkZXM+MXx8cy5zZXR0aW5ncy5tYXhTbGlkZXM+MSxzLmNhcm91c2VsJiYocy5zZXR0aW5ncy5wcmVsb2FkSW1hZ2VzPSJhbGwiKSxzLm1pblRocmVzaG9sZD1zLnNldHRpbmdzLm1pblNsaWRlcypzLnNldHRpbmdzLnNsaWRlV2lkdGgrKHMuc2V0dGluZ3MubWluU2xpZGVzLTEpKnMuc2V0dGluZ3Muc2xpZGVNYXJnaW4scy5tYXhUaHJlc2hvbGQ9cy5zZXR0aW5ncy5tYXhTbGlkZXMqcy5zZXR0aW5ncy5zbGlkZVdpZHRoKyhzLnNldHRpbmdzLm1heFNsaWRlcy0xKSpzLnNldHRpbmdzLnNsaWRlTWFyZ2luLHMud29ya2luZz0hMSxzLmNvbnRyb2xzPXt9LHMuaW50ZXJ2YWw9bnVsbCxzLmFuaW1Qcm9wPSJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGU/InRvcCI6ImxlZnQiLHMudXNpbmdDU1M9cy5zZXR0aW5ncy51c2VDU1MmJiJmYWRlIiE9PXMuc2V0dGluZ3MubW9kZSYmZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT1bIldlYmtpdFBlcnNwZWN0aXZlIiwiTW96UGVyc3BlY3RpdmUiLCJPUGVyc3BlY3RpdmUiLCJtc1BlcnNwZWN0aXZlIl0saT0wO2k8ZS5sZW5ndGg7aSsrKWlmKHZvaWQgMCE9PXQuc3R5bGVbZVtpXV0pcmV0dXJuIHMuY3NzUHJlZml4PWVbaV0ucmVwbGFjZSgiUGVyc3BlY3RpdmUiLCIiKS50b0xvd2VyQ2FzZSgpLHMuYW5pbVByb3A9Ii0iK3MuY3NzUHJlZml4KyItdHJhbnNmb3JtIiwhMDtyZXR1cm4hMX0oKSwidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlJiYocy5zZXR0aW5ncy5tYXhTbGlkZXM9cy5zZXR0aW5ncy5taW5TbGlkZXMpLG8uZGF0YSgib3JpZ1N0eWxlIixvLmF0dHIoInN0eWxlIikpLG8uY2hpbGRyZW4ocy5zZXR0aW5ncy5zbGlkZVNlbGVjdG9yKS5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS5kYXRhKCJvcmlnU3R5bGUiLHQodGhpcykuYXR0cigic3R5bGUiKSl9KSxkKCkpfSxkPWZ1bmN0aW9uKCl7dmFyIGU9cy5jaGlsZHJlbi5lcShzLnNldHRpbmdzLnN0YXJ0U2xpZGUpO28ud3JhcCgnPGRpdiBjbGFzcz0iJytzLnNldHRpbmdzLndyYXBwZXJDbGFzcysnIj48ZGl2IGNsYXNzPSJieC12aWV3cG9ydCI+PC9kaXY+PC9kaXY+Jykscy52aWV3cG9ydD1vLnBhcmVudCgpLHMuc2V0dGluZ3MuYXJpYUxpdmUmJiFzLnNldHRpbmdzLnRpY2tlciYmcy52aWV3cG9ydC5hdHRyKCJhcmlhLWxpdmUiLCJwb2xpdGUiKSxzLmxvYWRlcj10KCc8ZGl2IGNsYXNzPSJieC1sb2FkaW5nIiAvPicpLHMudmlld3BvcnQucHJlcGVuZChzLmxvYWRlciksby5jc3Moe3dpZHRoOiJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8xZTMqcy5jaGlsZHJlbi5sZW5ndGgrMjE1KyIlIjoiYXV0byIscG9zaXRpb246InJlbGF0aXZlIn0pLHMudXNpbmdDU1MmJnMuc2V0dGluZ3MuZWFzaW5nP28uY3NzKCItIitzLmNzc1ByZWZpeCsiLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIixzLnNldHRpbmdzLmVhc2luZyk6cy5zZXR0aW5ncy5lYXNpbmd8fChzLnNldHRpbmdzLmVhc2luZz0ic3dpbmciKSxzLnZpZXdwb3J0LmNzcyh7d2lkdGg6IjEwMCUiLG92ZXJmbG93OiJoaWRkZW4iLHBvc2l0aW9uOiJyZWxhdGl2ZSJ9KSxzLnZpZXdwb3J0LnBhcmVudCgpLmNzcyh7bWF4V2lkdGg6dSgpfSkscy5jaGlsZHJlbi5jc3Moe2Zsb2F0OiJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8ibGVmdCI6Im5vbmUiLGxpc3RTdHlsZToibm9uZSIscG9zaXRpb246InJlbGF0aXZlIn0pLHMuY2hpbGRyZW4uY3NzKCJ3aWR0aCIsaCgpKSwiaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGUmJnMuc2V0dGluZ3Muc2xpZGVNYXJnaW4+MCYmcy5jaGlsZHJlbi5jc3MoIm1hcmdpblJpZ2h0IixzLnNldHRpbmdzLnNsaWRlTWFyZ2luKSwidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlJiZzLnNldHRpbmdzLnNsaWRlTWFyZ2luPjAmJnMuY2hpbGRyZW4uY3NzKCJtYXJnaW5Cb3R0b20iLHMuc2V0dGluZ3Muc2xpZGVNYXJnaW4pLCJmYWRlIj09PXMuc2V0dGluZ3MubW9kZSYmKHMuY2hpbGRyZW4uY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHpJbmRleDowLGRpc3BsYXk6Im5vbmUifSkscy5jaGlsZHJlbi5lcShzLnNldHRpbmdzLnN0YXJ0U2xpZGUpLmNzcyh7ekluZGV4OnMuc2V0dGluZ3Muc2xpZGVaSW5kZXgsZGlzcGxheToiYmxvY2sifSkpLHMuY29udHJvbHMuZWw9dCgnPGRpdiBjbGFzcz0iYngtY29udHJvbHMiIC8+Jykscy5zZXR0aW5ncy5jYXB0aW9ucyYmUCgpLHMuYWN0aXZlLmxhc3Q9cy5zZXR0aW5ncy5zdGFydFNsaWRlPT09ZigpLTEscy5zZXR0aW5ncy52aWRlbyYmby5maXRWaWRzKCksKCJhbGwiPT09cy5zZXR0aW5ncy5wcmVsb2FkSW1hZ2VzfHxzLnNldHRpbmdzLnRpY2tlcikmJihlPXMuY2hpbGRyZW4pLHMuc2V0dGluZ3MudGlja2VyP3Muc2V0dGluZ3MucGFnZXI9ITE6KHMuc2V0dGluZ3MuY29udHJvbHMmJkMoKSxzLnNldHRpbmdzLmF1dG8mJnMuc2V0dGluZ3MuYXV0b0NvbnRyb2xzJiZUKCkscy5zZXR0aW5ncy5wYWdlciYmdygpLChzLnNldHRpbmdzLmNvbnRyb2xzfHxzLnNldHRpbmdzLmF1dG9Db250cm9sc3x8cy5zZXR0aW5ncy5wYWdlcikmJnMudmlld3BvcnQuYWZ0ZXIocy5jb250cm9scy5lbCkpLGMoZSxnKX0sYz1mdW5jdGlvbihlLGkpe3ZhciBuPWUuZmluZCgnaW1nOm5vdChbc3JjPSIiXSksIGlmcmFtZScpLmxlbmd0aCxzPTA7cmV0dXJuIDA9PT1uP3ZvaWQgaSgpOnZvaWQgZS5maW5kKCdpbWc6bm90KFtzcmM9IiJdKSwgaWZyYW1lJykuZWFjaChmdW5jdGlvbigpe3QodGhpcykub25lKCJsb2FkIGVycm9yIixmdW5jdGlvbigpeysrcz09PW4mJmkoKX0pLmVhY2goZnVuY3Rpb24oKXt0aGlzLmNvbXBsZXRlJiZ0KHRoaXMpLnRyaWdnZXIoImxvYWQiKX0pfSl9LGc9ZnVuY3Rpb24oKXtpZihzLnNldHRpbmdzLmluZmluaXRlTG9vcCYmImZhZGUiIT09cy5zZXR0aW5ncy5tb2RlJiYhcy5zZXR0aW5ncy50aWNrZXIpe3ZhciBlPSJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGU/cy5zZXR0aW5ncy5taW5TbGlkZXM6cy5zZXR0aW5ncy5tYXhTbGlkZXMsaT1zLmNoaWxkcmVuLnNsaWNlKDAsZSkuY2xvbmUoITApLmFkZENsYXNzKCJieC1jbG9uZSIpLG49cy5jaGlsZHJlbi5zbGljZSgtZSkuY2xvbmUoITApLmFkZENsYXNzKCJieC1jbG9uZSIpO3Muc2V0dGluZ3MuYXJpYUhpZGRlbiYmKGkuYXR0cigiYXJpYS1oaWRkZW4iLCEwKSxuLmF0dHIoImFyaWEtaGlkZGVuIiwhMCkpLG8uYXBwZW5kKGkpLnByZXBlbmQobil9cy5sb2FkZXIucmVtb3ZlKCksbSgpLCJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGUmJihzLnNldHRpbmdzLmFkYXB0aXZlSGVpZ2h0PSEwKSxzLnZpZXdwb3J0LmhlaWdodChwKCkpLG8ucmVkcmF3U2xpZGVyKCkscy5zZXR0aW5ncy5vblNsaWRlckxvYWQuY2FsbChvLHMuYWN0aXZlLmluZGV4KSxzLmluaXRpYWxpemVkPSEwLHMuc2V0dGluZ3MucmVzcG9uc2l2ZSYmdCh3aW5kb3cpLmJpbmQoInJlc2l6ZSIsWikscy5zZXR0aW5ncy5hdXRvJiZzLnNldHRpbmdzLmF1dG9TdGFydCYmKGYoKT4xfHxzLnNldHRpbmdzLmF1dG9TbGlkZUZvck9uZVBhZ2UpJiZIKCkscy5zZXR0aW5ncy50aWNrZXImJlcoKSxzLnNldHRpbmdzLnBhZ2VyJiZJKHMuc2V0dGluZ3Muc3RhcnRTbGlkZSkscy5zZXR0aW5ncy5jb250cm9scyYmRCgpLHMuc2V0dGluZ3MudG91Y2hFbmFibGVkJiYhcy5zZXR0aW5ncy50aWNrZXImJk4oKSxzLnNldHRpbmdzLmtleWJvYXJkRW5hYmxlZCYmIXMuc2V0dGluZ3MudGlja2VyJiZ0KGRvY3VtZW50KS5rZXlkb3duKEYpfSxwPWZ1bmN0aW9uKCl7dmFyIGU9MCxuPXQoKTtpZigidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlfHxzLnNldHRpbmdzLmFkYXB0aXZlSGVpZ2h0KWlmKHMuY2Fyb3VzZWwpe3ZhciBvPTE9PT1zLnNldHRpbmdzLm1vdmVTbGlkZXM/cy5hY3RpdmUuaW5kZXg6cy5hY3RpdmUuaW5kZXgqeCgpO2ZvcihuPXMuY2hpbGRyZW4uZXEobyksaT0xO2k8PXMuc2V0dGluZ3MubWF4U2xpZGVzLTE7aSsrKW49bytpPj1zLmNoaWxkcmVuLmxlbmd0aD9uLmFkZChzLmNoaWxkcmVuLmVxKGktMSkpOm4uYWRkKHMuY2hpbGRyZW4uZXEobytpKSl9ZWxzZSBuPXMuY2hpbGRyZW4uZXEocy5hY3RpdmUuaW5kZXgpO2Vsc2Ugbj1zLmNoaWxkcmVuO3JldHVybiJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGU/KG4uZWFjaChmdW5jdGlvbihpKXtlKz10KHRoaXMpLm91dGVySGVpZ2h0KCl9KSxzLnNldHRpbmdzLnNsaWRlTWFyZ2luPjAmJihlKz1zLnNldHRpbmdzLnNsaWRlTWFyZ2luKihzLnNldHRpbmdzLm1pblNsaWRlcy0xKSkpOmU9TWF0aC5tYXguYXBwbHkoTWF0aCxuLm1hcChmdW5jdGlvbigpe3JldHVybiB0KHRoaXMpLm91dGVySGVpZ2h0KCExKX0pLmdldCgpKSwiYm9yZGVyLWJveCI9PT1zLnZpZXdwb3J0LmNzcygiYm94LXNpemluZyIpP2UrPXBhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoInBhZGRpbmctdG9wIikpK3BhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoInBhZGRpbmctYm90dG9tIikpK3BhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoImJvcmRlci10b3Atd2lkdGgiKSkrcGFyc2VGbG9hdChzLnZpZXdwb3J0LmNzcygiYm9yZGVyLWJvdHRvbS13aWR0aCIpKToicGFkZGluZy1ib3giPT09cy52aWV3cG9ydC5jc3MoImJveC1zaXppbmciKSYmKGUrPXBhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoInBhZGRpbmctdG9wIikpK3BhcnNlRmxvYXQocy52aWV3cG9ydC5jc3MoInBhZGRpbmctYm90dG9tIikpKSxlfSx1PWZ1bmN0aW9uKCl7dmFyIHQ9IjEwMCUiO3JldHVybiBzLnNldHRpbmdzLnNsaWRlV2lkdGg+MCYmKHQ9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlP3Muc2V0dGluZ3MubWF4U2xpZGVzKnMuc2V0dGluZ3Muc2xpZGVXaWR0aCsocy5zZXR0aW5ncy5tYXhTbGlkZXMtMSkqcy5zZXR0aW5ncy5zbGlkZU1hcmdpbjpzLnNldHRpbmdzLnNsaWRlV2lkdGgpLHR9LGg9ZnVuY3Rpb24oKXt2YXIgdD1zLnNldHRpbmdzLnNsaWRlV2lkdGgsZT1zLnZpZXdwb3J0LndpZHRoKCk7aWYoMD09PXMuc2V0dGluZ3Muc2xpZGVXaWR0aHx8cy5zZXR0aW5ncy5zbGlkZVdpZHRoPmUmJiFzLmNhcm91c2VsfHwidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlKXQ9ZTtlbHNlIGlmKHMuc2V0dGluZ3MubWF4U2xpZGVzPjEmJiJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZSl7aWYoZT5zLm1heFRocmVzaG9sZClyZXR1cm4gdDtlPHMubWluVGhyZXNob2xkP3Q9KGUtcy5zZXR0aW5ncy5zbGlkZU1hcmdpbioocy5zZXR0aW5ncy5taW5TbGlkZXMtMSkpL3Muc2V0dGluZ3MubWluU2xpZGVzOnMuc2V0dGluZ3Muc2hyaW5rSXRlbXMmJih0PU1hdGguZmxvb3IoKGUrcy5zZXR0aW5ncy5zbGlkZU1hcmdpbikvTWF0aC5jZWlsKChlK3Muc2V0dGluZ3Muc2xpZGVNYXJnaW4pLyh0K3Muc2V0dGluZ3Muc2xpZGVNYXJnaW4pKS1zLnNldHRpbmdzLnNsaWRlTWFyZ2luKSl9cmV0dXJuIHR9LHY9ZnVuY3Rpb24oKXt2YXIgdD0xLGU9bnVsbDtyZXR1cm4iaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGUmJnMuc2V0dGluZ3Muc2xpZGVXaWR0aD4wP3Mudmlld3BvcnQud2lkdGgoKTxzLm1pblRocmVzaG9sZD90PXMuc2V0dGluZ3MubWluU2xpZGVzOnMudmlld3BvcnQud2lkdGgoKT5zLm1heFRocmVzaG9sZD90PXMuc2V0dGluZ3MubWF4U2xpZGVzOihlPXMuY2hpbGRyZW4uZmlyc3QoKS53aWR0aCgpK3Muc2V0dGluZ3Muc2xpZGVNYXJnaW4sdD1NYXRoLmZsb29yKChzLnZpZXdwb3J0LndpZHRoKCkrcy5zZXR0aW5ncy5zbGlkZU1hcmdpbikvZSkpOiJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGUmJih0PXMuc2V0dGluZ3MubWluU2xpZGVzKSx0fSxmPWZ1bmN0aW9uKCl7dmFyIHQ9MCxlPTAsaT0wO2lmKHMuc2V0dGluZ3MubW92ZVNsaWRlcz4wKWlmKHMuc2V0dGluZ3MuaW5maW5pdGVMb29wKXQ9TWF0aC5jZWlsKHMuY2hpbGRyZW4ubGVuZ3RoL3goKSk7ZWxzZSBmb3IoO2U8cy5jaGlsZHJlbi5sZW5ndGg7KSsrdCxlPWkrdigpLGkrPXMuc2V0dGluZ3MubW92ZVNsaWRlczw9digpP3Muc2V0dGluZ3MubW92ZVNsaWRlczp2KCk7ZWxzZSB0PU1hdGguY2VpbChzLmNoaWxkcmVuLmxlbmd0aC92KCkpO3JldHVybiB0fSx4PWZ1bmN0aW9uKCl7cmV0dXJuIHMuc2V0dGluZ3MubW92ZVNsaWRlcz4wJiZzLnNldHRpbmdzLm1vdmVTbGlkZXM8PXYoKT9zLnNldHRpbmdzLm1vdmVTbGlkZXM6digpfSxtPWZ1bmN0aW9uKCl7dmFyIHQsZSxpO3MuY2hpbGRyZW4ubGVuZ3RoPnMuc2V0dGluZ3MubWF4U2xpZGVzJiZzLmFjdGl2ZS5sYXN0JiYhcy5zZXR0aW5ncy5pbmZpbml0ZUxvb3A/Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPyhlPXMuY2hpbGRyZW4ubGFzdCgpLHQ9ZS5wb3NpdGlvbigpLFMoLSh0LmxlZnQtKHMudmlld3BvcnQud2lkdGgoKS1lLm91dGVyV2lkdGgoKSkpLCJyZXNldCIsMCkpOiJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGUmJihpPXMuY2hpbGRyZW4ubGVuZ3RoLXMuc2V0dGluZ3MubWluU2xpZGVzLHQ9cy5jaGlsZHJlbi5lcShpKS5wb3NpdGlvbigpLFMoLXQudG9wLCJyZXNldCIsMCkpOih0PXMuY2hpbGRyZW4uZXEocy5hY3RpdmUuaW5kZXgqeCgpKS5wb3NpdGlvbigpLHMuYWN0aXZlLmluZGV4PT09ZigpLTEmJihzLmFjdGl2ZS5sYXN0PSEwKSx2b2lkIDAhPT10JiYoImhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlP1MoLXQubGVmdCwicmVzZXQiLDApOiJ2ZXJ0aWNhbCI9PT1zLnNldHRpbmdzLm1vZGUmJlMoLXQudG9wLCJyZXNldCIsMCkpKX0sUz1mdW5jdGlvbihlLGksbixyKXt2YXIgYSxsO3MudXNpbmdDU1M/KGw9InZlcnRpY2FsIj09PXMuc2V0dGluZ3MubW9kZT8idHJhbnNsYXRlM2QoMCwgIitlKyJweCwgMCkiOiJ0cmFuc2xhdGUzZCgiK2UrInB4LCAwLCAwKSIsby5jc3MoIi0iK3MuY3NzUHJlZml4KyItdHJhbnNpdGlvbi1kdXJhdGlvbiIsbi8xZTMrInMiKSwic2xpZGUiPT09aT8oby5jc3Mocy5hbmltUHJvcCxsKSwwIT09bj9vLmJpbmQoInRyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQiLGZ1bmN0aW9uKGUpe3QoZS50YXJnZXQpLmlzKG8pJiYoby51bmJpbmQoInRyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQiKSxxKCkpfSk6cSgpKToicmVzZXQiPT09aT9vLmNzcyhzLmFuaW1Qcm9wLGwpOiJ0aWNrZXIiPT09aSYmKG8uY3NzKCItIitzLmNzc1ByZWZpeCsiLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIiwibGluZWFyIiksby5jc3Mocy5hbmltUHJvcCxsKSwwIT09bj9vLmJpbmQoInRyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQiLGZ1bmN0aW9uKGUpe3QoZS50YXJnZXQpLmlzKG8pJiYoby51bmJpbmQoInRyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQiKSxTKHIucmVzZXRWYWx1ZSwicmVzZXQiLDApLEwoKSl9KTooUyhyLnJlc2V0VmFsdWUsInJlc2V0IiwwKSxMKCkpKSk6KGE9e30sYVtzLmFuaW1Qcm9wXT1lLCJzbGlkZSI9PT1pP28uYW5pbWF0ZShhLG4scy5zZXR0aW5ncy5lYXNpbmcsZnVuY3Rpb24oKXtxKCl9KToicmVzZXQiPT09aT9vLmNzcyhzLmFuaW1Qcm9wLGUpOiJ0aWNrZXIiPT09aSYmby5hbmltYXRlKGEsbiwibGluZWFyIixmdW5jdGlvbigpe1Moci5yZXNldFZhbHVlLCJyZXNldCIsMCksTCgpfSkpfSxiPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPSIiLGk9IiIsbj1mKCksbz0wO288bjtvKyspaT0iIixzLnNldHRpbmdzLmJ1aWxkUGFnZXImJnQuaXNGdW5jdGlvbihzLnNldHRpbmdzLmJ1aWxkUGFnZXIpfHxzLnNldHRpbmdzLnBhZ2VyQ3VzdG9tPyhpPXMuc2V0dGluZ3MuYnVpbGRQYWdlcihvKSxzLnBhZ2VyRWwuYWRkQ2xhc3MoImJ4LWN1c3RvbS1wYWdlciIpKTooaT1vKzEscy5wYWdlckVsLmFkZENsYXNzKCJieC1kZWZhdWx0LXBhZ2VyIikpLGUrPSc8ZGl2IGNsYXNzPSJieC1wYWdlci1pdGVtIj48YSBocmVmPSIiIGRhdGEtc2xpZGUtaW5kZXg9IicrbysnIiBjbGFzcz0iYngtcGFnZXItbGluayI+JytpKyI8L2E+PC9kaXY+IjtzLnBhZ2VyRWwuaHRtbChlKX0sdz1mdW5jdGlvbigpe3Muc2V0dGluZ3MucGFnZXJDdXN0b20/cy5wYWdlckVsPXQocy5zZXR0aW5ncy5wYWdlckN1c3RvbSk6KHMucGFnZXJFbD10KCc8ZGl2IGNsYXNzPSJieC1wYWdlciIgLz4nKSxzLnNldHRpbmdzLnBhZ2VyU2VsZWN0b3I/dChzLnNldHRpbmdzLnBhZ2VyU2VsZWN0b3IpLmh0bWwocy5wYWdlckVsKTpzLmNvbnRyb2xzLmVsLmFkZENsYXNzKCJieC1oYXMtcGFnZXIiKS5hcHBlbmQocy5wYWdlckVsKSxiKCkpLHMucGFnZXJFbC5vbigiY2xpY2sgdG91Y2hlbmQiLCJhIix6KX0sQz1mdW5jdGlvbigpe3MuY29udHJvbHMubmV4dD10KCc8YSBjbGFzcz0iYngtbmV4dCIgaHJlZj0iIj4nK3Muc2V0dGluZ3MubmV4dFRleHQrIjwvYT4iKSxzLmNvbnRyb2xzLnByZXY9dCgnPGEgY2xhc3M9ImJ4LXByZXYiIGhyZWY9IiI+JytzLnNldHRpbmdzLnByZXZUZXh0KyI8L2E+Iikscy5jb250cm9scy5uZXh0LmJpbmQoImNsaWNrIHRvdWNoZW5kIixFKSxzLmNvbnRyb2xzLnByZXYuYmluZCgiY2xpY2sgdG91Y2hlbmQiLGspLHMuc2V0dGluZ3MubmV4dFNlbGVjdG9yJiZ0KHMuc2V0dGluZ3MubmV4dFNlbGVjdG9yKS5hcHBlbmQocy5jb250cm9scy5uZXh0KSxzLnNldHRpbmdzLnByZXZTZWxlY3RvciYmdChzLnNldHRpbmdzLnByZXZTZWxlY3RvcikuYXBwZW5kKHMuY29udHJvbHMucHJldikscy5zZXR0aW5ncy5uZXh0U2VsZWN0b3J8fHMuc2V0dGluZ3MucHJldlNlbGVjdG9yfHwocy5jb250cm9scy5kaXJlY3Rpb25FbD10KCc8ZGl2IGNsYXNzPSJieC1jb250cm9scy1kaXJlY3Rpb24iIC8+Jykscy5jb250cm9scy5kaXJlY3Rpb25FbC5hcHBlbmQocy5jb250cm9scy5wcmV2KS5hcHBlbmQocy5jb250cm9scy5uZXh0KSxzLmNvbnRyb2xzLmVsLmFkZENsYXNzKCJieC1oYXMtY29udHJvbHMtZGlyZWN0aW9uIikuYXBwZW5kKHMuY29udHJvbHMuZGlyZWN0aW9uRWwpKX0sVD1mdW5jdGlvbigpe3MuY29udHJvbHMuc3RhcnQ9dCgnPGRpdiBjbGFzcz0iYngtY29udHJvbHMtYXV0by1pdGVtIj48YSBjbGFzcz0iYngtc3RhcnQiIGhyZWY9IiI+JytzLnNldHRpbmdzLnN0YXJ0VGV4dCsiPC9hPjwvZGl2PiIpLHMuY29udHJvbHMuc3RvcD10KCc8ZGl2IGNsYXNzPSJieC1jb250cm9scy1hdXRvLWl0ZW0iPjxhIGNsYXNzPSJieC1zdG9wIiBocmVmPSIiPicrcy5zZXR0aW5ncy5zdG9wVGV4dCsiPC9hPjwvZGl2PiIpLHMuY29udHJvbHMuYXV0b0VsPXQoJzxkaXYgY2xhc3M9ImJ4LWNvbnRyb2xzLWF1dG8iIC8+Jykscy5jb250cm9scy5hdXRvRWwub24oImNsaWNrIiwiLmJ4LXN0YXJ0IixNKSxzLmNvbnRyb2xzLmF1dG9FbC5vbigiY2xpY2siLCIuYngtc3RvcCIseSkscy5zZXR0aW5ncy5hdXRvQ29udHJvbHNDb21iaW5lP3MuY29udHJvbHMuYXV0b0VsLmFwcGVuZChzLmNvbnRyb2xzLnN0YXJ0KTpzLmNvbnRyb2xzLmF1dG9FbC5hcHBlbmQocy5jb250cm9scy5zdGFydCkuYXBwZW5kKHMuY29udHJvbHMuc3RvcCkscy5zZXR0aW5ncy5hdXRvQ29udHJvbHNTZWxlY3Rvcj90KHMuc2V0dGluZ3MuYXV0b0NvbnRyb2xzU2VsZWN0b3IpLmh0bWwocy5jb250cm9scy5hdXRvRWwpOnMuY29udHJvbHMuZWwuYWRkQ2xhc3MoImJ4LWhhcy1jb250cm9scy1hdXRvIikuYXBwZW5kKHMuY29udHJvbHMuYXV0b0VsKSxBKHMuc2V0dGluZ3MuYXV0b1N0YXJ0PyJzdG9wIjoic3RhcnQiKX0sUD1mdW5jdGlvbigpe3MuY2hpbGRyZW4uZWFjaChmdW5jdGlvbihlKXt2YXIgaT10KHRoaXMpLmZpbmQoImltZzpmaXJzdCIpLmF0dHIoInRpdGxlIik7dm9pZCAwIT09aSYmKCIiK2kpLmxlbmd0aCYmdCh0aGlzKS5hcHBlbmQoJzxkaXYgY2xhc3M9ImJ4LWNhcHRpb24iPjxzcGFuPicraSsiPC9zcGFuPjwvZGl2PiIpfSl9LEU9ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHMuY29udHJvbHMuZWwuaGFzQ2xhc3MoImRpc2FibGVkIil8fChzLnNldHRpbmdzLmF1dG8mJnMuc2V0dGluZ3Muc3RvcEF1dG9PbkNsaWNrJiZvLnN0b3BBdXRvKCksby5nb1RvTmV4dFNsaWRlKCkpfSxrPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSxzLmNvbnRyb2xzLmVsLmhhc0NsYXNzKCJkaXNhYmxlZCIpfHwocy5zZXR0aW5ncy5hdXRvJiZzLnNldHRpbmdzLnN0b3BBdXRvT25DbGljayYmby5zdG9wQXV0bygpLG8uZ29Ub1ByZXZTbGlkZSgpKX0sTT1mdW5jdGlvbih0KXtvLnN0YXJ0QXV0bygpLHQucHJldmVudERlZmF1bHQoKX0seT1mdW5jdGlvbih0KXtvLnN0b3BBdXRvKCksdC5wcmV2ZW50RGVmYXVsdCgpfSx6PWZ1bmN0aW9uKGUpe3ZhciBpLG47ZS5wcmV2ZW50RGVmYXVsdCgpLHMuY29udHJvbHMuZWwuaGFzQ2xhc3MoImRpc2FibGVkIil8fChzLnNldHRpbmdzLmF1dG8mJnMuc2V0dGluZ3Muc3RvcEF1dG9PbkNsaWNrJiZvLnN0b3BBdXRvKCksaT10KGUuY3VycmVudFRhcmdldCksdm9pZCAwIT09aS5hdHRyKCJkYXRhLXNsaWRlLWluZGV4IikmJihuPXBhcnNlSW50KGkuYXR0cigiZGF0YS1zbGlkZS1pbmRleCIpKSxuIT09cy5hY3RpdmUuaW5kZXgmJm8uZ29Ub1NsaWRlKG4pKSl9LEk9ZnVuY3Rpb24oZSl7dmFyIGk9cy5jaGlsZHJlbi5sZW5ndGg7cmV0dXJuInNob3J0Ij09PXMuc2V0dGluZ3MucGFnZXJUeXBlPyhzLnNldHRpbmdzLm1heFNsaWRlcz4xJiYoaT1NYXRoLmNlaWwocy5jaGlsZHJlbi5sZW5ndGgvcy5zZXR0aW5ncy5tYXhTbGlkZXMpKSx2b2lkIHMucGFnZXJFbC5odG1sKGUrMStzLnNldHRpbmdzLnBhZ2VyU2hvcnRTZXBhcmF0b3IraSkpOihzLnBhZ2VyRWwuZmluZCgiYSIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSx2b2lkIHMucGFnZXJFbC5lYWNoKGZ1bmN0aW9uKGksbil7dChuKS5maW5kKCJhIikuZXEoZSkuYWRkQ2xhc3MoImFjdGl2ZSIpfSkpfSxxPWZ1bmN0aW9uKCl7aWYocy5zZXR0aW5ncy5pbmZpbml0ZUxvb3Ape3ZhciB0PSIiOzA9PT1zLmFjdGl2ZS5pbmRleD90PXMuY2hpbGRyZW4uZXEoMCkucG9zaXRpb24oKTpzLmFjdGl2ZS5pbmRleD09PWYoKS0xJiZzLmNhcm91c2VsP3Q9cy5jaGlsZHJlbi5lcSgoZigpLTEpKngoKSkucG9zaXRpb24oKTpzLmFjdGl2ZS5pbmRleD09PXMuY2hpbGRyZW4ubGVuZ3RoLTEmJih0PXMuY2hpbGRyZW4uZXEocy5jaGlsZHJlbi5sZW5ndGgtMSkucG9zaXRpb24oKSksdCYmKCJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT9TKC10LmxlZnQsInJlc2V0IiwwKToidmVydGljYWwiPT09cy5zZXR0aW5ncy5tb2RlJiZTKC10LnRvcCwicmVzZXQiLDApKX1zLndvcmtpbmc9ITEscy5zZXR0aW5ncy5vblNsaWRlQWZ0ZXIuY2FsbChvLHMuY2hpbGRyZW4uZXEocy5hY3RpdmUuaW5kZXgpLHMub2xkSW5kZXgscy5hY3RpdmUuaW5kZXgpfSxBPWZ1bmN0aW9uKHQpe3Muc2V0dGluZ3MuYXV0b0NvbnRyb2xzQ29tYmluZT9zLmNvbnRyb2xzLmF1dG9FbC5odG1sKHMuY29udHJvbHNbdF0pOihzLmNvbnRyb2xzLmF1dG9FbC5maW5kKCJhIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLHMuY29udHJvbHMuYXV0b0VsLmZpbmQoImE6bm90KC5ieC0iK3QrIikiKS5hZGRDbGFzcygiYWN0aXZlIikpfSxEPWZ1bmN0aW9uKCl7MT09PWYoKT8ocy5jb250cm9scy5wcmV2LmFkZENsYXNzKCJkaXNhYmxlZCIpLHMuY29udHJvbHMubmV4dC5hZGRDbGFzcygiZGlzYWJsZWQiKSk6IXMuc2V0dGluZ3MuaW5maW5pdGVMb29wJiZzLnNldHRpbmdzLmhpZGVDb250cm9sT25FbmQmJigwPT09cy5hY3RpdmUuaW5kZXg/KHMuY29udHJvbHMucHJldi5hZGRDbGFzcygiZGlzYWJsZWQiKSxzLmNvbnRyb2xzLm5leHQucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikpOnMuYWN0aXZlLmluZGV4PT09ZigpLTE/KHMuY29udHJvbHMubmV4dC5hZGRDbGFzcygiZGlzYWJsZWQiKSxzLmNvbnRyb2xzLnByZXYucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikpOihzLmNvbnRyb2xzLnByZXYucmVtb3ZlQ2xhc3MoImRpc2FibGVkIikscy5jb250cm9scy5uZXh0LnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpKSl9LEg9ZnVuY3Rpb24oKXtpZihzLnNldHRpbmdzLmF1dG9EZWxheT4wKXtzZXRUaW1lb3V0KG8uc3RhcnRBdXRvLHMuc2V0dGluZ3MuYXV0b0RlbGF5KX1lbHNlIG8uc3RhcnRBdXRvKCksdCh3aW5kb3cpLmZvY3VzKGZ1bmN0aW9uKCl7by5zdGFydEF1dG8oKX0pLmJsdXIoZnVuY3Rpb24oKXtvLnN0b3BBdXRvKCl9KTtzLnNldHRpbmdzLmF1dG9Ib3ZlciYmby5ob3ZlcihmdW5jdGlvbigpe3MuaW50ZXJ2YWwmJihvLnN0b3BBdXRvKCEwKSxzLmF1dG9QYXVzZWQ9ITApfSxmdW5jdGlvbigpe3MuYXV0b1BhdXNlZCYmKG8uc3RhcnRBdXRvKCEwKSxzLmF1dG9QYXVzZWQ9bnVsbCl9KX0sVz1mdW5jdGlvbigpe3ZhciBlLGksbixyLGEsbCxkLGMsZz0wOyJuZXh0Ij09PXMuc2V0dGluZ3MuYXV0b0RpcmVjdGlvbj9vLmFwcGVuZChzLmNoaWxkcmVuLmNsb25lKCkuYWRkQ2xhc3MoImJ4LWNsb25lIikpOihvLnByZXBlbmQocy5jaGlsZHJlbi5jbG9uZSgpLmFkZENsYXNzKCJieC1jbG9uZSIpKSxlPXMuY2hpbGRyZW4uZmlyc3QoKS5wb3NpdGlvbigpLGc9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPy1lLmxlZnQ6LWUudG9wKSxTKGcsInJlc2V0IiwwKSxzLnNldHRpbmdzLnBhZ2VyPSExLHMuc2V0dGluZ3MuY29udHJvbHM9ITEscy5zZXR0aW5ncy5hdXRvQ29udHJvbHM9ITEscy5zZXR0aW5ncy50aWNrZXJIb3ZlciYmKHMudXNpbmdDU1M/KHI9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPzQ6NSxzLnZpZXdwb3J0LmhvdmVyKGZ1bmN0aW9uKCl7aT1vLmNzcygiLSIrcy5jc3NQcmVmaXgrIi10cmFuc2Zvcm0iKSxuPXBhcnNlRmxvYXQoaS5zcGxpdCgiLCIpW3JdKSxTKG4sInJlc2V0IiwwKX0sZnVuY3Rpb24oKXtjPTAscy5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKGUpe2MrPSJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT90KHRoaXMpLm91dGVyV2lkdGgoITApOnQodGhpcykub3V0ZXJIZWlnaHQoITApfSksYT1zLnNldHRpbmdzLnNwZWVkL2MsbD0iaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGU/ImxlZnQiOiJ0b3AiLGQ9YSooYy1NYXRoLmFicyhwYXJzZUludChuKSkpLEwoZCl9KSk6cy52aWV3cG9ydC5ob3ZlcihmdW5jdGlvbigpe28uc3RvcCgpfSxmdW5jdGlvbigpe2M9MCxzLmNoaWxkcmVuLmVhY2goZnVuY3Rpb24oZSl7Yys9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlP3QodGhpcykub3V0ZXJXaWR0aCghMCk6dCh0aGlzKS5vdXRlckhlaWdodCghMCl9KSxhPXMuc2V0dGluZ3Muc3BlZWQvYyxsPSJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8ibGVmdCI6InRvcCIsZD1hKihjLU1hdGguYWJzKHBhcnNlSW50KG8uY3NzKGwpKSkpLEwoZCl9KSksTCgpfSxMPWZ1bmN0aW9uKHQpe3ZhciBlLGksbixyPXQ/dDpzLnNldHRpbmdzLnNwZWVkLGE9e2xlZnQ6MCx0b3A6MH0sbD17bGVmdDowLHRvcDowfTsibmV4dCI9PT1zLnNldHRpbmdzLmF1dG9EaXJlY3Rpb24/YT1vLmZpbmQoIi5ieC1jbG9uZSIpLmZpcnN0KCkucG9zaXRpb24oKTpsPXMuY2hpbGRyZW4uZmlyc3QoKS5wb3NpdGlvbigpLGU9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPy1hLmxlZnQ6LWEudG9wLGk9Imhvcml6b250YWwiPT09cy5zZXR0aW5ncy5tb2RlPy1sLmxlZnQ6LWwudG9wLG49e3Jlc2V0VmFsdWU6aX0sUyhlLCJ0aWNrZXIiLHIsbil9LE89ZnVuY3Rpb24oZSl7dmFyIGk9dCh3aW5kb3cpLG49e3RvcDppLnNjcm9sbFRvcCgpLGxlZnQ6aS5zY3JvbGxMZWZ0KCl9LHM9ZS5vZmZzZXQoKTtyZXR1cm4gbi5yaWdodD1uLmxlZnQraS53aWR0aCgpLG4uYm90dG9tPW4udG9wK2kuaGVpZ2h0KCkscy5yaWdodD1zLmxlZnQrZS5vdXRlcldpZHRoKCkscy5ib3R0b209cy50b3ArZS5vdXRlckhlaWdodCgpLCEobi5yaWdodDxzLmxlZnR8fG4ubGVmdD5zLnJpZ2h0fHxuLmJvdHRvbTxzLnRvcHx8bi50b3A+cy5ib3R0b20pfSxGPWZ1bmN0aW9uKHQpe3ZhciBlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpLGk9ImlucHV0fHRleHRhcmVhIixuPW5ldyBSZWdFeHAoZSxbImkiXSkscz1uLmV4ZWMoaSk7aWYobnVsbD09cyYmTyhvKSl7aWYoMzk9PT10LmtleUNvZGUpcmV0dXJuIEUodCksITE7aWYoMzc9PT10LmtleUNvZGUpcmV0dXJuIGsodCksITF9fSxOPWZ1bmN0aW9uKCl7cy50b3VjaD17c3RhcnQ6e3g6MCx5OjB9LGVuZDp7eDowLHk6MH19LHMudmlld3BvcnQuYmluZCgidG91Y2hzdGFydCBNU1BvaW50ZXJEb3duIHBvaW50ZXJkb3duIixYKSxzLnZpZXdwb3J0Lm9uKCJjbGljayIsIi5ieHNsaWRlciBhIixmdW5jdGlvbih0KXtzLnZpZXdwb3J0Lmhhc0NsYXNzKCJjbGljay1kaXNhYmxlZCIpJiYodC5wcmV2ZW50RGVmYXVsdCgpLHMudmlld3BvcnQucmVtb3ZlQ2xhc3MoImNsaWNrLWRpc2FibGVkIikpfSl9LFg9ZnVuY3Rpb24odCl7aWYocy5jb250cm9scy5lbC5hZGRDbGFzcygiZGlzYWJsZWQiKSxzLndvcmtpbmcpdC5wcmV2ZW50RGVmYXVsdCgpLHMuY29udHJvbHMuZWwucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik7ZWxzZXtzLnRvdWNoLm9yaWdpbmFsUG9zPW8ucG9zaXRpb24oKTt2YXIgZT10Lm9yaWdpbmFsRXZlbnQsaT0idW5kZWZpbmVkIiE9dHlwZW9mIGUuY2hhbmdlZFRvdWNoZXM/ZS5jaGFuZ2VkVG91Y2hlczpbZV07cy50b3VjaC5zdGFydC54PWlbMF0ucGFnZVgscy50b3VjaC5zdGFydC55PWlbMF0ucGFnZVkscy52aWV3cG9ydC5nZXQoMCkuc2V0UG9pbnRlckNhcHR1cmUmJihzLnBvaW50ZXJJZD1lLnBvaW50ZXJJZCxzLnZpZXdwb3J0LmdldCgwKS5zZXRQb2ludGVyQ2FwdHVyZShzLnBvaW50ZXJJZCkpLHMudmlld3BvcnQuYmluZCgidG91Y2htb3ZlIE1TUG9pbnRlck1vdmUgcG9pbnRlcm1vdmUiLFYpLHMudmlld3BvcnQuYmluZCgidG91Y2hlbmQgTVNQb2ludGVyVXAgcG9pbnRlcnVwIixSKSxzLnZpZXdwb3J0LmJpbmQoIk1TUG9pbnRlckNhbmNlbCBwb2ludGVyY2FuY2VsIixZKX19LFk9ZnVuY3Rpb24odCl7UyhzLnRvdWNoLm9yaWdpbmFsUG9zLmxlZnQsInJlc2V0IiwwKSxzLmNvbnRyb2xzLmVsLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpLHMudmlld3BvcnQudW5iaW5kKCJNU1BvaW50ZXJDYW5jZWwgcG9pbnRlcmNhbmNlbCIsWSkscy52aWV3cG9ydC51bmJpbmQoInRvdWNobW92ZSBNU1BvaW50ZXJNb3ZlIHBvaW50ZXJtb3ZlIixWKSxzLnZpZXdwb3J0LnVuYmluZCgidG91Y2hlbmQgTVNQb2ludGVyVXAgcG9pbnRlcnVwIixSKSxzLnZpZXdwb3J0LmdldCgwKS5yZWxlYXNlUG9pbnRlckNhcHR1cmUmJnMudmlld3BvcnQuZ2V0KDApLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShzLnBvaW50ZXJJZCl9LFY9ZnVuY3Rpb24odCl7dmFyIGU9dC5vcmlnaW5hbEV2ZW50LGk9InVuZGVmaW5lZCIhPXR5cGVvZiBlLmNoYW5nZWRUb3VjaGVzP2UuY2hhbmdlZFRvdWNoZXM6W2VdLG49TWF0aC5hYnMoaVswXS5wYWdlWC1zLnRvdWNoLnN0YXJ0LngpLG89TWF0aC5hYnMoaVswXS5wYWdlWS1zLnRvdWNoLnN0YXJ0LnkpLHI9MCxhPTA7MypuPm8mJnMuc2V0dGluZ3MucHJldmVudERlZmF1bHRTd2lwZVg/dC5wcmV2ZW50RGVmYXVsdCgpOjMqbz5uJiZzLnNldHRpbmdzLnByZXZlbnREZWZhdWx0U3dpcGVZJiZ0LnByZXZlbnREZWZhdWx0KCksImZhZGUiIT09cy5zZXR0aW5ncy5tb2RlJiZzLnNldHRpbmdzLm9uZVRvT25lVG91Y2gmJigiaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGU/KGE9aVswXS5wYWdlWC1zLnRvdWNoLnN0YXJ0Lngscj1zLnRvdWNoLm9yaWdpbmFsUG9zLmxlZnQrYSk6KGE9aVswXS5wYWdlWS1zLnRvdWNoLnN0YXJ0Lnkscj1zLnRvdWNoLm9yaWdpbmFsUG9zLnRvcCthKSxTKHIsInJlc2V0IiwwKSl9LFI9ZnVuY3Rpb24odCl7cy52aWV3cG9ydC51bmJpbmQoInRvdWNobW92ZSBNU1BvaW50ZXJNb3ZlIHBvaW50ZXJtb3ZlIixWKSxzLmNvbnRyb2xzLmVsLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpO3ZhciBlPXQub3JpZ2luYWxFdmVudCxpPSJ1bmRlZmluZWQiIT10eXBlb2YgZS5jaGFuZ2VkVG91Y2hlcz9lLmNoYW5nZWRUb3VjaGVzOltlXSxuPTAscj0wO3MudG91Y2guZW5kLng9aVswXS5wYWdlWCxzLnRvdWNoLmVuZC55PWlbMF0ucGFnZVksImZhZGUiPT09cy5zZXR0aW5ncy5tb2RlPyhyPU1hdGguYWJzKHMudG91Y2guc3RhcnQueC1zLnRvdWNoLmVuZC54KSxyPj1zLnNldHRpbmdzLnN3aXBlVGhyZXNob2xkJiYocy50b3VjaC5zdGFydC54PnMudG91Y2guZW5kLng/by5nb1RvTmV4dFNsaWRlKCk6by5nb1RvUHJldlNsaWRlKCksby5zdG9wQXV0bygpKSk6KCJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8ocj1zLnRvdWNoLmVuZC54LXMudG91Y2guc3RhcnQueCxuPXMudG91Y2gub3JpZ2luYWxQb3MubGVmdCk6KHI9cy50b3VjaC5lbmQueS1zLnRvdWNoLnN0YXJ0Lnksbj1zLnRvdWNoLm9yaWdpbmFsUG9zLnRvcCksIXMuc2V0dGluZ3MuaW5maW5pdGVMb29wJiYoMD09PXMuYWN0aXZlLmluZGV4JiZyPjB8fHMuYWN0aXZlLmxhc3QmJnI8MCk/UyhuLCJyZXNldCIsMjAwKTpNYXRoLmFicyhyKT49cy5zZXR0aW5ncy5zd2lwZVRocmVzaG9sZD8ocjwwP28uZ29Ub05leHRTbGlkZSgpOm8uZ29Ub1ByZXZTbGlkZSgpLG8uc3RvcEF1dG8oKSk6UyhuLCJyZXNldCIsMjAwKSkscy52aWV3cG9ydC51bmJpbmQoInRvdWNoZW5kIE1TUG9pbnRlclVwIHBvaW50ZXJ1cCIsUikscy52aWV3cG9ydC5nZXQoMCkucmVsZWFzZVBvaW50ZXJDYXB0dXJlJiZzLnZpZXdwb3J0LmdldCgwKS5yZWxlYXNlUG9pbnRlckNhcHR1cmUocy5wb2ludGVySWQpfSxaPWZ1bmN0aW9uKGUpe2lmKHMuaW5pdGlhbGl6ZWQpaWYocy53b3JraW5nKXdpbmRvdy5zZXRUaW1lb3V0KFosMTApO2Vsc2V7dmFyIGk9dCh3aW5kb3cpLndpZHRoKCksbj10KHdpbmRvdykuaGVpZ2h0KCk7cj09PWkmJmE9PT1ufHwocj1pLGE9bixvLnJlZHJhd1NsaWRlcigpLHMuc2V0dGluZ3Mub25TbGlkZXJSZXNpemUuY2FsbChvLHMuYWN0aXZlLmluZGV4KSl9fSxCPWZ1bmN0aW9uKHQpe3ZhciBlPXYoKTtzLnNldHRpbmdzLmFyaWFIaWRkZW4mJiFzLnNldHRpbmdzLnRpY2tlciYmKHMuY2hpbGRyZW4uYXR0cigiYXJpYS1oaWRkZW4iLCJ0cnVlIikscy5jaGlsZHJlbi5zbGljZSh0LHQrZSkuYXR0cigiYXJpYS1oaWRkZW4iLCJmYWxzZSIpKX0sVT1mdW5jdGlvbih0KXtyZXR1cm4gdDwwP3Muc2V0dGluZ3MuaW5maW5pdGVMb29wP2YoKS0xOnMuYWN0aXZlLmluZGV4OnQ+PWYoKT9zLnNldHRpbmdzLmluZmluaXRlTG9vcD8wOnMuYWN0aXZlLmluZGV4OnR9O3JldHVybiBvLmdvVG9TbGlkZT1mdW5jdGlvbihlLGkpe3ZhciBuLHIsYSxsLGQ9ITAsYz0wLGc9e2xlZnQ6MCx0b3A6MH0sdT1udWxsO2lmKHMub2xkSW5kZXg9cy5hY3RpdmUuaW5kZXgscy5hY3RpdmUuaW5kZXg9VShlKSwhcy53b3JraW5nJiZzLmFjdGl2ZS5pbmRleCE9PXMub2xkSW5kZXgpe2lmKHMud29ya2luZz0hMCxkPXMuc2V0dGluZ3Mub25TbGlkZUJlZm9yZS5jYWxsKG8scy5jaGlsZHJlbi5lcShzLmFjdGl2ZS5pbmRleCkscy5vbGRJbmRleCxzLmFjdGl2ZS5pbmRleCksInVuZGVmaW5lZCIhPXR5cGVvZiBkJiYhZClyZXR1cm4gcy5hY3RpdmUuaW5kZXg9cy5vbGRJbmRleCx2b2lkKHMud29ya2luZz0hMSk7Im5leHQiPT09aT9zLnNldHRpbmdzLm9uU2xpZGVOZXh0LmNhbGwobyxzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KSxzLm9sZEluZGV4LHMuYWN0aXZlLmluZGV4KXx8KGQ9ITEpOiJwcmV2Ij09PWkmJihzLnNldHRpbmdzLm9uU2xpZGVQcmV2LmNhbGwobyxzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KSxzLm9sZEluZGV4LHMuYWN0aXZlLmluZGV4KXx8KGQ9ITEpKSxzLmFjdGl2ZS5sYXN0PXMuYWN0aXZlLmluZGV4Pj1mKCktMSwocy5zZXR0aW5ncy5wYWdlcnx8cy5zZXR0aW5ncy5wYWdlckN1c3RvbSkmJkkocy5hY3RpdmUuaW5kZXgpLHMuc2V0dGluZ3MuY29udHJvbHMmJkQoKSwiZmFkZSI9PT1zLnNldHRpbmdzLm1vZGU/KHMuc2V0dGluZ3MuYWRhcHRpdmVIZWlnaHQmJnMudmlld3BvcnQuaGVpZ2h0KCkhPT1wKCkmJnMudmlld3BvcnQuYW5pbWF0ZSh7aGVpZ2h0OnAoKX0scy5zZXR0aW5ncy5hZGFwdGl2ZUhlaWdodFNwZWVkKSxzLmNoaWxkcmVuLmZpbHRlcigiOnZpc2libGUiKS5mYWRlT3V0KHMuc2V0dGluZ3Muc3BlZWQpLmNzcyh7ekluZGV4OjB9KSxzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KS5jc3MoInpJbmRleCIscy5zZXR0aW5ncy5zbGlkZVpJbmRleCsxKS5mYWRlSW4ocy5zZXR0aW5ncy5zcGVlZCxmdW5jdGlvbigpe3QodGhpcykuY3NzKCJ6SW5kZXgiLHMuc2V0dGluZ3Muc2xpZGVaSW5kZXgpLHEoKX0pKToocy5zZXR0aW5ncy5hZGFwdGl2ZUhlaWdodCYmcy52aWV3cG9ydC5oZWlnaHQoKSE9PXAoKSYmcy52aWV3cG9ydC5hbmltYXRlKHtoZWlnaHQ6cCgpfSxzLnNldHRpbmdzLmFkYXB0aXZlSGVpZ2h0U3BlZWQpLCFzLnNldHRpbmdzLmluZmluaXRlTG9vcCYmcy5jYXJvdXNlbCYmcy5hY3RpdmUubGFzdD8iaG9yaXpvbnRhbCI9PT1zLnNldHRpbmdzLm1vZGU/KHU9cy5jaGlsZHJlbi5lcShzLmNoaWxkcmVuLmxlbmd0aC0xKSxnPXUucG9zaXRpb24oKSxjPXMudmlld3BvcnQud2lkdGgoKS11Lm91dGVyV2lkdGgoKSk6KG49cy5jaGlsZHJlbi5sZW5ndGgtcy5zZXR0aW5ncy5taW5TbGlkZXMsZz1zLmNoaWxkcmVuLmVxKG4pLnBvc2l0aW9uKCkpOnMuY2Fyb3VzZWwmJnMuYWN0aXZlLmxhc3QmJiJwcmV2Ij09PWk/KHI9MT09PXMuc2V0dGluZ3MubW92ZVNsaWRlcz9zLnNldHRpbmdzLm1heFNsaWRlcy14KCk6KGYoKS0xKSp4KCktKHMuY2hpbGRyZW4ubGVuZ3RoLXMuc2V0dGluZ3MubWF4U2xpZGVzKSx1PW8uY2hpbGRyZW4oIi5ieC1jbG9uZSIpLmVxKHIpLGc9dS5wb3NpdGlvbigpKToibmV4dCI9PT1pJiYwPT09cy5hY3RpdmUuaW5kZXg/KGc9by5maW5kKCI+IC5ieC1jbG9uZSIpLmVxKHMuc2V0dGluZ3MubWF4U2xpZGVzKS5wb3NpdGlvbigpLHMuYWN0aXZlLmxhc3Q9ITEpOmU+PTAmJihsPWUqcGFyc2VJbnQoeCgpKSxnPXMuY2hpbGRyZW4uZXEobCkucG9zaXRpb24oKSksInVuZGVmaW5lZCIhPXR5cGVvZiBnPyhhPSJob3Jpem9udGFsIj09PXMuc2V0dGluZ3MubW9kZT8tKGcubGVmdC1jKTotZy50b3AsUyhhLCJzbGlkZSIscy5zZXR0aW5ncy5zcGVlZCkpOnMud29ya2luZz0hMSkscy5zZXR0aW5ncy5hcmlhSGlkZGVuJiZCKHMuYWN0aXZlLmluZGV4KngoKSl9fSxvLmdvVG9OZXh0U2xpZGU9ZnVuY3Rpb24oKXtpZihzLnNldHRpbmdzLmluZmluaXRlTG9vcHx8IXMuYWN0aXZlLmxhc3Qpe3ZhciB0PXBhcnNlSW50KHMuYWN0aXZlLmluZGV4KSsxO28uZ29Ub1NsaWRlKHQsIm5leHQiKX19LG8uZ29Ub1ByZXZTbGlkZT1mdW5jdGlvbigpe2lmKHMuc2V0dGluZ3MuaW5maW5pdGVMb29wfHwwIT09cy5hY3RpdmUuaW5kZXgpe3ZhciB0PXBhcnNlSW50KHMuYWN0aXZlLmluZGV4KS0xO28uZ29Ub1NsaWRlKHQsInByZXYiKX19LG8uc3RhcnRBdXRvPWZ1bmN0aW9uKHQpe3MuaW50ZXJ2YWx8fChzLmludGVydmFsPXNldEludGVydmFsKGZ1bmN0aW9uKCl7Im5leHQiPT09cy5zZXR0aW5ncy5hdXRvRGlyZWN0aW9uP28uZ29Ub05leHRTbGlkZSgpOm8uZ29Ub1ByZXZTbGlkZSgpfSxzLnNldHRpbmdzLnBhdXNlKSxzLnNldHRpbmdzLmF1dG9Db250cm9scyYmdCE9PSEwJiZBKCJzdG9wIikpfSxvLnN0b3BBdXRvPWZ1bmN0aW9uKHQpe3MuaW50ZXJ2YWwmJihjbGVhckludGVydmFsKHMuaW50ZXJ2YWwpLHMuaW50ZXJ2YWw9bnVsbCxzLnNldHRpbmdzLmF1dG9Db250cm9scyYmdCE9PSEwJiZBKCJzdGFydCIpKX0sby5nZXRDdXJyZW50U2xpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gcy5hY3RpdmUuaW5kZXh9LG8uZ2V0Q3VycmVudFNsaWRlRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiBzLmNoaWxkcmVuLmVxKHMuYWN0aXZlLmluZGV4KX0sby5nZXRTbGlkZUVsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHMuY2hpbGRyZW4uZXEodCl9LG8uZ2V0U2xpZGVDb3VudD1mdW5jdGlvbigpe3JldHVybiBzLmNoaWxkcmVuLmxlbmd0aH0sby5pc1dvcmtpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gcy53b3JraW5nfSxvLnJlZHJhd1NsaWRlcj1mdW5jdGlvbigpe3MuY2hpbGRyZW4uYWRkKG8uZmluZCgiLmJ4LWNsb25lIikpLm91dGVyV2lkdGgoaCgpKSxzLnZpZXdwb3J0LmNzcygiaGVpZ2h0IixwKCkpLHMuc2V0dGluZ3MudGlja2VyfHxtKCkscy5hY3RpdmUubGFzdCYmKHMuYWN0aXZlLmluZGV4PWYoKS0xKSxzLmFjdGl2ZS5pbmRleD49ZigpJiYocy5hY3RpdmUubGFzdD0hMCkscy5zZXR0aW5ncy5wYWdlciYmIXMuc2V0dGluZ3MucGFnZXJDdXN0b20mJihiKCksSShzLmFjdGl2ZS5pbmRleCkpLHMuc2V0dGluZ3MuYXJpYUhpZGRlbiYmQihzLmFjdGl2ZS5pbmRleCp4KCkpfSxvLmRlc3Ryb3lTbGlkZXI9ZnVuY3Rpb24oKXtzLmluaXRpYWxpemVkJiYocy5pbml0aWFsaXplZD0hMSx0KCIuYngtY2xvbmUiLHRoaXMpLnJlbW92ZSgpLHMuY2hpbGRyZW4uZWFjaChmdW5jdGlvbigpe3ZvaWQgMCE9PXQodGhpcykuZGF0YSgib3JpZ1N0eWxlIik/dCh0aGlzKS5hdHRyKCJzdHlsZSIsdCh0aGlzKS5kYXRhKCJvcmlnU3R5bGUiKSk6dCh0aGlzKS5yZW1vdmVBdHRyKCJzdHlsZSIpfSksdm9pZCAwIT09dCh0aGlzKS5kYXRhKCJvcmlnU3R5bGUiKT90aGlzLmF0dHIoInN0eWxlIix0KHRoaXMpLmRhdGEoIm9yaWdTdHlsZSIpKTp0KHRoaXMpLnJlbW92ZUF0dHIoInN0eWxlIiksdCh0aGlzKS51bndyYXAoKS51bndyYXAoKSxzLmNvbnRyb2xzLmVsJiZzLmNvbnRyb2xzLmVsLnJlbW92ZSgpLHMuY29udHJvbHMubmV4dCYmcy5jb250cm9scy5uZXh0LnJlbW92ZSgpLHMuY29udHJvbHMucHJldiYmcy5jb250cm9scy5wcmV2LnJlbW92ZSgpLHMucGFnZXJFbCYmcy5zZXR0aW5ncy5jb250cm9scyYmIXMuc2V0dGluZ3MucGFnZXJDdXN0b20mJnMucGFnZXJFbC5yZW1vdmUoKSx0KCIuYngtY2FwdGlvbiIsdGhpcykucmVtb3ZlKCkscy5jb250cm9scy5hdXRvRWwmJnMuY29udHJvbHMuYXV0b0VsLnJlbW92ZSgpLGNsZWFySW50ZXJ2YWwocy5pbnRlcnZhbCkscy5zZXR0aW5ncy5yZXNwb25zaXZlJiZ0KHdpbmRvdykudW5iaW5kKCJyZXNpemUiLFopLHMuc2V0dGluZ3Mua2V5Ym9hcmRFbmFibGVkJiZ0KGRvY3VtZW50KS51bmJpbmQoImtleWRvd24iLEYpLHQodGhpcykucmVtb3ZlRGF0YSgiYnhTbGlkZXIiKSl9LG8ucmVsb2FkU2xpZGVyPWZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUmJihuPWUpLG8uZGVzdHJveVNsaWRlcigpLGwoKSx0KG8pLmRhdGEoImJ4U2xpZGVyIix0aGlzKX0sbCgpLHQobykuZGF0YSgiYnhTbGlkZXIiLHRoaXMpLHRoaXN9fX0oalF1ZXJ5KTsoZnVuY3Rpb24oJCl7JC5mbi5ldmVuWm9vbT1mdW5jdGlvbihvcHRpb25zKXt2YXIgZXZlblpvb209bmV3IEV2ZW5ab29tKCQodGhpcyksb3B0aW9ucyk7JCh0aGlzKS5tb3VzZWVudGVyKGZ1bmN0aW9uKCl7ZXZlblpvb20uY2hlY2tJbWFnZUNoYW5nZWQoJCh0aGlzKSk7ZXZlblpvb20uc2hvd0xlbnMoKX0pLm1vdXNlbW92ZShmdW5jdGlvbihlKXtldmVuWm9vbS5tb3ZlTGVucyhlLnBhZ2VYLGUucGFnZVkpfSkubW91c2VsZWF2ZShmdW5jdGlvbigpe2V2ZW5ab29tLmhpZGVMZW5zKCl9KX07ZnVuY3Rpb24gRXZlblpvb20oJGNvbnRhaW5lcixvcHRpb25zKXt0aGlzLl9pbml0PWZ1bmN0aW9uKHNldHRpbmdzKXtpZih0eXBlb2Ygc2V0dGluZ3MhPSJvYmplY3QiKXtzZXR0aW5ncz17fX0KdGhpcy5zZXR0aW5ncz17bGVuc1Bpbm5pbmdEaXN0YW5jZToyMH07dGhpcy5zZXR0aW5ncz0kLmV4dGVuZCh0aGlzLnNldHRpbmdzLHNldHRpbmdzKTt0aGlzLiRjb250YWluZXI9JGNvbnRhaW5lcjt0aGlzLiRjb250YWluZXIuYWRkQ2xhc3MoImV2ZW5ab29tIikuYXBwZW5kKCI8ZGl2IGNsYXNzPVwiZXZlblpvb21MZW5zIGhpZGRlblwiPjwvZGl2PiIpO3RoaXMuX2NhbGN1bGF0ZUltYWdlc1NpemUoKTt0aGlzLiRsZW5zPSQoIi5ldmVuWm9vbUxlbnMiLHRoaXMuJGNvbnRhaW5lcik7dGhpcy4kbGVucy5jc3MoImJhY2tncm91bmQtaW1hZ2UiLCJ1cmwoJyIrdGhpcy56b29tZWRJbWdTcmMrIicpIik7dGhpcy5sZW5zV2lkdGg9dGhpcy4kbGVucy53aWR0aCgpO3RoaXMubGVuc0hlaWdodD10aGlzLiRsZW5zLmhlaWdodCgpO3RoaXMubGVuc1dpZHRoSGFsZj10aGlzLmxlbnNXaWR0aC8yO3RoaXMubGVuc0hlaWdodEhhbGY9dGhpcy5sZW5zSGVpZ2h0LzI7dGhpcy5jdXJyZW50TGVuc1Bvc2l0aW9uWD0wO3RoaXMuY3VycmVudExlbnNQb3NpdGlvblk9MH07dGhpcy5fY2FsY3VsYXRlSW1hZ2VzU2l6ZT1mdW5jdGlvbigpe3RoaXMuaW1nU3JjPXRoaXMuX2ZpbmRPcmlnaW5hbEltZyh0aGlzLiRjb250YWluZXIpO3RoaXMuem9vbWVkSW1nU3JjPXRoaXMuJGNvbnRhaW5lci5kYXRhKCJ6b29tZWQiKTtpZih0aGlzLnpvb21lZEltZ1NyYyl7dmFyIHRoYXQ9dGhpczskKCI8aW1nIHNyYz0nIit0aGlzLmltZ1NyYysiJy8+Iikub24oJ2xvYWQnLGZ1bmN0aW9uKCl7dmFyIGltZ1dpZHRoPXRoaXMud2lkdGg7dmFyIGltZ0hlaWdodD10aGlzLmhlaWdodDt0aGF0LmNvbnRhaW50ZXJXaWR0aD10aGF0LiRjb250YWluZXIud2lkdGgoKTt0aGF0LmNvbnRhaW50ZXJIZWlnaHQ9dGhhdC4kY29udGFpbmVyLmhlaWdodCgpOyQoIjxpbWcgc3JjPSciK3RoYXQuem9vbWVkSW1nU3JjKyInLz4iKS5vbignbG9hZCcsZnVuY3Rpb24oKXtpZih0aGlzLndpZHRoPGltZ1dpZHRofHx0aGlzLmhlaWdodDxpbWdIZWlnaHQpe3RoYXQuem9vbWVkSW1nU3JjPXRoYXQuaW1nU3JjO3RoYXQuaW1nV2lkdGhSYXRpbz0xO3RoYXQuaW1nSGVpZ2h0UmF0aW89MX0KZWxzZXt0aGF0LmltZ1dpZHRoUmF0aW89dGhpcy53aWR0aC9pbWdXaWR0aDt0aGF0LmltZ0hlaWdodFJhdGlvPXRoaXMuaGVpZ2h0L2ltZ0hlaWdodH19KX0pfQplbHNle2NvbnNvbGUud2FybigiTm8gem9vbWVkIGltZyBmb3VuZCwgcGxlYXNlIHNldCBcImRhdGEtem9vbWVkXCIgZm9yIGV2ZW5ab29tIHNlbGVjdG9yIil9fTt0aGlzLl9maW5kT3JpZ2luYWxJbWc9ZnVuY3Rpb24oJGNvbnRhaW5lcil7aWYoJCgiaW1nIiwkY29udGFpbmVyKS5sZW5ndGgpe3JldHVybiAkKCJpbWc6Zmlyc3QiLCRjb250YWluZXIpLmF0dHIoInNyYyIpfQpjb25zb2xlLndhcm4oIk5vIG9yaWdpbmFsIGltZyBmb3VuZCwgcGxlYXNlIGFkZCBhbiA8aW1nPiB0YWcgaW5zaWRlIGV2ZW5ab29tIHNlbGVjdG9yIik7cmV0dXJuITF9O3RoaXMuY2FsY3VsYXRlQmFja2dyb3VuZFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIGJhY2tncm91bmRQb3NYPSgodGhpcy5jdXJyZW50TGVuc1Bvc2l0aW9uWC10aGlzLiRjb250YWluZXIub2Zmc2V0KCkubGVmdCt0aGlzLmxlbnNXaWR0aEhhbGYpKnRoaXMuaW1nV2lkdGhSYXRpbykqKC0xKSt0aGlzLmxlbnNXaWR0aEhhbGY7dmFyIGJhY2tncm91bmRQb3NZPSgodGhpcy5jdXJyZW50TGVuc1Bvc2l0aW9uWS10aGlzLiRjb250YWluZXIub2Zmc2V0KCkudG9wK3RoaXMubGVuc0hlaWdodEhhbGYpKnRoaXMuaW1nSGVpZ2h0UmF0aW8pKigtMSkrdGhpcy5sZW5zSGVpZ2h0SGFsZjt0aGlzLiRsZW5zLmNzcygiYmFja2dyb3VuZC1wb3NpdGlvbiIsYmFja2dyb3VuZFBvc1grInB4ICIrYmFja2dyb3VuZFBvc1krInB4Iil9O3RoaXMuX2luaXQob3B0aW9ucyl9CkV2ZW5ab29tLnByb3RvdHlwZS5zaG93TGVucz1mdW5jdGlvbigpe3RoaXMuJGxlbnMucmVtb3ZlQ2xhc3MoImhpZGRlbiIpfTtFdmVuWm9vbS5wcm90b3R5cGUuaGlkZUxlbnM9ZnVuY3Rpb24oKXt0aGlzLiRsZW5zLmFkZENsYXNzKCJoaWRkZW4iKX07RXZlblpvb20ucHJvdG90eXBlLmNoZWNrSW1hZ2VDaGFuZ2VkPWZ1bmN0aW9uKCRjb250YWluZXIpe3ZhciBuZXdJbWdTcmM9dGhpcy5fZmluZE9yaWdpbmFsSW1nKCRjb250YWluZXIpO2lmKG5ld0ltZ1NyYyE9dGhpcy5pbWdTcmMpe2lmKG5ld0ltZ1NyYyE9ITEpe3RoaXMucmVpbml0aWFsaXplKCRjb250YWluZXIpfQplbHNle3RoaXMuaGlkZUxlbnMoKX19fTtFdmVuWm9vbS5wcm90b3R5cGUucmVpbml0aWFsaXplPWZ1bmN0aW9uKCRjb250YWluZXIpe3RoaXMuJGNvbnRhaW5lcj0kY29udGFpbmVyO3RoaXMuY29udGFpbnRlcldpZHRoPXRoaXMuJGNvbnRhaW5lci53aWR0aCgpO3RoaXMuY29udGFpbnRlckhlaWdodD10aGlzLiRjb250YWluZXIuaGVpZ2h0KCk7dGhpcy5fY2FsY3VsYXRlSW1hZ2VzU2l6ZSgpO3RoaXMuJGxlbnMuY3NzKCJiYWNrZ3JvdW5kLWltYWdlIiwidXJsKCciK3RoaXMuem9vbWVkSW1nU3JjKyInKSIpfTtFdmVuWm9vbS5wcm90b3R5cGUubW92ZUxlbnM9ZnVuY3Rpb24obmV3UG9zWCxuZXdQb3NZKXt2YXIgbGVuc1Bvc1g9bmV3UG9zWC10aGlzLmxlbnNXaWR0aEhhbGY7dmFyIGxlbnNQb3NZPW5ld1Bvc1ktdGhpcy5sZW5zSGVpZ2h0SGFsZjt2YXIgbWluTGVuc1Bvc1g9dGhpcy4kY29udGFpbmVyLm9mZnNldCgpLmxlZnQtdGhpcy5sZW5zV2lkdGhIYWxmO3ZhciBtaW5MZW5zUG9zWT10aGlzLiRjb250YWluZXIub2Zmc2V0KCkudG9wLXRoaXMubGVuc0hlaWdodEhhbGY7dmFyIG1heExlbnNQb3NYPW1pbkxlbnNQb3NYK3RoaXMuY29udGFpbnRlcldpZHRoO3ZhciBtYXhMZW5zUG9zWT1taW5MZW5zUG9zWSt0aGlzLmNvbnRhaW50ZXJIZWlnaHQ7dmFyIGhpZGVMZW5zPSExO2lmKGxlbnNQb3NYPD1taW5MZW5zUG9zWCl7aWYobWluTGVuc1Bvc1gtbGVuc1Bvc1g+PXRoaXMuc2V0dGluZ3MubGVuc1Bpbm5pbmdEaXN0YW5jZSl7aGlkZUxlbnM9ITB9CmxlbnNQb3NYPW1pbkxlbnNQb3NYfWVsc2UgaWYobGVuc1Bvc1g+PW1heExlbnNQb3NYKXtpZihsZW5zUG9zWC1tYXhMZW5zUG9zWD49dGhpcy5zZXR0aW5ncy5sZW5zUGlubmluZ0Rpc3RhbmNlKXtoaWRlTGVucz0hMH0KbGVuc1Bvc1g9bWF4TGVuc1Bvc1h9CmlmKGxlbnNQb3NZPD1taW5MZW5zUG9zWSl7aWYobWluTGVuc1Bvc1ktbGVuc1Bvc1k+PXRoaXMuc2V0dGluZ3MubGVuc1Bpbm5pbmdEaXN0YW5jZSl7aGlkZUxlbnM9ITB9CmxlbnNQb3NZPW1pbkxlbnNQb3NZfWVsc2UgaWYobGVuc1Bvc1k+PW1heExlbnNQb3NZKXtpZihsZW5zUG9zWS1tYXhMZW5zUG9zWT49dGhpcy5zZXR0aW5ncy5sZW5zUGlubmluZ0Rpc3RhbmNlKXtoaWRlTGVucz0hMH0KbGVuc1Bvc1k9bWF4TGVuc1Bvc1l9CmlmKCFoaWRlTGVucyl7dGhpcy5zaG93TGVucygpfQplbHNle3RoaXMuaGlkZUxlbnMoKX0KdGhpcy4kbGVucy5vZmZzZXQoe2xlZnQ6bGVuc1Bvc1gsdG9wOmxlbnNQb3NZfSk7dGhpcy5jdXJyZW50TGVuc1Bvc2l0aW9uWD1sZW5zUG9zWDt0aGlzLmN1cnJlbnRMZW5zUG9zaXRpb25ZPWxlbnNQb3NZO3RoaXMuY2FsY3VsYXRlQmFja2dyb3VuZFBvc2l0aW9uKCl9fShqUXVlcnkpKTt2YXIgYWRkclR5cGVzX21hcD1uZXcgQXJyYXkoKTthZGRyVHlwZXNfbWFwLmI9J2JpbGxpbmcnO2FkZHJUeXBlc19tYXAucz0nc2hpcHBpbmcnO3ZhciBhZGRyPW5ldyBPYmplY3QoKTthZGRyLnN0YXRlPScnO2FkZHIuY291bnR5PScnO2FkZHIuY2l0eT0nJzthZGRyLmNvdW50cnk9Jyc7dmFyIGNob3NlQWRkcj0wOyQod2luZG93KS5vbignbG9hZCcsZnVuY3Rpb24oKXskKCIjYWNjb3VudF9kaWFsb2ciKS5kaWFsb2coe2F1dG9PcGVuOiExLHJlc2l6YWJsZTohMCxkcmFnZ2FibGU6ITAsbW9kYWw6ITAsd2lkdGg6MzIwLGhlaWdodDoyMDAsY2xvc2U6ZnVuY3Rpb24oKXskKHRoaXMpLmh0bWwoJycpfX0pfSk7ZnVuY3Rpb24gY2xlYXJfZmllbGRTZXQoKXskKCIuYWRkcmVzcy1maWVsZCwgLmFjY291bnQtZmllbGQiKS52YWwoJycpfQpmdW5jdGlvbiBjbGVhcl9hVHlwZV9maWVsZFNldChhdCl7JCgiIyIrYWRkclR5cGVzX21hcFthdF0rIl9hZGRyZXNzX2Jsb2NrIC5hZGRyZXNzLWZpZWxkLCAjIithZGRyVHlwZXNfbWFwW2F0XSsiX2FkZHJlc3NfYmxvY2sgLmFjY291bnQtZmllbGQiKS52YWwoJycpfQpmdW5jdGlvbiB0b2dnbGVfcmVxKGZsZCl7dmFyIGNmPWFkZHIuY291bnRyeTt2YXIgY3dsPWNvdW50cmllc193aXRoX3N0YXRlczt2YXIgZmxkSXNSZXE9c3RhdGVfZmxkSXNSZXE7aWYoZmxkLmlkPT0nY291bnR5Jyl7ZmxkSXNSZXE9Y291bnR5X2ZsZElzUmVxO2N3bD1jb3VudHJpZXNfd2l0aF9jb3VudGllc30KaWYoZmxkSXNSZXE9PSJ0cnVlIiYmY3dsLmluZGV4T2YoY2YpPi0xKXskKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygnaW52YWxpZCBhbGVydCcpOyQoIiNmbGRTZXRfIitmbGQuaWQrIiBsYWJlbC5hY2N0LWxibCBpLnJlcXVpcmVkLWluZGljYXRvciIpLnNob3coKTskKCIjZmxkU2V0XyIrZmxkLmlkKyIgOmlucHV0LCAjZmxkU2V0XyIrZmxkLmlkKyIgc2VsZWN0IikuYWRkQ2xhc3MoInJlcS1mbGQiKS5hdHRyKCJhcmlhLXJlcXVpcmVkIiwhMCk7aWYoZmxkLmlkPT0ic3RhdGUiKXt0b2dnbGVfb3RoZXJTdGF0ZSgnJyk7JCgiI3N0YXRlX290aGVyIikuYXR0cigicGxhY2Vob2xkZXIiLHBsYWNlaG9sZGVyX3N0YXRlT3RoZXIpOyQoIiNzdGF0ZV9vdGhlcl9mbGQiKS5jc3MoIm1hcmdpbi10b3AiLCI0cHgiKTskKCIjc3RhdGUiKS5zaG93KCl9fWVsc2V7JCgiI2ZsZFNldF8iK2ZsZC5pZCkucmVtb3ZlQ2xhc3MoJ2ludmFsaWQgYWxlcnQnKTskKCIjZmxkU2V0XyIrZmxkLmlkKyIgbGFiZWwuYWNjdC1sYmwgaS5yZXF1aXJlZC1pbmRpY2F0b3IiKS5oaWRlKCk7JCgiI2ZsZFNldF8iK2ZsZC5pZCsiIDppbnB1dCwgI2ZsZFNldF8iK2ZsZC5pZCsiIHNlbGVjdCIpLnJlbW92ZUNsYXNzKCJyZXEtZmxkIikuYXR0cigiYXJpYS1yZXF1aXJlZCIsITEpO2lmKGZsZC5pZD09InN0YXRlIil7aWYoY3dsLmluZGV4T2YoY2YpPDApe3RvZ2dsZV9vdGhlclN0YXRlKCdvdGhlcicpOyQoIiNzdGF0ZSIpLmhpZGUoKTskKCIjc3RhdGVfb3RoZXIiKS5hdHRyKCJwbGFjZWhvbGRlciIsJycpOyQoIiNzdGF0ZV9vdGhlcl9mbGQiKS5jc3MoIm1hcmdpbi10b3AiLCIwIil9ZWxzZXt0b2dnbGVfb3RoZXJTdGF0ZSgnJyk7JCgiI3N0YXRlX290aGVyIikuYXR0cigicGxhY2Vob2xkZXIiLHBsYWNlaG9sZGVyX3N0YXRlT3RoZXIpOyQoIiNzdGF0ZV9vdGhlcl9mbGQiKS5jc3MoIm1hcmdpbi10b3AiLCI0cHgiKTskKCIjc3RhdGUiKS5zaG93KCl9fX19CnZhciBvcmlnQ291bnRyeT0nJzt2YXIgb3JpZ1N0YXRlPScnO2Z1bmN0aW9uIHNlbGVjdENvdW50cnkoY09iail7dmFyIHNmTmFtZT1jT2JqLmlkO3ZhciBzT2JqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0ZScpO2FkZHIuY291bnRyeT1jT2JqLnZhbHVlO2FkZHIuc3RhdGU9c09iai52YWx1ZTt2YXIgb1N0YXRlPSQoIiNzdGF0ZV9vdGhlciIpLnZhbCgpO2lmKG9TdGF0ZSE9InVuZGVmaW5lZCIpe2FkZHIuc3RhdGVfb3RoZXI9b1N0YXRlfQokLnBvc3QoYWNjb3VudF9hamF4X2ZpbGUse3NlbEdldDoiZ2V0U3RhdGUiLGZBY3Rpb246Zm9ybUFjdGlvbixzZWxDb3VudHJ5OmFkZHIuY291bnRyeSxzZWxTdGF0ZTphZGRyLnN0YXRlLG90aGVyU3RhdGU6YWRkci5zdGF0ZV9vdGhlcixmbGROYW1lOnNmTmFtZSxyZXFGaWxlOnJlcXVlc3RpbmdGaWxlfSxmdW5jdGlvbihkYXRhKXt2YWxpZGF0ZV9mbGRWYWwoY09iaik7JChzT2JqKS5odG1sKGRhdGEuZmllbGQpO3ZhciBzVmFsPXNPYmoudmFsdWU7dmFyIHNNaW5MZW49JChzT2JqKS5hdHRyKCdkYXRhLW1pbi1sZW5ndGgnKTt2YXIgc29WYWw9JCgiI3N0YXRlX290aGVyIikudmFsKCk7YWRkci5zdGF0ZT1zVmFsO2lmKHNWYWwhPW51bGwmJnNWYWwubGVuZ3RoPjAmJnNWYWwhPSdvdGhlcicpe2lmKG9yaWdTdGF0ZS5sZW5ndGg8MSl7b3JpZ1N0YXRlPXNWYWx9CnNlbGVjdFN0YXRlKCl9CnZhciBmbGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRlJyk7aWYoZmxkIT1udWxsJiZmbGQhPSJ1bmRlZmluZWQiJiZmbGQudmFsdWUhPSJ1bmRlZmluZWQiKXt0b2dnbGVfcmVxKGZsZCl9CnZhciBzUmVxPSQoIiNzdGF0ZSwgI3N0YXRlX290aGVyIikuaGFzQ2xhc3MoJ3JlcS1mbGQnKTtpZihzUmVxPT0hMSl7JCgiI2ZsZFNldF9zdGF0ZSIpLnJlbW92ZUNsYXNzKCJ2YWxpZCBpbnZhbGlkIGFsZXJ0Iil9ZWxzZXtpZigob3JpZ0NvdW50cnk9PWFkZHIuY291bnRyeSYmb3JpZ1N0YXRlIT1hZGRyLnN0YXRlKXx8b3JpZ0NvdW50cnkhPWFkZHIuY291bnRyeXx8YWRkci5zdGF0ZS5sZW5ndGg8MSl7aWYob3JpZ0NvdW50cnk9PWFkZHIuY291bnRyeSl7JChzT2JqKS52YWwob3JpZ1N0YXRlKTthZGRyLnN0YXRlPW9yaWdTdGF0ZX0KaWYoYWRkci5zdGF0ZS5sZW5ndGg+PXNNaW5MZW4pe2lmKG9yaWdDb3VudHJ5IT1hZGRyLmNvdW50cnkpe3ZhbGlkYXRlX2ZsZFZhbChzT2JqKX1lbHNleyQoIiNmbGRTZXRfc3RhdGUiKS5yZW1vdmVDbGFzcygiYWxlcnQgaW52YWxpZCIpLmFkZENsYXNzKCJ2YWxpZCIpfX1lbHNleyQoIiNmbGRTZXRfc3RhdGUiKS5yZW1vdmVDbGFzcygidmFsaWQgaW52YWxpZCIpLmFkZENsYXNzKCJhbGVydCIpfX19CmNoa19vazJzdWJtaXQoKTtmbGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvdW50eScpO2lmKGZsZCE9bnVsbCYmZmxkIT0idW5kZWZpbmVkIiYmZmxkLnZhbHVlIT0idW5kZWZpbmVkIil7dG9nZ2xlX3JlcShmbGQpfX0sImpzb24iKX0KZnVuY3Rpb24gdG9nZ2xlX290aGVyU3RhdGUoc3Mpe2lmKHNzIT0nb3RoZXInKXskKCIjc3RhdGVfb3RoZXIiKS5hdHRyKCduYW1lJywnc3RhdGVfb3RoZXInKS52YWwoJycpOyQoIiNzdGF0ZV9vdGhlcl9mbGQiKS5oaWRlKCk7JCgiI3N0YXRlIikuYXR0cignbmFtZScsJ3N0YXRlJyk7JCgiI3N0YXRlIikucHJvcCgnZGlzYWJsZWQnLCExKTskKCIjZmxkU2V0X3N0YXRlIikuc2hvdygpfWVsc2V7JCgiI3N0YXRlIikuYXR0cignbmFtZScsJ3N0YXRlX290aGVyJyk7JCgiI3N0YXRlX290aGVyX2ZsZCIpLnNob3coKTskKCIjc3RhdGVfb3RoZXIiKS5hdHRyKCduYW1lJywnc3RhdGUnKTskKCIjc3RhdGUiKS5wcm9wKCdkaXNhYmxlZCcsITApOyQoIiNmbGRTZXRfc3RhdGUiKS5oaWRlKCl9fQpmdW5jdGlvbiBzZWxlY3RTdGF0ZSgpe2FkZHIuc3RhdGU9JCgiI3N0YXRlIikudmFsKCk7dmFyIG9TdGF0ZT0kKCIjc3RhdGVfb3RoZXIiKS52YWwoKTtpZihvU3RhdGUhPSJ1bmRlZmluZWQiKXthZGRyLnN0YXRlX290aGVyPW9TdGF0ZX0KdG9nZ2xlX290aGVyU3RhdGUoYWRkci5zdGF0ZSl9CmZ1bmN0aW9uIHRvZ2dsZVBhc3N3b3Jkcygpe2lmKCQoIiNjcmVhdGVfYWNjb3VudCIpLmxlbmd0aD4wKXt2YXIgY2hrZD0kKCIjY3JlYXRlX2FjY291bnQiKS5wcm9wKCdjaGVja2VkJyk7Y3JlYXRlQWNjb3VudD0oY2hrZCE9MSYmZ3Vlc3RfYWxsb3dlZD09J3RydWUnPzA6MSk7aWYoY3JlYXRlQWNjb3VudD09MSl7JCgiI3Bhc3N3b3Jkc19ib3gsICNuZXdzbGV0dGVyX3NpZ251cF9zZXR0aW5nIikuc2hvdygpOyQoIiNhY2NvdW50X3N1Ym1pdDEgLnN1Ym1pdC1idXR0b24tbGFiZWwiKS5odG1sKGNyZWF0ZUFjY291bnRfYnV0dG9uVGV4dCk7JCgiI2FjY291bnRfc3VibWl0MSBzcGFuLmZhIikucmVtb3ZlQ2xhc3MoImZhLXVzZXItc2VjcmV0IikuYWRkQ2xhc3MoImZhLXVzZXItcGx1cyIpOyQoIi5wYXNzd29yZC1mbGQiKS52YWwoJycpOyQoIi5wYXNzd29yZC1mbGQiKS5wcm9wKCdkaXNhYmxlZCcsITEpOyQoIiNndWVzdF9hY2NvdW50IikudmFsKCcwJyl9ZWxzZXskKCIjcGFzc3dvcmRzX2JveCwgI25ld3NsZXR0ZXJfc2lnbnVwX3NldHRpbmciKS5oaWRlKCk7JCgiI2FjY291bnRfc3VibWl0MSAuc3VibWl0LWJ1dHRvbi1sYWJlbCIpLmh0bWwoY3JlYXRlR3Vlc3RfYnV0dG9uVGV4dCk7JCgiI2FjY291bnRfc3VibWl0MSBzcGFuLmZhIikucmVtb3ZlQ2xhc3MoImZhLXVzZXItcGx1cyIpLmFkZENsYXNzKCJmYS11c2VyLXNlY3JldCIpOyQoIi5wYXNzd29yZC1mbGQiKS52YWwoJycpOyQoIi5wYXNzd29yZC1mbGQiKS5wcm9wKCdkaXNhYmxlZCcsITApOyQoIiNndWVzdF9hY2NvdW50IikudmFsKCcxJyl9fX0KZnVuY3Rpb24gdG9nZ2xlX3NBZGRyX2VuYWJsZWQoYXQsY2Epe2lmKGF0PT0ncycpe2lmKGNhPT1hZGRySWRzLmIpeyQoIiNhZGRyZXNzX2VkaXRfZm9ybSA6aW5wdXQiKS5wcm9wKHtyZWFkb25seTohMCxkaXNhYmxlZDohMH0pO3JldHVybiExfWVsc2V7JCgiI2FkZHJlc3NfZWRpdF9mb3JtIDppbnB1dCIpLnByb3Aoe3JlYWRvbmx5OiExLGRpc2FibGVkOiExfSl9fQpyZXR1cm4hMH0KdmFyIGNob3NlQWRkcj0wO2Z1bmN0aW9uIHNob3dBZGRyRWRpdG9yKGF0LGNhKXthVHlwZT1hdDtjaG9zZUFkZHI9Y2E7Y2xvc2VFZGl0b3JzKCk7dmFyIGJhc2VBZGRyT2JqPSIjIithZGRyVHlwZXNfbWFwW2F0XSsiX2FkZHJlc3NfYmxvY2siOyQoYmFzZUFkZHJPYmorIiAuZWRpdC1idXR0b25zIikuaGlkZSgpOyQucG9zdChhY2NvdW50X2FqYXhfZmlsZSx7c2VsR2V0OiJhZGRyRWRpdEZybSIsYWRkcmVzc19pZDpjYSxhVHlwZTphdCxyZXFGaWxlOnJlcXVlc3RpbmdGaWxlfSxmdW5jdGlvbihkYXRhKXskKGJhc2VBZGRyT2JqKyIgLmFjdGlvbi1ibG9jayIpLmh0bWwoZGF0YS5hRnJtKTtvcmlnQ291bnRyeT0kKCIjY291bnRyeSIpLnZhbCgpO3ZhciBzQWRkck9uPXRvZ2dsZV9zQWRkcl9lbmFibGVkKGF0LGNhKTtpZihzQWRkck9uPT0hMCl7aW5pdF92YWxpZGF0aW9uKCl9fSwianNvbiIpfQpmdW5jdGlvbiBjbG9zZUVkaXRvcnMoKXskKCIuYWN0aW9uLWJsb2NrIikuaHRtbCgnJyk7JCgiLmVkaXQtYnV0dG9ucyIpLnNob3coKTtvcmlnQ291bnRyeT0nJztvcmlnU3RhdGU9Jyd9CmZ1bmN0aW9uIGxvYWRBZGRyZXNzKGF0LGFpZCl7YVR5cGU9YXQ7Y2hvc2VBZGRyPSQoIi5hZGRyZXNzLWNob29zZXJzOmNoZWNrZWQiKS52YWwoKTt2YXIgYmFzZUFkZHJPYmo9IiMiK2FkZHJUeXBlc19tYXBbYXRdKyJfYWRkcmVzc19ibG9jayI7JC5wb3N0KGFjY291bnRfYWpheF9maWxlLHtzZWxHZXQ6ImFkZHJFZGl0RnJtIixhVHlwZTphdCxhZGRyZXNzX2lkOmNob3NlQWRkcixyZXFGaWxlOnJlcXVlc3RpbmdGaWxlfSxmdW5jdGlvbihkYXRhKXskKGJhc2VBZGRyT2JqKyIgLmFjdGlvbi1ibG9jayIpLmh0bWwoZGF0YS5hRnJtKTt2YXIgc0FkZHJPbj10b2dnbGVfc0FkZHJfZW5hYmxlZChhdCxjaG9zZUFkZHIpO2lmKHNBZGRyT249PSEwKXtpbml0X3ZhbGlkYXRpb24oKX0KaWYoY2hvc2VBZGRyPT0wKXskKGJhc2VBZGRyT2JqKyIgLmFjdGlvbi1ibG9jayA6dGV4dCIpLnZhbCgnJyk7JCgiI2FjdGlvbiIpLnZhbCgnaW5zZXJ0Jyk7JCgiI2FkZHJlc3NfaWQiKS52YWwoJycpfWVsc2V7JCgiI2FjdGlvbiIpLnZhbCgndXBkYXRlJyk7JCgiI2FkZHJlc3NfaWQiKS52YWwoY2hvc2VBZGRyKTtpZihzQWRkck9uPT0hMCl7dmFsaWRhdGVGb3JtKCl9fQpjaGtfb2syc3VibWl0KCl9LCJqc29uIil9CmZ1bmN0aW9uIHNlbGVjdEFkZHJlc3MoYXQpe2Nob3NlQWRkcj0kKCIuYWRkcmVzcy1jaG9vc2VyczpjaGVja2VkIikudmFsKCk7dmFyIGJhc2VBZGRyT2JqPSIjIithZGRyVHlwZXNfbWFwW2F0XSsiX2FkZHJlc3NfYmxvY2siO2FkZHJJZHNbYXRdPWNob3NlQWRkcjskLnBvc3QoYWNjb3VudF9hamF4X2ZpbGUse3NlbEdldDoiYWRkclZpZXciLGFUeXBlOmF0LGFkZHJlc3NfaWQ6Y2hvc2VBZGRyLHJlcUZpbGU6cmVxdWVzdGluZ0ZpbGV9LGZ1bmN0aW9uKGRhdGEpeyQoIiNlZGl0X2FkZHJlc3NfaWQiKS52YWwoY2hvc2VBZGRyKTskKGJhc2VBZGRyT2JqKyIgLmFjdGlvbi1ibG9jayIpLmh0bWwoJycpOyQoYmFzZUFkZHJPYmorIiAudmlldy1ibG9jayIpLmh0bWwoZGF0YS5sYWJlbCk7JChiYXNlQWRkck9iaisiIC5lZGl0LWJ1dHRvbnMgYS5idG4iKS5hdHRyKCdvbmNsaWNrJywic2hvd0FkZHJFZGl0b3IoJyIrYXQrIicsICciK2Nob3NlQWRkcisiJykiKTskKGJhc2VBZGRyT2JqKyIgLmVkaXQtYnV0dG9ucyIpLnNob3coKTskKCIjIithZGRyVHlwZXNfbWFwW2F0XSsiX2FkZHJlc3NfaWQiKS52YWwoY2hvc2VBZGRyKX0sImpzb24iKTtvcmlnQ291bnRyeT0nJztvcmlnU3RhdGU9Jyd9CmZ1bmN0aW9uIHByb2Nlc3NBZGRyZXNzKGZybSxhdCl7Y2hvc2VBZGRyPSQoIi5hZGRyZXNzLWNob29zZXJzOmNoZWNrZWQiKS52YWwoKTt2YXIgYmFzZUFkZHJPYmo9IiMiK2FkZHJUeXBlc19tYXBbYXRdKyJfYWRkcmVzc19ibG9jayI7dmFyIGF0T3RoZXI9KGF0PT0ncyc/J2InOidzJyk7JC5wb3N0KGFjY291bnRfYWpheF9maWxlLHtzZWxHZXQ6ImFkZHJQcm9jIixhVHlwZTphdCxhZGRyZXNzX2lkOmNob3NlQWRkcixyZXFGaWxlOnJlcXVlc3RpbmdGaWxlLGZEYXRhOiQoIiMiK2ZybSkuc2VyaWFsaXplKCl9LGZ1bmN0aW9uKGRhdGEpe2lmKGRhdGEuYVJlcz09J2Vycm9yJyl7JChiYXNlQWRkck9iaisiIC5hY3Rpb24tYmxvY2siKS5odG1sKGRhdGEuYUZybSk7aW5pdF92YWxpZGF0aW9uKCk7dmFsaWRhdGVGb3JtKCl9ZWxzZXthZGRySWRzW2F0XT1kYXRhLmFJRDtjaG9zZUFkZHI9ZGF0YS5hSUQ7aWYoZGF0YS5hVmlldy5sZW5ndGg+MCl7JChiYXNlQWRkck9iaisiIC52aWV3LWJsb2NrIikuaHRtbChkYXRhLmFWaWV3KTtpZihhZGRySWRzW2F0XT09YWRkcklkc1thdE90aGVyXSl7JCgiIyIrYWRkclR5cGVzX21hcFthdE90aGVyXSsiX2FkZHJlc3NfYmxvY2siKyIgLnZpZXctYmxvY2siKS5odG1sKGRhdGEuYVZpZXcpfX0KJChiYXNlQWRkck9iaisiIC5hY3Rpb24tYmxvY2siKS5odG1sKCcnKTskKGJhc2VBZGRyT2JqKyIgLmVkaXQtYnV0dG9ucyBhLmJ0biIpLmF0dHIoJ29uY2xpY2snLCJzaG93QWRkckVkaXRvcignIithdCsiJywgJyIrY2hvc2VBZGRyKyInKSIpOyQoYmFzZUFkZHJPYmorIiAuZWRpdC1idXR0b25zIikuc2hvdygpOyQoIiMiK2FkZHJUeXBlc19tYXBbYXRdKyJfYWRkcmVzc19pZCIpLnZhbChjaG9zZUFkZHIpfX0sImpzb24iKS5mYWlsKGZ1bmN0aW9uKHhocix0ZXh0U3RhdHVzLGVycm9yKXtjb25zb2xlLmxvZyh4aHIuc3RhdHVzVGV4dCk7Y29uc29sZS5sb2codGV4dFN0YXR1cyl9KTtvcmlnQ291bnRyeT0nJztvcmlnU3RhdGU9Jyc7cmV0dXJuITF9CmZ1bmN0aW9uIGRyYXdfdmFsaWRhdGVFcnJvck1zZyhtc2cpe3JldHVybic8ZGl2IGlkPSJ2YWxpZGF0ZV9lcnJvcl9tc2ciPicrbXNnKyI8L2Rpdj4ifQpmdW5jdGlvbiBjYXB0Y2hhVmFsaWRhdGVkKHJlcyl7Y2FwdGNoYVZhbGlkPSEwO2Noa19vazJzdWJtaXQoKX0KZnVuY3Rpb24gY2FwdGNoYUV4cGlyZWQocmVzKXtjYXB0Y2hhVmFsaWQ9ITE7Y2hrX29rMnN1Ym1pdCgpfQpmdW5jdGlvbiB2YWxpZGF0ZUVtYWlsKGZsZCl7dmFyIGVtYWlsUGF0dGVybj0vXihbYS16MC05XSkoKFstYS16MC05Ll9dKSooW2EtejAtOV0pKSpcQChbYS16MC05XSkoKFthLXowLTktXSkqKFthLXowLTldKSkrKFwuKFthLXowLTldKShbLWEtejAtOV8tXSk/KFthLXowLTldKSspKyQvaTt2YXIgbWluTGVuPSQoZmxkKS5hdHRyKCdkYXRhLW1pbi1sZW5ndGgnKTt2TXNnPScnO2lmKGZsZC52YWx1ZS5sZW5ndGg+bWluTGVuJiZmbGQudmFsdWUubWF0Y2goZW1haWxQYXR0ZXJuKSE9bnVsbCl7JC5wb3N0KGFjY291bnRfYWpheF9maWxlLHthY3Rpb246J2Noa19lbWFpbF9leGlzdHMnLGNoa19lbWFpbDpmbGQudmFsdWV9LGZ1bmN0aW9uKGRhdGEpe2lmKGRhdGEucmVzdWx0IT0nb2snKXskKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygndmFsaWQnKS5hZGRDbGFzcygnaW52YWxpZCcpOyQoIiNhY2NvdW50X2RpYWxvZyIpLmh0bWwoZHJhd192YWxpZGF0ZUVycm9yTXNnKGRhdGEubXNnKSkuZGlhbG9nKCJvcGVuIil9ZWxzZXskKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygnaW52YWxpZCcpLmFkZENsYXNzKCd2YWxpZCcpfX0sImpzb24iKX1lbHNle3ZhciB2TXNnPWVycm9yTXNnX2ludmFsaWRfZW1haWw7aWYoZmxkLnZhbHVlLmxlbmd0aDxtaW5MZW4pe3ZNc2c9Ik11c3QgQmUgIittaW5MZW4rIiBvciBNb3JlIENoYXJhY3RlcnMifQokKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygndmFsaWQnKS5hZGRDbGFzcygnaW52YWxpZCcpOyQoIiNhY2NvdW50X2RpYWxvZyIpLmh0bWwoZHJhd192YWxpZGF0ZUVycm9yTXNnKHZNc2cpKS5kaWFsb2coIm9wZW4iKX19CmZ1bmN0aW9uIHZhbGlkYXRlX2ZsZFZhbChmbGQpe3ZhciBmUmVxPSQoZmxkKS5oYXNDbGFzcygncmVxLWZsZCcpO3ZhciBtaW5MZW49JChmbGQpLmF0dHIoJ2RhdGEtbWluLWxlbmd0aCcpO3ZhciB2TXNnPScnO2lmKGZSZXE9PSEwKXtpZihmbGQuaWQ9PSdwYXNzd29yZF9jb25maXJtJyl7dmFyIHBhc3N3ZD0kKCIjcGFzc3dvcmQiKS52YWwoKTtpZihmbGQudmFsdWUhPXBhc3N3ZCl7JCgiI2ZsZFNldF8iK2ZsZC5pZCkucmVtb3ZlQ2xhc3MoJ3ZhbGlkJykuYWRkQ2xhc3MoJ2ludmFsaWQnKTskKCIjYWNjb3VudF9kaWFsb2ciKS5odG1sKGRyYXdfdmFsaWRhdGVFcnJvck1zZyhlcnJvck1zZ19wYXNzd29yZF9taXNtYXRjaCkpLmRpYWxvZygib3BlbiIpfWVsc2V7JCgiI2ZsZFNldF8iK2ZsZC5pZCkucmVtb3ZlQ2xhc3MoJ2ludmFsaWQnKS5hZGRDbGFzcygndmFsaWQnKX19ZWxzZSBpZihmbGQuaWQ9PSdlbWFpbF9hZGRyZXNzJyl7dmFsaWRhdGVFbWFpbChmbGQpfWVsc2UgaWYoZmxkLmlkPT0nc3RhdGUnfHxmbGQuaWQ9PSdzdGF0ZV9vdGhlcicpe2lmKGZsZC5pZD09J3N0YXRlJyl7aWYoZmxkLnZhbHVlPT0nb3RoZXInKXt2YXIgX290aGVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGF0ZV9vdGhlciIpO2lmKF9vdGhlci52YWx1ZS5sZW5ndGg8bWluTGVuKXskKCIjZmxkU2V0X3N0YXRlIikucmVtb3ZlQ2xhc3MoJ3ZhbGlkIGFsZXJ0JykuYWRkQ2xhc3MoJ2FsZXJ0Jyl9ZWxzZXskKCIjZmxkU2V0X3N0YXRlIikucmVtb3ZlQ2xhc3MoJ2ludmFsaWQgYWxlcnQnKS5hZGRDbGFzcygndmFsaWQnKX19ZWxzZXtpZihmbGQudmFsdWUubGVuZ3RoPG1pbkxlbil7JCgiI2ZsZFNldF9zdGF0ZSIpLnJlbW92ZUNsYXNzKCd2YWxpZCBhbGVydCcpLmFkZENsYXNzKCdpbnZhbGlkJyk7dk1zZz0iU3RhdGUgSXMgUmVxdWlyZWQifWVsc2V7JCgiI2ZsZFNldF9zdGF0ZSIpLnJlbW92ZUNsYXNzKCdpbnZhbGlkIGFsZXJ0JykuYWRkQ2xhc3MoJ3ZhbGlkJyl9fX1lbHNle2lmKGZsZC52YWx1ZS5sZW5ndGg8bWluTGVuKXskKCIjZmxkU2V0X3N0YXRlIikucmVtb3ZlQ2xhc3MoJ3ZhbGlkIGFsZXJ0JykuYWRkQ2xhc3MoJ2ludmFsaWQnKTt2TXNnPSJNdXN0IEJlICIrbWluTGVuKyIgb3IgTW9yZSBDaGFyYWN0ZXJzIn1lbHNleyQoIiNmbGRTZXRfc3RhdGUiKS5yZW1vdmVDbGFzcygnaW52YWxpZCBhbGVydCcpLmFkZENsYXNzKCd2YWxpZCcpfX0KaWYodk1zZy5sZW5ndGg+MCl7JCgiI2FjY291bnRfZGlhbG9nIikuaHRtbChkcmF3X3ZhbGlkYXRlRXJyb3JNc2codk1zZykpLmRpYWxvZygib3BlbiIpfX1lbHNle2lmKGZsZC52YWx1ZS5sZW5ndGg8bWluTGVuKXskKCIjZmxkU2V0XyIrZmxkLmlkKS5yZW1vdmVDbGFzcygndmFsaWQgYWxlcnQnKS5hZGRDbGFzcygnaW52YWxpZCcpO3ZNc2c9Ik11c3QgQmUgIittaW5MZW4rIiBvciBNb3JlIENoYXJhY3RlcnMiO2lmKGZsZC5pZD09J2NvdW50cnknKXt2TXNnPSJDb3VudHJ5IElzIFJlcXVpcmVkIn0KJCgiI2FjY291bnRfZGlhbG9nIikuaHRtbChkcmF3X3ZhbGlkYXRlRXJyb3JNc2codk1zZykpLmRpYWxvZygib3BlbiIpfWVsc2V7JCgiI2ZsZFNldF8iK2ZsZC5pZCkucmVtb3ZlQ2xhc3MoJ2ludmFsaWQgYWxlcnQnKS5hZGRDbGFzcygndmFsaWQnKX19fX0KZnVuY3Rpb24gY2hrX29rMnN1Ym1pdCgpe3ZhciBvMnM9InRydWUiO3ZhciBmVmFsaWQ9ITE7dmFyIGZJbnZhbGlkPSExO3ZhciBmbGQ9Jyc7dmFyIGZSZXE9ITE7dmFyIGZEaXNhYmxlZD0hMTskKCIuYWRkcmVzcy1maWVsZC1zZXQsIC5hY2NvdW50LWZpZWxkLXNldCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgY3VyRmxkPSQoIiMiK3RoaXMuaWQrIiA6aW5wdXQiKTtmRGlzYWJsZWQ9JChjdXJGbGQpLnByb3AoJ2Rpc2FibGVkJyk7ZlJlcT0kKGN1ckZsZCkuaGFzQ2xhc3MoJ3JlcS1mbGQnKTtmVmFsaWQ9JCh0aGlzKS5oYXNDbGFzcygndmFsaWQnKTtmSW52YWxpZD0kKHRoaXMpLmhhc0NsYXNzKCdpbnZhbGlkIGFsZXJ0Jyk7aWYoZkRpc2FibGVkPT0hMSYmKGZJbnZhbGlkPT0hMHx8KGZSZXE9PSEwJiZmVmFsaWQ9PSExKSkpe28ycz0iZmFsc2UifX0pO2lmKGNhcHRjaGFWYWxpZCE9ITApe28ycz0iZmFsc2UifQppZihvMnM9PSJmYWxzZSIpe31lbHNleyQoIi5zdWJtaXQtYnV0dG9ucyIpLnNob3coKX0KcmV0dXJuIG8yc30KZnVuY3Rpb24gdmFsaWRhdGVGb3JtKCl7JCgiLmFkZHJlc3MtZmllbGQtc2V0IDppbnB1dCwgLmFjY291bnQtZmllbGQtc2V0IDppbnB1dCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZktleT10aGlzLmlkLnJlcGxhY2UoJ2ZsZFNldF8nLCcnKTt2YXIgZk9iaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChmS2V5KTt2YWxpZGF0ZV9mbGRWYWwoZk9iail9KTtyZXR1cm4gY2hrX29rMnN1Ym1pdCgpfQpmdW5jdGlvbiBpbml0X3ZhbGlkYXRpb24oKXtpZigkKCcjY291bnRyeV9pZCcpLmxlbmd0aD4wKXskKCIuYWRkcmVzcy1maWVsZC1zZXQgOmlucHV0LCAuYWNjb3VudC1maWVsZC1zZXQgOmlucHV0Iikub24oImJsdXIgY2hhbmdlIixmdW5jdGlvbigpe3ZhciBmS2V5PXRoaXMuaWQucmVwbGFjZSgnZmxkU2V0XycsJycpO3ZhciBmT2JqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZLZXkpO3ZhbGlkYXRlX2ZsZFZhbChmT2JqKTtjaGtfb2syc3VibWl0KCl9KTthZGRyLmNvdW50cnk9JCgiI2NvdW50cnlfaWQiKS52YWwoKTtzZWxlY3RDb3VudHJ5KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb3VudHJ5X2lkJykpfX07aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBqUXVlcnkpdGhyb3cgbmV3IEVycm9yKCJCb290c3RyYXAncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGpRdWVyeSIpOytmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7dmFyIGU9dC5mbi5qcXVlcnkuc3BsaXQoIiAiKVswXS5zcGxpdCgiLiIpO2lmKGVbMF08MiYmZVsxXTw5fHwxPT1lWzBdJiY5PT1lWzFdJiZlWzJdPDF8fGVbMF0+Myl0aHJvdyBuZXcgRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgalF1ZXJ5IHZlcnNpb24gMS45LjEgb3IgaGlnaGVyLCBidXQgbG93ZXIgdGhhbiB2ZXJzaW9uIDQiKX0oalF1ZXJ5KSwrZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGUoZSxvKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49dCh0aGlzKSxzPW4uZGF0YSgiYnMubW9kYWwiKSxyPXQuZXh0ZW5kKHt9LGkuREVGQVVMVFMsbi5kYXRhKCksIm9iamVjdCI9PXR5cGVvZiBlJiZlKTtzfHxuLmRhdGEoImJzLm1vZGFsIixzPW5ldyBpKHRoaXMscikpLCJzdHJpbmciPT10eXBlb2YgZT9zW2VdKG8pOnIuc2hvdyYmcy5zaG93KG8pfSl9dmFyIGk9ZnVuY3Rpb24oZSxpKXt0aGlzLm9wdGlvbnM9aSx0aGlzLiRib2R5PXQoZG9jdW1lbnQuYm9keSksdGhpcy4kZWxlbWVudD10KGUpLHRoaXMuJGRpYWxvZz10aGlzLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1kaWFsb2ciKSx0aGlzLiRiYWNrZHJvcD1udWxsLHRoaXMuaXNTaG93bj1udWxsLHRoaXMub3JpZ2luYWxCb2R5UGFkPW51bGwsdGhpcy5zY3JvbGxiYXJXaWR0aD0wLHRoaXMuaWdub3JlQmFja2Ryb3BDbGljaz0hMSx0aGlzLmZpeGVkQ29udGVudD0iLm5hdmJhci1maXhlZC10b3AsIC5uYXZiYXItZml4ZWQtYm90dG9tIix0aGlzLm9wdGlvbnMucmVtb3RlJiZ0aGlzLiRlbGVtZW50LmZpbmQoIi5tb2RhbC1jb250ZW50IikubG9hZCh0aGlzLm9wdGlvbnMucmVtb3RlLHQucHJveHkoZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50LnRyaWdnZXIoImxvYWRlZC5icy5tb2RhbCIpfSx0aGlzKSl9O2kuVkVSU0lPTj0iMy40LjEiLGkuVFJBTlNJVElPTl9EVVJBVElPTj0zMDAsaS5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxpLkRFRkFVTFRTPXtiYWNrZHJvcDohMCxrZXlib2FyZDohMCxzaG93OiEwfSxpLnByb3RvdHlwZS50b2dnbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNTaG93bj90aGlzLmhpZGUoKTp0aGlzLnNob3codCl9LGkucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oZSl7dmFyIG89dGhpcyxuPXQuRXZlbnQoInNob3cuYnMubW9kYWwiLHtyZWxhdGVkVGFyZ2V0OmV9KTt0aGlzLiRlbGVtZW50LnRyaWdnZXIobiksdGhpcy5pc1Nob3dufHxuLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwodGhpcy5pc1Nob3duPSEwLHRoaXMuY2hlY2tTY3JvbGxiYXIoKSx0aGlzLnNldFNjcm9sbGJhcigpLHRoaXMuJGJvZHkuYWRkQ2xhc3MoIm1vZGFsLW9wZW4iKSx0aGlzLmVzY2FwZSgpLHRoaXMucmVzaXplKCksdGhpcy4kZWxlbWVudC5vbigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIsJ1tkYXRhLWRpc21pc3M9Im1vZGFsIl0nLHQucHJveHkodGhpcy5oaWRlLHRoaXMpKSx0aGlzLiRkaWFsb2cub24oIm1vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsIixmdW5jdGlvbigpe28uJGVsZW1lbnQub25lKCJtb3VzZXVwLmRpc21pc3MuYnMubW9kYWwiLGZ1bmN0aW9uKGUpe3QoZS50YXJnZXQpLmlzKG8uJGVsZW1lbnQpJiYoby5pZ25vcmVCYWNrZHJvcENsaWNrPSEwKX0pfSksdGhpcy5iYWNrZHJvcChmdW5jdGlvbigpe3ZhciBuPXQuc3VwcG9ydC50cmFuc2l0aW9uJiZvLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIik7by4kZWxlbWVudC5wYXJlbnQoKS5sZW5ndGh8fG8uJGVsZW1lbnQuYXBwZW5kVG8oby4kYm9keSksby4kZWxlbWVudC5zaG93KCkuc2Nyb2xsVG9wKDApLG8uYWRqdXN0RGlhbG9nKCksbiYmby4kZWxlbWVudFswXS5vZmZzZXRXaWR0aCxvLiRlbGVtZW50LmFkZENsYXNzKCJpbiIpLG8uZW5mb3JjZUZvY3VzKCk7dmFyIHM9dC5FdmVudCgic2hvd24uYnMubW9kYWwiLHtyZWxhdGVkVGFyZ2V0OmV9KTtuP28uJGRpYWxvZy5vbmUoImJzVHJhbnNpdGlvbkVuZCIsZnVuY3Rpb24oKXtvLiRlbGVtZW50LnRyaWdnZXIoImZvY3VzIikudHJpZ2dlcihzKX0pLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGkuVFJBTlNJVElPTl9EVVJBVElPTik6by4kZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIpLnRyaWdnZXIocyl9KSl9LGkucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oZSl7ZSYmZS5wcmV2ZW50RGVmYXVsdCgpLGU9dC5FdmVudCgiaGlkZS5icy5tb2RhbCIpLHRoaXMuJGVsZW1lbnQudHJpZ2dlcihlKSx0aGlzLmlzU2hvd24mJiFlLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYodGhpcy5pc1Nob3duPSExLHRoaXMuZXNjYXBlKCksdGhpcy5yZXNpemUoKSx0KGRvY3VtZW50KS5vZmYoImZvY3VzaW4uYnMubW9kYWwiKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJpbiIpLm9mZigiY2xpY2suZGlzbWlzcy5icy5tb2RhbCIpLm9mZigibW91c2V1cC5kaXNtaXNzLmJzLm1vZGFsIiksdGhpcy4kZGlhbG9nLm9mZigibW91c2Vkb3duLmRpc21pc3MuYnMubW9kYWwiKSx0LnN1cHBvcnQudHJhbnNpdGlvbiYmdGhpcy4kZWxlbWVudC5oYXNDbGFzcygiZmFkZSIpP3RoaXMuJGVsZW1lbnQub25lKCJic1RyYW5zaXRpb25FbmQiLHQucHJveHkodGhpcy5oaWRlTW9kYWwsdGhpcykpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGkuVFJBTlNJVElPTl9EVVJBVElPTik6dGhpcy5oaWRlTW9kYWwoKSl9LGkucHJvdG90eXBlLmVuZm9yY2VGb2N1cz1mdW5jdGlvbigpe3QoZG9jdW1lbnQpLm9mZigiZm9jdXNpbi5icy5tb2RhbCIpLm9uKCJmb2N1c2luLmJzLm1vZGFsIix0LnByb3h5KGZ1bmN0aW9uKHQpe2RvY3VtZW50PT09dC50YXJnZXR8fHRoaXMuJGVsZW1lbnRbMF09PT10LnRhcmdldHx8dGhpcy4kZWxlbWVudC5oYXModC50YXJnZXQpLmxlbmd0aHx8dGhpcy4kZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIpfSx0aGlzKSl9LGkucHJvdG90eXBlLmVzY2FwZT1mdW5jdGlvbigpe3RoaXMuaXNTaG93biYmdGhpcy5vcHRpb25zLmtleWJvYXJkP3RoaXMuJGVsZW1lbnQub24oImtleWRvd24uZGlzbWlzcy5icy5tb2RhbCIsdC5wcm94eShmdW5jdGlvbih0KXsyNz09dC53aGljaCYmdGhpcy5oaWRlKCl9LHRoaXMpKTp0aGlzLmlzU2hvd258fHRoaXMuJGVsZW1lbnQub2ZmKCJrZXlkb3duLmRpc21pc3MuYnMubW9kYWwiKX0saS5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKCl7dGhpcy5pc1Nob3duP3Qod2luZG93KS5vbigicmVzaXplLmJzLm1vZGFsIix0LnByb3h5KHRoaXMuaGFuZGxlVXBkYXRlLHRoaXMpKTp0KHdpbmRvdykub2ZmKCJyZXNpemUuYnMubW9kYWwiKX0saS5wcm90b3R5cGUuaGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLiRlbGVtZW50LmhpZGUoKSx0aGlzLmJhY2tkcm9wKGZ1bmN0aW9uKCl7dC4kYm9keS5yZW1vdmVDbGFzcygibW9kYWwtb3BlbiIpLHQucmVzZXRBZGp1c3RtZW50cygpLHQucmVzZXRTY3JvbGxiYXIoKSx0LiRlbGVtZW50LnRyaWdnZXIoImhpZGRlbi5icy5tb2RhbCIpfSl9LGkucHJvdG90eXBlLnJlbW92ZUJhY2tkcm9wPWZ1bmN0aW9uKCl7dGhpcy4kYmFja2Ryb3AmJnRoaXMuJGJhY2tkcm9wLnJlbW92ZSgpLHRoaXMuJGJhY2tkcm9wPW51bGx9LGkucHJvdG90eXBlLmJhY2tkcm9wPWZ1bmN0aW9uKGUpe3ZhciBvPXRoaXMsbj10aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCJmYWRlIik/ImZhZGUiOiIiO2lmKHRoaXMuaXNTaG93biYmdGhpcy5vcHRpb25zLmJhY2tkcm9wKXt2YXIgcz10LnN1cHBvcnQudHJhbnNpdGlvbiYmbjtpZih0aGlzLiRiYWNrZHJvcD10KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5hZGRDbGFzcygibW9kYWwtYmFja2Ryb3AgIituKS5hcHBlbmRUbyh0aGlzLiRib2R5KSx0aGlzLiRlbGVtZW50Lm9uKCJjbGljay5kaXNtaXNzLmJzLm1vZGFsIix0LnByb3h5KGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2s/dm9pZCh0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2s9ITEpOnZvaWQodC50YXJnZXQ9PT10LmN1cnJlbnRUYXJnZXQmJigic3RhdGljIj09dGhpcy5vcHRpb25zLmJhY2tkcm9wP3RoaXMuJGVsZW1lbnRbMF0uZm9jdXMoKTp0aGlzLmhpZGUoKSkpfSx0aGlzKSkscyYmdGhpcy4kYmFja2Ryb3BbMF0ub2Zmc2V0V2lkdGgsdGhpcy4kYmFja2Ryb3AuYWRkQ2xhc3MoImluIiksIWUpcmV0dXJuO3M/dGhpcy4kYmFja2Ryb3Aub25lKCJic1RyYW5zaXRpb25FbmQiLGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGkuQkFDS0RST1BfVFJBTlNJVElPTl9EVVJBVElPTik6ZSgpfWVsc2UgaWYoIXRoaXMuaXNTaG93biYmdGhpcy4kYmFja2Ryb3Ape3RoaXMuJGJhY2tkcm9wLnJlbW92ZUNsYXNzKCJpbiIpO3ZhciByPWZ1bmN0aW9uKCl7by5yZW1vdmVCYWNrZHJvcCgpLGUmJmUoKX07dC5zdXBwb3J0LnRyYW5zaXRpb24mJnRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoImZhZGUiKT90aGlzLiRiYWNrZHJvcC5vbmUoImJzVHJhbnNpdGlvbkVuZCIscikuZW11bGF0ZVRyYW5zaXRpb25FbmQoaS5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OKTpyKCl9ZWxzZSBlJiZlKCl9LGkucHJvdG90eXBlLmhhbmRsZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuYWRqdXN0RGlhbG9nKCl9LGkucHJvdG90eXBlLmFkanVzdERpYWxvZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuJGVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0PmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7dGhpcy4kZWxlbWVudC5jc3Moe3BhZGRpbmdMZWZ0OiF0aGlzLmJvZHlJc092ZXJmbG93aW5nJiZ0P3RoaXMuc2Nyb2xsYmFyV2lkdGg6IiIscGFkZGluZ1JpZ2h0OnRoaXMuYm9keUlzT3ZlcmZsb3dpbmcmJiF0P3RoaXMuc2Nyb2xsYmFyV2lkdGg6IiJ9KX0saS5wcm90b3R5cGUucmVzZXRBZGp1c3RtZW50cz1mdW5jdGlvbigpe3RoaXMuJGVsZW1lbnQuY3NzKHtwYWRkaW5nTGVmdDoiIixwYWRkaW5nUmlnaHQ6IiJ9KX0saS5wcm90b3R5cGUuY2hlY2tTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgdD13aW5kb3cuaW5uZXJXaWR0aDtpZighdCl7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3Q9ZS5yaWdodC1NYXRoLmFicyhlLmxlZnQpfXRoaXMuYm9keUlzT3ZlcmZsb3dpbmc9ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDx0LHRoaXMuc2Nyb2xsYmFyV2lkdGg9dGhpcy5tZWFzdXJlU2Nyb2xsYmFyKCl9LGkucHJvdG90eXBlLnNldFNjcm9sbGJhcj1mdW5jdGlvbigpe3ZhciBlPXBhcnNlSW50KHRoaXMuJGJvZHkuY3NzKCJwYWRkaW5nLXJpZ2h0Iil8fDAsMTApO3RoaXMub3JpZ2luYWxCb2R5UGFkPWRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0fHwiIjt2YXIgaT10aGlzLnNjcm9sbGJhcldpZHRoO3RoaXMuYm9keUlzT3ZlcmZsb3dpbmcmJih0aGlzLiRib2R5LmNzcygicGFkZGluZy1yaWdodCIsZStpKSx0KHRoaXMuZml4ZWRDb250ZW50KS5lYWNoKGZ1bmN0aW9uKGUsbyl7dmFyIG49by5zdHlsZS5wYWRkaW5nUmlnaHQscz10KG8pLmNzcygicGFkZGluZy1yaWdodCIpO3QobykuZGF0YSgicGFkZGluZy1yaWdodCIsbikuY3NzKCJwYWRkaW5nLXJpZ2h0IixwYXJzZUZsb2F0KHMpK2krInB4Iil9KSl9LGkucHJvdG90eXBlLnJlc2V0U2Nyb2xsYmFyPWZ1bmN0aW9uKCl7dGhpcy4kYm9keS5jc3MoInBhZGRpbmctcmlnaHQiLHRoaXMub3JpZ2luYWxCb2R5UGFkKSx0KHRoaXMuZml4ZWRDb250ZW50KS5lYWNoKGZ1bmN0aW9uKGUsaSl7dmFyIG89dChpKS5kYXRhKCJwYWRkaW5nLXJpZ2h0Iik7dChpKS5yZW1vdmVEYXRhKCJwYWRkaW5nLXJpZ2h0IiksaS5zdHlsZS5wYWRkaW5nUmlnaHQ9bz9vOiIifSl9LGkucHJvdG90eXBlLm1lYXN1cmVTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT0ibW9kYWwtc2Nyb2xsYmFyLW1lYXN1cmUiLHRoaXMuJGJvZHkuYXBwZW5kKHQpO3ZhciBlPXQub2Zmc2V0V2lkdGgtdC5jbGllbnRXaWR0aDtyZXR1cm4gdGhpcy4kYm9keVswXS5yZW1vdmVDaGlsZCh0KSxlfTt2YXIgbz10LmZuLm1vZGFsO3QuZm4ubW9kYWw9ZSx0LmZuLm1vZGFsLkNvbnN0cnVjdG9yPWksdC5mbi5tb2RhbC5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHQuZm4ubW9kYWw9byx0aGlzfSx0KGRvY3VtZW50KS5vbigiY2xpY2suYnMubW9kYWwuZGF0YS1hcGkiLCdbZGF0YS10b2dnbGU9Im1vZGFsIl0nLGZ1bmN0aW9uKGkpe3ZhciBvPXQodGhpcyksbj1vLmF0dHIoImhyZWYiKSxzPW8uYXR0cigiZGF0YS10YXJnZXQiKXx8biYmbi5yZXBsYWNlKC8uKig/PSNbXlxzXSskKS8sIiIpLHI9dChkb2N1bWVudCkuZmluZChzKSxhPXIuZGF0YSgiYnMubW9kYWwiKT8idG9nZ2xlIjp0LmV4dGVuZCh7cmVtb3RlOiEvIy8udGVzdChuKSYmbn0sci5kYXRhKCksby5kYXRhKCkpO28uaXMoImEiKSYmaS5wcmV2ZW50RGVmYXVsdCgpLHIub25lKCJzaG93LmJzLm1vZGFsIixmdW5jdGlvbih0KXt0LmlzRGVmYXVsdFByZXZlbnRlZCgpfHxyLm9uZSgiaGlkZGVuLmJzLm1vZGFsIixmdW5jdGlvbigpe28uaXMoIjp2aXNpYmxlIikmJm8udHJpZ2dlcigiZm9jdXMiKX0pfSksZS5jYWxsKHIsYSx0aGlzKX0pfShqUXVlcnkpLCtmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLGkpe3ZhciBvPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigtMSE9PXQuaW5BcnJheShvLGkpKXJldHVybi0xIT09dC5pbkFycmF5KG8scyk/Qm9vbGVhbihlLm5vZGVWYWx1ZS5tYXRjaChsKXx8ZS5ub2RlVmFsdWUubWF0Y2goaCkpOiEwO2Zvcih2YXIgbj10KGkpLmZpbHRlcihmdW5jdGlvbih0LGUpe3JldHVybiBlIGluc3RhbmNlb2YgUmVnRXhwfSkscj0wLGE9bi5sZW5ndGg7YT5yO3IrKylpZihvLm1hdGNoKG5bcl0pKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGkoaSxvLG4pe2lmKDA9PT1pLmxlbmd0aClyZXR1cm4gaTtpZihuJiYiZnVuY3Rpb24iPT10eXBlb2YgbilyZXR1cm4gbihpKTtpZighZG9jdW1lbnQuaW1wbGVtZW50YXRpb258fCFkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQpcmV0dXJuIGk7dmFyIHM9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJzYW5pdGl6YXRpb24iKTtzLmJvZHkuaW5uZXJIVE1MPWk7Zm9yKHZhciByPXQubWFwKG8sZnVuY3Rpb24odCxlKXtyZXR1cm4gZX0pLGE9dChzLmJvZHkpLmZpbmQoIioiKSxsPTAsaD1hLmxlbmd0aDtoPmw7bCsrKXt2YXIgcD1hW2xdLGQ9cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKC0xIT09dC5pbkFycmF5KGQscikpZm9yKHZhciBjPXQubWFwKHAuYXR0cmlidXRlcyxmdW5jdGlvbih0KXtyZXR1cm4gdH0pLGY9W10uY29uY2F0KG9bIioiXXx8W10sb1tkXXx8W10pLHU9MCxtPWMubGVuZ3RoO20+dTt1KyspZShjW3VdLGYpfHxwLnJlbW92ZUF0dHJpYnV0ZShjW3VdLm5vZGVOYW1lKTtlbHNlIHAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwKX1yZXR1cm4gcy5ib2R5LmlubmVySFRNTH1mdW5jdGlvbiBvKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT10KHRoaXMpLG89aS5kYXRhKCJicy50b29sdGlwIiksbj0ib2JqZWN0Ij09dHlwZW9mIGUmJmU7IW8mJi9kZXN0cm95fGhpZGUvLnRlc3QoZSl8fChvfHxpLmRhdGEoImJzLnRvb2x0aXAiLG89bmV3IHAodGhpcyxuKSksInN0cmluZyI9PXR5cGVvZiBlJiZvW2VdKCkpfSl9dmFyIG49WyJzYW5pdGl6ZSIsIndoaXRlTGlzdCIsInNhbml0aXplRm4iXSxzPVsiYmFja2dyb3VuZCIsImNpdGUiLCJocmVmIiwiaXRlbXR5cGUiLCJsb25nZGVzYyIsInBvc3RlciIsInNyYyIsInhsaW5rOmhyZWYiXSxyPS9eYXJpYS1bXHctXSokL2ksYT17IioiOlsiY2xhc3MiLCJkaXIiLCJpZCIsImxhbmciLCJyb2xlIixyXSxhOlsidGFyZ2V0IiwiaHJlZiIsInRpdGxlIiwicmVsIl0sYXJlYTpbXSxiOltdLGJyOltdLGNvbDpbXSxjb2RlOltdLGRpdjpbXSxlbTpbXSxocjpbXSxoMTpbXSxoMjpbXSxoMzpbXSxoNDpbXSxoNTpbXSxoNjpbXSxpOltdLGltZzpbInNyYyIsImFsdCIsInRpdGxlIiwid2lkdGgiLCJoZWlnaHQiXSxsaTpbXSxvbDpbXSxwOltdLHByZTpbXSxzOltdLHNtYWxsOltdLHNwYW46W10sc3ViOltdLHN1cDpbXSxzdHJvbmc6W10sdTpbXSx1bDpbXX0sbD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwfHRlbHxmaWxlKTp8W14mOi8/I10qKD86Wy8/I118JCkpL2dpLGg9L15kYXRhOig/OmltYWdlXC8oPzpibXB8Z2lmfGpwZWd8anBnfHBuZ3x0aWZmfHdlYnApfHZpZGVvXC8oPzptcGVnfG1wNHxvZ2d8d2VibSl8YXVkaW9cLyg/Om1wM3xvZ2F8b2dnfG9wdXMpKTtiYXNlNjQsW2EtejAtOSsvXSs9KiQvaSxwPWZ1bmN0aW9uKHQsZSl7dGhpcy50eXBlPW51bGwsdGhpcy5vcHRpb25zPW51bGwsdGhpcy5lbmFibGVkPW51bGwsdGhpcy50aW1lb3V0PW51bGwsdGhpcy5ob3ZlclN0YXRlPW51bGwsdGhpcy4kZWxlbWVudD1udWxsLHRoaXMuaW5TdGF0ZT1udWxsLHRoaXMuaW5pdCgidG9vbHRpcCIsdCxlKX07cC5WRVJTSU9OPSIzLjQuMSIscC5UUkFOU0lUSU9OX0RVUkFUSU9OPTE1MCxwLkRFRkFVTFRTPXthbmltYXRpb246ITAscGxhY2VtZW50OiJ0b3AiLHNlbGVjdG9yOiExLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJ0b29sdGlwIiByb2xlPSJ0b29sdGlwIj48ZGl2IGNsYXNzPSJ0b29sdGlwLWFycm93Ij48L2Rpdj48ZGl2IGNsYXNzPSJ0b29sdGlwLWlubmVyIj48L2Rpdj48L2Rpdj4nLHRyaWdnZXI6ImhvdmVyIGZvY3VzIix0aXRsZToiIixkZWxheTowLGh0bWw6ITEsY29udGFpbmVyOiExLHZpZXdwb3J0OntzZWxlY3RvcjoiYm9keSIscGFkZGluZzowfSxzYW5pdGl6ZTohMCxzYW5pdGl6ZUZuOm51bGwsd2hpdGVMaXN0OmF9LHAucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oZSxpLG8pe2lmKHRoaXMuZW5hYmxlZD0hMCx0aGlzLnR5cGU9ZSx0aGlzLiRlbGVtZW50PXQoaSksdGhpcy5vcHRpb25zPXRoaXMuZ2V0T3B0aW9ucyhvKSx0aGlzLiR2aWV3cG9ydD10aGlzLm9wdGlvbnMudmlld3BvcnQmJnQoZG9jdW1lbnQpLmZpbmQodC5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy52aWV3cG9ydCk/dGhpcy5vcHRpb25zLnZpZXdwb3J0LmNhbGwodGhpcyx0aGlzLiRlbGVtZW50KTp0aGlzLm9wdGlvbnMudmlld3BvcnQuc2VsZWN0b3J8fHRoaXMub3B0aW9ucy52aWV3cG9ydCksdGhpcy5pblN0YXRlPXtjbGljazohMSxob3ZlcjohMSxmb2N1czohMX0sdGhpcy4kZWxlbWVudFswXWluc3RhbmNlb2YgZG9jdW1lbnQuY29uc3RydWN0b3ImJiF0aGlzLm9wdGlvbnMuc2VsZWN0b3IpdGhyb3cgbmV3IEVycm9yKCJgc2VsZWN0b3JgIG9wdGlvbiBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIGluaXRpYWxpemluZyAiK3RoaXMudHlwZSsiIG9uIHRoZSB3aW5kb3cuZG9jdW1lbnQgb2JqZWN0ISIpO2Zvcih2YXIgbj10aGlzLm9wdGlvbnMudHJpZ2dlci5zcGxpdCgiICIpLHM9bi5sZW5ndGg7cy0tOyl7dmFyIHI9bltzXTtpZigiY2xpY2siPT1yKXRoaXMuJGVsZW1lbnQub24oImNsaWNrLiIrdGhpcy50eXBlLHRoaXMub3B0aW9ucy5zZWxlY3Rvcix0LnByb3h5KHRoaXMudG9nZ2xlLHRoaXMpKTtlbHNlIGlmKCJtYW51YWwiIT1yKXt2YXIgYT0iaG92ZXIiPT1yPyJtb3VzZWVudGVyIjoiZm9jdXNpbiIsbD0iaG92ZXIiPT1yPyJtb3VzZWxlYXZlIjoiZm9jdXNvdXQiO3RoaXMuJGVsZW1lbnQub24oYSsiLiIrdGhpcy50eXBlLHRoaXMub3B0aW9ucy5zZWxlY3Rvcix0LnByb3h5KHRoaXMuZW50ZXIsdGhpcykpLHRoaXMuJGVsZW1lbnQub24obCsiLiIrdGhpcy50eXBlLHRoaXMub3B0aW9ucy5zZWxlY3Rvcix0LnByb3h5KHRoaXMubGVhdmUsdGhpcykpfX10aGlzLm9wdGlvbnMuc2VsZWN0b3I/dGhpcy5fb3B0aW9ucz10LmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMse3RyaWdnZXI6Im1hbnVhbCIsc2VsZWN0b3I6IiJ9KTp0aGlzLmZpeFRpdGxlKCl9LHAucHJvdG90eXBlLmdldERlZmF1bHRzPWZ1bmN0aW9uKCl7cmV0dXJuIHAuREVGQVVMVFN9LHAucHJvdG90eXBlLmdldE9wdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIG89dGhpcy4kZWxlbWVudC5kYXRhKCk7Zm9yKHZhciBzIGluIG8pby5oYXNPd25Qcm9wZXJ0eShzKSYmLTEhPT10LmluQXJyYXkocyxuKSYmZGVsZXRlIG9bc107cmV0dXJuIGU9dC5leHRlbmQoe30sdGhpcy5nZXREZWZhdWx0cygpLG8sZSksZS5kZWxheSYmIm51bWJlciI9PXR5cGVvZiBlLmRlbGF5JiYoZS5kZWxheT17c2hvdzplLmRlbGF5LGhpZGU6ZS5kZWxheX0pLGUuc2FuaXRpemUmJihlLnRlbXBsYXRlPWkoZS50ZW1wbGF0ZSxlLndoaXRlTGlzdCxlLnNhbml0aXplRm4pKSxlfSxwLnByb3RvdHlwZS5nZXREZWxlZ2F0ZU9wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgZT17fSxpPXRoaXMuZ2V0RGVmYXVsdHMoKTtyZXR1cm4gdGhpcy5fb3B0aW9ucyYmdC5lYWNoKHRoaXMuX29wdGlvbnMsZnVuY3Rpb24odCxvKXtpW3RdIT1vJiYoZVt0XT1vKX0pLGV9LHAucHJvdG90eXBlLmVudGVyPWZ1bmN0aW9uKGUpe3ZhciBpPWUgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2U6dChlLmN1cnJlbnRUYXJnZXQpLmRhdGEoImJzLiIrdGhpcy50eXBlKTtyZXR1cm4gaXx8KGk9bmV3IHRoaXMuY29uc3RydWN0b3IoZS5jdXJyZW50VGFyZ2V0LHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpLHQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSxpKSksZSBpbnN0YW5jZW9mIHQuRXZlbnQmJihpLmluU3RhdGVbImZvY3VzaW4iPT1lLnR5cGU/ImZvY3VzIjoiaG92ZXIiXT0hMCksaS50aXAoKS5oYXNDbGFzcygiaW4iKXx8ImluIj09aS5ob3ZlclN0YXRlP3ZvaWQoaS5ob3ZlclN0YXRlPSJpbiIpOihjbGVhclRpbWVvdXQoaS50aW1lb3V0KSxpLmhvdmVyU3RhdGU9ImluIixpLm9wdGlvbnMuZGVsYXkmJmkub3B0aW9ucy5kZWxheS5zaG93P3ZvaWQoaS50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXsiaW4iPT1pLmhvdmVyU3RhdGUmJmkuc2hvdygpfSxpLm9wdGlvbnMuZGVsYXkuc2hvdykpOmkuc2hvdygpKX0scC5wcm90b3R5cGUuaXNJblN0YXRlVHJ1ZT1mdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLmluU3RhdGUpaWYodGhpcy5pblN0YXRlW3RdKXJldHVybiEwO3JldHVybiExfSxwLnByb3RvdHlwZS5sZWF2ZT1mdW5jdGlvbihlKXt2YXIgaT1lIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9lOnQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSk7cmV0dXJuIGl8fChpPW5ldyB0aGlzLmNvbnN0cnVjdG9yKGUuY3VycmVudFRhcmdldCx0aGlzLmdldERlbGVnYXRlT3B0aW9ucygpKSx0KGUuY3VycmVudFRhcmdldCkuZGF0YSgiYnMuIit0aGlzLnR5cGUsaSkpLGUgaW5zdGFuY2VvZiB0LkV2ZW50JiYoaS5pblN0YXRlWyJmb2N1c291dCI9PWUudHlwZT8iZm9jdXMiOiJob3ZlciJdPSExKSxpLmlzSW5TdGF0ZVRydWUoKT92b2lkIDA6KGNsZWFyVGltZW91dChpLnRpbWVvdXQpLGkuaG92ZXJTdGF0ZT0ib3V0IixpLm9wdGlvbnMuZGVsYXkmJmkub3B0aW9ucy5kZWxheS5oaWRlP3ZvaWQoaS50aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXsib3V0Ij09aS5ob3ZlclN0YXRlJiZpLmhpZGUoKX0saS5vcHRpb25zLmRlbGF5LmhpZGUpKTppLmhpZGUoKSl9LHAucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt2YXIgZT10LkV2ZW50KCJzaG93LmJzLiIrdGhpcy50eXBlKTtpZih0aGlzLmhhc0NvbnRlbnQoKSYmdGhpcy5lbmFibGVkKXt0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSk7dmFyIGk9dC5jb250YWlucyh0aGlzLiRlbGVtZW50WzBdLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHRoaXMuJGVsZW1lbnRbMF0pO2lmKGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fCFpKXJldHVybjt2YXIgbz10aGlzLG49dGhpcy50aXAoKSxzPXRoaXMuZ2V0VUlEKHRoaXMudHlwZSk7dGhpcy5zZXRDb250ZW50KCksbi5hdHRyKCJpZCIscyksdGhpcy4kZWxlbWVudC5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5IixzKSx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uJiZuLmFkZENsYXNzKCJmYWRlIik7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMub3B0aW9ucy5wbGFjZW1lbnQ/dGhpcy5vcHRpb25zLnBsYWNlbWVudC5jYWxsKHRoaXMsblswXSx0aGlzLiRlbGVtZW50WzBdKTp0aGlzLm9wdGlvbnMucGxhY2VtZW50LGE9L1xzP2F1dG8/XHM/L2ksbD1hLnRlc3Qocik7bCYmKHI9ci5yZXBsYWNlKGEsIiIpfHwidG9wIiksbi5kZXRhY2goKS5jc3Moe3RvcDowLGxlZnQ6MCxkaXNwbGF5OiJibG9jayJ9KS5hZGRDbGFzcyhyKS5kYXRhKCJicy4iK3RoaXMudHlwZSx0aGlzKSx0aGlzLm9wdGlvbnMuY29udGFpbmVyP24uYXBwZW5kVG8odChkb2N1bWVudCkuZmluZCh0aGlzLm9wdGlvbnMuY29udGFpbmVyKSk6bi5pbnNlcnRBZnRlcih0aGlzLiRlbGVtZW50KSx0aGlzLiRlbGVtZW50LnRyaWdnZXIoImluc2VydGVkLmJzLiIrdGhpcy50eXBlKTt2YXIgaD10aGlzLmdldFBvc2l0aW9uKCksZD1uWzBdLm9mZnNldFdpZHRoLGM9blswXS5vZmZzZXRIZWlnaHQ7aWYobCl7dmFyIGY9cix1PXRoaXMuZ2V0UG9zaXRpb24odGhpcy4kdmlld3BvcnQpO3I9ImJvdHRvbSI9PXImJmguYm90dG9tK2M+dS5ib3R0b20/InRvcCI6InRvcCI9PXImJmgudG9wLWM8dS50b3A/ImJvdHRvbSI6InJpZ2h0Ij09ciYmaC5yaWdodCtkPnUud2lkdGg/ImxlZnQiOiJsZWZ0Ij09ciYmaC5sZWZ0LWQ8dS5sZWZ0PyJyaWdodCI6cixuLnJlbW92ZUNsYXNzKGYpLmFkZENsYXNzKHIpfXZhciBtPXRoaXMuZ2V0Q2FsY3VsYXRlZE9mZnNldChyLGgsZCxjKTt0aGlzLmFwcGx5UGxhY2VtZW50KG0scik7dmFyIGc9ZnVuY3Rpb24oKXt2YXIgdD1vLmhvdmVyU3RhdGU7by4kZWxlbWVudC50cmlnZ2VyKCJzaG93bi5icy4iK28udHlwZSksby5ob3ZlclN0YXRlPW51bGwsIm91dCI9PXQmJm8ubGVhdmUobyl9O3Quc3VwcG9ydC50cmFuc2l0aW9uJiZ0aGlzLiR0aXAuaGFzQ2xhc3MoImZhZGUiKT9uLm9uZSgiYnNUcmFuc2l0aW9uRW5kIixnKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChwLlRSQU5TSVRJT05fRFVSQVRJT04pOmcoKX19LHAucHJvdG90eXBlLmFwcGx5UGxhY2VtZW50PWZ1bmN0aW9uKGUsaSl7dmFyIG89dGhpcy50aXAoKSxuPW9bMF0ub2Zmc2V0V2lkdGgscz1vWzBdLm9mZnNldEhlaWdodCxyPXBhcnNlSW50KG8uY3NzKCJtYXJnaW4tdG9wIiksMTApLGE9cGFyc2VJbnQoby5jc3MoIm1hcmdpbi1sZWZ0IiksMTApO2lzTmFOKHIpJiYocj0wKSxpc05hTihhKSYmKGE9MCksZS50b3ArPXIsZS5sZWZ0Kz1hLHQub2Zmc2V0LnNldE9mZnNldChvWzBdLHQuZXh0ZW5kKHt1c2luZzpmdW5jdGlvbih0KXtvLmNzcyh7dG9wOk1hdGgucm91bmQodC50b3ApLGxlZnQ6TWF0aC5yb3VuZCh0LmxlZnQpfSl9fSxlKSwwKSxvLmFkZENsYXNzKCJpbiIpO3ZhciBsPW9bMF0ub2Zmc2V0V2lkdGgsaD1vWzBdLm9mZnNldEhlaWdodDsidG9wIj09aSYmaCE9cyYmKGUudG9wPWUudG9wK3MtaCk7dmFyIHA9dGhpcy5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGEoaSxlLGwsaCk7cC5sZWZ0P2UubGVmdCs9cC5sZWZ0OmUudG9wKz1wLnRvcDt2YXIgZD0vdG9wfGJvdHRvbS8udGVzdChpKSxjPWQ/MipwLmxlZnQtbitsOjIqcC50b3AtcytoLGY9ZD8ib2Zmc2V0V2lkdGgiOiJvZmZzZXRIZWlnaHQiO28ub2Zmc2V0KGUpLHRoaXMucmVwbGFjZUFycm93KGMsb1swXVtmXSxkKX0scC5wcm90b3R5cGUucmVwbGFjZUFycm93PWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmFycm93KCkuY3NzKGk/ImxlZnQiOiJ0b3AiLDUwKigxLXQvZSkrIiUiKS5jc3MoaT8idG9wIjoibGVmdCIsIiIpfSxwLnByb3RvdHlwZS5zZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50aXAoKSxlPXRoaXMuZ2V0VGl0bGUoKTt0aGlzLm9wdGlvbnMuaHRtbD8odGhpcy5vcHRpb25zLnNhbml0aXplJiYoZT1pKGUsdGhpcy5vcHRpb25zLndoaXRlTGlzdCx0aGlzLm9wdGlvbnMuc2FuaXRpemVGbikpLHQuZmluZCgiLnRvb2x0aXAtaW5uZXIiKS5odG1sKGUpKTp0LmZpbmQoIi50b29sdGlwLWlubmVyIikudGV4dChlKSx0LnJlbW92ZUNsYXNzKCJmYWRlIGluIHRvcCBib3R0b20gbGVmdCByaWdodCIpfSxwLnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGkoKXsiaW4iIT1vLmhvdmVyU3RhdGUmJm4uZGV0YWNoKCksby4kZWxlbWVudCYmby4kZWxlbWVudC5yZW1vdmVBdHRyKCJhcmlhLWRlc2NyaWJlZGJ5IikudHJpZ2dlcigiaGlkZGVuLmJzLiIrby50eXBlKSxlJiZlKCl9dmFyIG89dGhpcyxuPXQodGhpcy4kdGlwKSxzPXQuRXZlbnQoImhpZGUuYnMuIit0aGlzLnR5cGUpO3JldHVybiB0aGlzLiRlbGVtZW50LnRyaWdnZXIocykscy5pc0RlZmF1bHRQcmV2ZW50ZWQoKT92b2lkIDA6KG4ucmVtb3ZlQ2xhc3MoImluIiksdC5zdXBwb3J0LnRyYW5zaXRpb24mJm4uaGFzQ2xhc3MoImZhZGUiKT9uLm9uZSgiYnNUcmFuc2l0aW9uRW5kIixpKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChwLlRSQU5TSVRJT05fRFVSQVRJT04pOmkoKSx0aGlzLmhvdmVyU3RhdGU9bnVsbCx0aGlzKX0scC5wcm90b3R5cGUuZml4VGl0bGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLiRlbGVtZW50Oyh0LmF0dHIoInRpdGxlIil8fCJzdHJpbmciIT10eXBlb2YgdC5hdHRyKCJkYXRhLW9yaWdpbmFsLXRpdGxlIikpJiZ0LmF0dHIoImRhdGEtb3JpZ2luYWwtdGl0bGUiLHQuYXR0cigidGl0bGUiKXx8IiIpLmF0dHIoInRpdGxlIiwiIil9LHAucHJvdG90eXBlLmhhc0NvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUaXRsZSgpfSxwLnByb3RvdHlwZS5nZXRQb3NpdGlvbj1mdW5jdGlvbihlKXtlPWV8fHRoaXMuJGVsZW1lbnQ7dmFyIGk9ZVswXSxvPSJCT0RZIj09aS50YWdOYW1lLG49aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtudWxsPT1uLndpZHRoJiYobj10LmV4dGVuZCh7fSxuLHt3aWR0aDpuLnJpZ2h0LW4ubGVmdCxoZWlnaHQ6bi5ib3R0b20tbi50b3B9KSk7dmFyIHM9d2luZG93LlNWR0VsZW1lbnQmJmkgaW5zdGFuY2VvZiB3aW5kb3cuU1ZHRWxlbWVudCxyPW8/e3RvcDowLGxlZnQ6MH06cz9udWxsOmUub2Zmc2V0KCksYT17c2Nyb2xsOm8/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A6ZS5zY3JvbGxUb3AoKX0sbD1vP3t3aWR0aDp0KHdpbmRvdykud2lkdGgoKSxoZWlnaHQ6dCh3aW5kb3cpLmhlaWdodCgpfTpudWxsO3JldHVybiB0LmV4dGVuZCh7fSxuLGEsbCxyKX0scC5wcm90b3R5cGUuZ2V0Q2FsY3VsYXRlZE9mZnNldD1mdW5jdGlvbih0LGUsaSxvKXtyZXR1cm4iYm90dG9tIj09dD97dG9wOmUudG9wK2UuaGVpZ2h0LGxlZnQ6ZS5sZWZ0K2Uud2lkdGgvMi1pLzJ9OiJ0b3AiPT10P3t0b3A6ZS50b3AtbyxsZWZ0OmUubGVmdCtlLndpZHRoLzItaS8yfToibGVmdCI9PXQ/e3RvcDplLnRvcCtlLmhlaWdodC8yLW8vMixsZWZ0OmUubGVmdC1pfTp7dG9wOmUudG9wK2UuaGVpZ2h0LzItby8yLGxlZnQ6ZS5sZWZ0K2Uud2lkdGh9fSxwLnByb3RvdHlwZS5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGE9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49e3RvcDowLGxlZnQ6MH07aWYoIXRoaXMuJHZpZXdwb3J0KXJldHVybiBuO3ZhciBzPXRoaXMub3B0aW9ucy52aWV3cG9ydCYmdGhpcy5vcHRpb25zLnZpZXdwb3J0LnBhZGRpbmd8fDAscj10aGlzLmdldFBvc2l0aW9uKHRoaXMuJHZpZXdwb3J0KTtpZigvcmlnaHR8bGVmdC8udGVzdCh0KSl7dmFyIGE9ZS50b3Atcy1yLnNjcm9sbCxsPWUudG9wK3Mtci5zY3JvbGwrbzthPHIudG9wP24udG9wPXIudG9wLWE6bD5yLnRvcCtyLmhlaWdodCYmKG4udG9wPXIudG9wK3IuaGVpZ2h0LWwpfWVsc2V7dmFyIGg9ZS5sZWZ0LXMscD1lLmxlZnQrcytpO2g8ci5sZWZ0P24ubGVmdD1yLmxlZnQtaDpwPnIucmlnaHQmJihuLmxlZnQ9ci5sZWZ0K3Iud2lkdGgtcCl9cmV0dXJuIG59LHAucHJvdG90eXBlLmdldFRpdGxlPWZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLiRlbGVtZW50LGk9dGhpcy5vcHRpb25zO3JldHVybiB0PWUuYXR0cigiZGF0YS1vcmlnaW5hbC10aXRsZSIpfHwoImZ1bmN0aW9uIj09dHlwZW9mIGkudGl0bGU/aS50aXRsZS5jYWxsKGVbMF0pOmkudGl0bGUpfSxwLnByb3RvdHlwZS5nZXRVSUQ9ZnVuY3Rpb24odCl7ZG8gdCs9fn4oMWU2Kk1hdGgucmFuZG9tKCkpO3doaWxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQpKTtyZXR1cm4gdH0scC5wcm90b3R5cGUudGlwPWZ1bmN0aW9uKCl7aWYoIXRoaXMuJHRpcCYmKHRoaXMuJHRpcD10KHRoaXMub3B0aW9ucy50ZW1wbGF0ZSksMSE9dGhpcy4kdGlwLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKHRoaXMudHlwZSsiIGB0ZW1wbGF0ZWAgb3B0aW9uIG11c3QgY29uc2lzdCBvZiBleGFjdGx5IDEgdG9wLWxldmVsIGVsZW1lbnQhIik7cmV0dXJuIHRoaXMuJHRpcH0scC5wcm90b3R5cGUuYXJyb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYXJyb3c9dGhpcy4kYXJyb3d8fHRoaXMudGlwKCkuZmluZCgiLnRvb2x0aXAtYXJyb3ciKX0scC5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSEwfSxwLnByb3RvdHlwZS5kaXNhYmxlPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSExfSxwLnByb3RvdHlwZS50b2dnbGVFbmFibGVkPWZ1bmN0aW9uKCl7dGhpcy5lbmFibGVkPSF0aGlzLmVuYWJsZWR9LHAucHJvdG90eXBlLnRvZ2dsZT1mdW5jdGlvbihlKXt2YXIgaT10aGlzO2UmJihpPXQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSksaXx8KGk9bmV3IHRoaXMuY29uc3RydWN0b3IoZS5jdXJyZW50VGFyZ2V0LHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpLHQoZS5jdXJyZW50VGFyZ2V0KS5kYXRhKCJicy4iK3RoaXMudHlwZSxpKSkpLGU/KGkuaW5TdGF0ZS5jbGljaz0haS5pblN0YXRlLmNsaWNrLGkuaXNJblN0YXRlVHJ1ZSgpP2kuZW50ZXIoaSk6aS5sZWF2ZShpKSk6aS50aXAoKS5oYXNDbGFzcygiaW4iKT9pLmxlYXZlKGkpOmkuZW50ZXIoaSl9LHAucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2NsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpLHRoaXMuaGlkZShmdW5jdGlvbigpe3QuJGVsZW1lbnQub2ZmKCIuIit0LnR5cGUpLnJlbW92ZURhdGEoImJzLiIrdC50eXBlKSx0LiR0aXAmJnQuJHRpcC5kZXRhY2goKSx0LiR0aXA9bnVsbCx0LiRhcnJvdz1udWxsLHQuJHZpZXdwb3J0PW51bGwsdC4kZWxlbWVudD1udWxsfSl9LHAucHJvdG90eXBlLnNhbml0aXplSHRtbD1mdW5jdGlvbih0KXtyZXR1cm4gaSh0LHRoaXMub3B0aW9ucy53aGl0ZUxpc3QsdGhpcy5vcHRpb25zLnNhbml0aXplRm4pfTt2YXIgZD10LmZuLnRvb2x0aXA7dC5mbi50b29sdGlwPW8sdC5mbi50b29sdGlwLkNvbnN0cnVjdG9yPXAsdC5mbi50b29sdGlwLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdC5mbi50b29sdGlwPWQsdGhpc319KGpRdWVyeSksK2Z1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbz10KHRoaXMpLG49by5kYXRhKCJicy5wb3BvdmVyIikscz0ib2JqZWN0Ij09dHlwZW9mIGUmJmU7IW4mJi9kZXN0cm95fGhpZGUvLnRlc3QoZSl8fChufHxvLmRhdGEoImJzLnBvcG92ZXIiLG49bmV3IGkodGhpcyxzKSksInN0cmluZyI9PXR5cGVvZiBlJiZuW2VdKCkpfSl9dmFyIGk9ZnVuY3Rpb24odCxlKXt0aGlzLmluaXQoInBvcG92ZXIiLHQsZSl9O2lmKCF0LmZuLnRvb2x0aXApdGhyb3cgbmV3IEVycm9yKCJQb3BvdmVyIHJlcXVpcmVzIHRvb2x0aXAuanMiKTtpLlZFUlNJT049IjMuNC4xIixpLkRFRkFVTFRTPXQuZXh0ZW5kKHt9LHQuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvci5ERUZBVUxUUyx7cGxhY2VtZW50OiJyaWdodCIsdHJpZ2dlcjoiY2xpY2siLGNvbnRlbnQ6IiIsdGVtcGxhdGU6JzxkaXYgY2xhc3M9InBvcG92ZXIiIHJvbGU9InRvb2x0aXAiPjxkaXYgY2xhc3M9ImFycm93Ij48L2Rpdj48aDMgY2xhc3M9InBvcG92ZXItdGl0bGUiPjwvaDM+PGRpdiBjbGFzcz0icG9wb3Zlci1jb250ZW50Ij48L2Rpdj48L2Rpdj4nfSksaS5wcm90b3R5cGU9dC5leHRlbmQoe30sdC5mbi50b29sdGlwLkNvbnN0cnVjdG9yLnByb3RvdHlwZSksaS5wcm90b3R5cGUuY29uc3RydWN0b3I9aSxpLnByb3RvdHlwZS5nZXREZWZhdWx0cz1mdW5jdGlvbigpe3JldHVybiBpLkRFRkFVTFRTfSxpLnByb3RvdHlwZS5zZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50aXAoKSxlPXRoaXMuZ2V0VGl0bGUoKSxpPXRoaXMuZ2V0Q29udGVudCgpO2lmKHRoaXMub3B0aW9ucy5odG1sKXt2YXIgbz10eXBlb2YgaTt0aGlzLm9wdGlvbnMuc2FuaXRpemUmJihlPXRoaXMuc2FuaXRpemVIdG1sKGUpLCJzdHJpbmciPT09byYmKGk9dGhpcy5zYW5pdGl6ZUh0bWwoaSkpKSx0LmZpbmQoIi5wb3BvdmVyLXRpdGxlIikuaHRtbChlKSx0LmZpbmQoIi5wb3BvdmVyLWNvbnRlbnQiKS5jaGlsZHJlbigpLmRldGFjaCgpLmVuZCgpWyJzdHJpbmciPT09bz8iaHRtbCI6ImFwcGVuZCJdKGkpfWVsc2UgdC5maW5kKCIucG9wb3Zlci10aXRsZSIpLnRleHQoZSksdC5maW5kKCIucG9wb3Zlci1jb250ZW50IikuY2hpbGRyZW4oKS5kZXRhY2goKS5lbmQoKS50ZXh0KGkpO3QucmVtb3ZlQ2xhc3MoImZhZGUgdG9wIGJvdHRvbSBsZWZ0IHJpZ2h0IGluIiksdC5maW5kKCIucG9wb3Zlci10aXRsZSIpLmh0bWwoKXx8dC5maW5kKCIucG9wb3Zlci10aXRsZSIpLmhpZGUoKX0saS5wcm90b3R5cGUuaGFzQ29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpdGxlKCl8fHRoaXMuZ2V0Q29udGVudCgpfSxpLnByb3RvdHlwZS5nZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy4kZWxlbWVudCxlPXRoaXMub3B0aW9ucztyZXR1cm4gdC5hdHRyKCJkYXRhLWNvbnRlbnQiKXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnRlbnQ/ZS5jb250ZW50LmNhbGwodFswXSk6ZS5jb250ZW50KX0saS5wcm90b3R5cGUuYXJyb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYXJyb3c9dGhpcy4kYXJyb3d8fHRoaXMudGlwKCkuZmluZCgiLmFycm93Iil9O3ZhciBvPXQuZm4ucG9wb3Zlcjt0LmZuLnBvcG92ZXI9ZSx0LmZuLnBvcG92ZXIuQ29uc3RydWN0b3I9aSx0LmZuLnBvcG92ZXIubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiB0LmZuLnBvcG92ZXI9byx0aGlzfX0oalF1ZXJ5KTsoZnVuY3Rpb24oJCl7JCh3aW5kb3cpLm9uKCJsb2FkIixmdW5jdGlvbigpeyQoZG9jdW1lbnQpLnNjcm9sbHppcEluaXQoKTskKGRvY3VtZW50KS5yb2xsZXJJbml0KCl9KTskKHdpbmRvdykub24oImxvYWQgc2Nyb2xsIHJlc2l6ZSIsZnVuY3Rpb24oKXskKCcubnVtc2Nyb2xsZXInKS5zY3JvbGx6aXAoe3Nob3dGdW5jdGlvbjpmdW5jdGlvbigpe251bWJlclJvbGxlcigkKHRoaXMpLmF0dHIoJ2RhdGEtc2xubycpKX0sd2hvbGVWaXNpYmxlOiExLH0pfSk7JC5mbi5zY3JvbGx6aXBJbml0PWZ1bmN0aW9uKCl7JCgnYm9keScpLnByZXBlbmQoIjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmZpeGVkO3RvcDowcHg7bGVmdDowcHg7d2lkdGg6MDtoZWlnaHQ6MDsnIGlkPSdzY3JvbGx6aXBQb2ludCc+PC9kaXY+Iil9OyQuZm4ucm9sbGVySW5pdD1mdW5jdGlvbigpe3ZhciBpPTA7JCgnLm51bXNjcm9sbGVyJykuZWFjaChmdW5jdGlvbigpe2krKzskKHRoaXMpLmF0dHIoJ2RhdGEtc2xubycsaSk7JCh0aGlzKS5hZGRDbGFzcygicm9sbGVyLXRpdGxlLW51bWJlci0iK2kpfSl9OyQuZm4uc2Nyb2xsemlwPWZ1bmN0aW9uKG9wdGlvbnMpe3ZhciBzZXR0aW5ncz0kLmV4dGVuZCh7c2hvd0Z1bmN0aW9uOm51bGwsaGlkZUZ1bmN0aW9uOm51bGwsc2hvd1NoaWZ0OjAsd2hvbGVWaXNpYmxlOiExLGhpZGVTaGlmdDowLH0sb3B0aW9ucyk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpLG9iail7JCh0aGlzKS5hZGRDbGFzcygnc2Nyb2xsemlwJyk7aWYoJC5pc0Z1bmN0aW9uKHNldHRpbmdzLnNob3dGdW5jdGlvbikpe2lmKCEkKHRoaXMpLmhhc0NsYXNzKCdpc1Nob3duJykmJigkKHdpbmRvdykub3V0ZXJIZWlnaHQoKSskKCcjc2Nyb2xsemlwUG9pbnQnKS5vZmZzZXQoKS50b3Atc2V0dGluZ3Muc2hvd1NoaWZ0KT4oJCh0aGlzKS5vZmZzZXQoKS50b3ArKChzZXR0aW5ncy53aG9sZVZpc2libGUpPyQodGhpcykub3V0ZXJIZWlnaHQoKTowKSkmJigkKCcjc2Nyb2xsemlwUG9pbnQnKS5vZmZzZXQoKS50b3ArKChzZXR0aW5ncy53aG9sZVZpc2libGUpPyQodGhpcykub3V0ZXJIZWlnaHQoKTowKSk8KCQodGhpcykub3V0ZXJIZWlnaHQoKSskKHRoaXMpLm9mZnNldCgpLnRvcC1zZXR0aW5ncy5zaG93U2hpZnQpKXskKHRoaXMpLmFkZENsYXNzKCdpc1Nob3duJyk7c2V0dGluZ3Muc2hvd0Z1bmN0aW9uLmNhbGwodGhpcyl9fQppZigkLmlzRnVuY3Rpb24oc2V0dGluZ3MuaGlkZUZ1bmN0aW9uKSl7aWYoJCh0aGlzKS5oYXNDbGFzcygnaXNTaG93bicpJiYoKCQod2luZG93KS5vdXRlckhlaWdodCgpKyQoJyNzY3JvbGx6aXBQb2ludCcpLm9mZnNldCgpLnRvcC1zZXR0aW5ncy5oaWRlU2hpZnQpPCgkKHRoaXMpLm9mZnNldCgpLnRvcCsoKHNldHRpbmdzLndob2xlVmlzaWJsZSk/JCh0aGlzKS5vdXRlckhlaWdodCgpOjApKXx8KCQoJyNzY3JvbGx6aXBQb2ludCcpLm9mZnNldCgpLnRvcCsoKHNldHRpbmdzLndob2xlVmlzaWJsZSk/JCh0aGlzKS5vdXRlckhlaWdodCgpOjApKT4oJCh0aGlzKS5vdXRlckhlaWdodCgpKyQodGhpcykub2Zmc2V0KCkudG9wLXNldHRpbmdzLmhpZGVTaGlmdCkpKXskKHRoaXMpLnJlbW92ZUNsYXNzKCdpc1Nob3duJyk7c2V0dGluZ3MuaGlkZUZ1bmN0aW9uLmNhbGwodGhpcyl9fQpyZXR1cm4gdGhpc30pfTtmdW5jdGlvbiBudW1iZXJSb2xsZXIoc2xubyl7dmFyIG1pbj0kKCcucm9sbGVyLXRpdGxlLW51bWJlci0nK3Nsbm8pLmF0dHIoJ2RhdGEtbWluJyk7dmFyIG1heD0kKCcucm9sbGVyLXRpdGxlLW51bWJlci0nK3Nsbm8pLmF0dHIoJ2RhdGEtbWF4Jyk7dmFyIHRpbWVkaWZmPSQoJy5yb2xsZXItdGl0bGUtbnVtYmVyLScrc2xubykuYXR0cignZGF0YS1kZWxheScpO3ZhciBpbmNyZW1lbnQ9JCgnLnJvbGxlci10aXRsZS1udW1iZXItJytzbG5vKS5hdHRyKCdkYXRhLWluY3JlbWVudCcpO3ZhciBudW1kaWZmPW1heC1taW47dmFyIHRpbWVvdXQ9KHRpbWVkaWZmKjEwMDApL251bWRpZmY7bnVtYmVyUm9sbChzbG5vLG1pbixtYXgsaW5jcmVtZW50LHRpbWVvdXQpfQpmdW5jdGlvbiBudW1iZXJSb2xsKHNsbm8sbWluLG1heCxpbmNyZW1lbnQsdGltZW91dCl7aWYobWluPD1tYXgpeyQoJy5yb2xsZXItdGl0bGUtbnVtYmVyLScrc2xubykuaHRtbChtaW4pO21pbj1wYXJzZUludChtaW4pK3BhcnNlSW50KGluY3JlbWVudCk7c2V0VGltZW91dChmdW5jdGlvbigpe251bWJlclJvbGwoZXZhbChzbG5vKSxldmFsKG1pbiksZXZhbChtYXgpLGV2YWwoaW5jcmVtZW50KSxldmFsKHRpbWVvdXQpKX0sdGltZW91dCl9ZWxzZXskKCcucm9sbGVyLXRpdGxlLW51bWJlci0nK3Nsbm8pLmh0bWwobWF4KX19fSkoalF1ZXJ5KTshZnVuY3Rpb24oYSxiLGMsZCl7ZnVuY3Rpb24gZShiLGMpe3RoaXMuc2V0dGluZ3M9bnVsbCx0aGlzLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyxjKSx0aGlzLiRlbGVtZW50PWEoYiksdGhpcy5faGFuZGxlcnM9e30sdGhpcy5fcGx1Z2lucz17fSx0aGlzLl9zdXByZXNzPXt9LHRoaXMuX2N1cnJlbnQ9bnVsbCx0aGlzLl9zcGVlZD1udWxsLHRoaXMuX2Nvb3JkaW5hdGVzPVtdLHRoaXMuX2JyZWFrcG9pbnQ9bnVsbCx0aGlzLl93aWR0aD1udWxsLHRoaXMuX2l0ZW1zPVtdLHRoaXMuX2Nsb25lcz1bXSx0aGlzLl9tZXJnZXJzPVtdLHRoaXMuX3dpZHRocz1bXSx0aGlzLl9pbnZhbGlkYXRlZD17fSx0aGlzLl9waXBlPVtdLHRoaXMuX2RyYWc9e3RpbWU6bnVsbCx0YXJnZXQ6bnVsbCxwb2ludGVyOm51bGwsc3RhZ2U6e3N0YXJ0Om51bGwsY3VycmVudDpudWxsfSxkaXJlY3Rpb246bnVsbH0sdGhpcy5fc3RhdGVzPXtjdXJyZW50Ont9LHRhZ3M6e2luaXRpYWxpemluZzpbImJ1c3kiXSxhbmltYXRpbmc6WyJidXN5Il0sZHJhZ2dpbmc6WyJpbnRlcmFjdGluZyJdfX0sYS5lYWNoKFsib25SZXNpemUiLCJvblRocm90dGxlZFJlc2l6ZSJdLGEucHJveHkoZnVuY3Rpb24oYixjKXt0aGlzLl9oYW5kbGVyc1tjXT1hLnByb3h5KHRoaXNbY10sdGhpcyl9LHRoaXMpKSxhLmVhY2goZS5QbHVnaW5zLGEucHJveHkoZnVuY3Rpb24oYSxiKXt0aGlzLl9wbHVnaW5zW2EuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkrYS5zbGljZSgxKV09bmV3IGIodGhpcyl9LHRoaXMpKSxhLmVhY2goZS5Xb3JrZXJzLGEucHJveHkoZnVuY3Rpb24oYixjKXt0aGlzLl9waXBlLnB1c2goe2ZpbHRlcjpjLmZpbHRlcixydW46YS5wcm94eShjLnJ1bix0aGlzKX0pfSx0aGlzKSksdGhpcy5zZXR1cCgpLHRoaXMuaW5pdGlhbGl6ZSgpfWUuRGVmYXVsdHM9e2l0ZW1zOjMsbG9vcDohMSxjZW50ZXI6ITEscmV3aW5kOiExLGNoZWNrVmlzaWJpbGl0eTohMCxtb3VzZURyYWc6ITAsdG91Y2hEcmFnOiEwLHB1bGxEcmFnOiEwLGZyZWVEcmFnOiExLG1hcmdpbjowLHN0YWdlUGFkZGluZzowLG1lcmdlOiExLG1lcmdlRml0OiEwLGF1dG9XaWR0aDohMSxzdGFydFBvc2l0aW9uOjAscnRsOiExLHNtYXJ0U3BlZWQ6MjUwLGZsdWlkU3BlZWQ6ITEsZHJhZ0VuZFNwZWVkOiExLHJlc3BvbnNpdmU6e30scmVzcG9uc2l2ZVJlZnJlc2hSYXRlOjIwMCxyZXNwb25zaXZlQmFzZUVsZW1lbnQ6YixmYWxsYmFja0Vhc2luZzoic3dpbmciLHNsaWRlVHJhbnNpdGlvbjoiIixpbmZvOiExLG5lc3RlZEl0ZW1TZWxlY3RvcjohMSxpdGVtRWxlbWVudDoiZGl2IixzdGFnZUVsZW1lbnQ6ImRpdiIscmVmcmVzaENsYXNzOiJvd2wtcmVmcmVzaCIsbG9hZGVkQ2xhc3M6Im93bC1sb2FkZWQiLGxvYWRpbmdDbGFzczoib3dsLWxvYWRpbmciLHJ0bENsYXNzOiJvd2wtcnRsIixyZXNwb25zaXZlQ2xhc3M6Im93bC1yZXNwb25zaXZlIixkcmFnQ2xhc3M6Im93bC1kcmFnIixpdGVtQ2xhc3M6Im93bC1pdGVtIixzdGFnZUNsYXNzOiJvd2wtc3RhZ2UiLHN0YWdlT3V0ZXJDbGFzczoib3dsLXN0YWdlLW91dGVyIixncmFiQ2xhc3M6Im93bC1ncmFiIn0sZS5XaWR0aD17RGVmYXVsdDoiZGVmYXVsdCIsSW5uZXI6ImlubmVyIixPdXRlcjoib3V0ZXIifSxlLlR5cGU9e0V2ZW50OiJldmVudCIsU3RhdGU6InN0YXRlIn0sZS5QbHVnaW5zPXt9LGUuV29ya2Vycz1be2ZpbHRlcjpbIndpZHRoIiwic2V0dGluZ3MiXSxydW46ZnVuY3Rpb24oKXt0aGlzLl93aWR0aD10aGlzLiRlbGVtZW50LndpZHRoKCl9fSx7ZmlsdGVyOlsid2lkdGgiLCJpdGVtcyIsInNldHRpbmdzIl0scnVuOmZ1bmN0aW9uKGEpe2EuY3VycmVudD10aGlzLl9pdGVtcyYmdGhpcy5faXRlbXNbdGhpcy5yZWxhdGl2ZSh0aGlzLl9jdXJyZW50KV19fSx7ZmlsdGVyOlsiaXRlbXMiLCJzZXR0aW5ncyJdLHJ1bjpmdW5jdGlvbigpe3RoaXMuJHN0YWdlLmNoaWxkcmVuKCIuY2xvbmVkIikucmVtb3ZlKCl9fSx7ZmlsdGVyOlsid2lkdGgiLCJpdGVtcyIsInNldHRpbmdzIl0scnVuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc2V0dGluZ3MubWFyZ2lufHwiIixjPSF0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCxkPXRoaXMuc2V0dGluZ3MucnRsLGU9e3dpZHRoOiJhdXRvIiwibWFyZ2luLWxlZnQiOmQ/YjoiIiwibWFyZ2luLXJpZ2h0IjpkPyIiOmJ9OyFjJiZ0aGlzLiRzdGFnZS5jaGlsZHJlbigpLmNzcyhlKSxhLmNzcz1lfX0se2ZpbHRlcjpbIndpZHRoIiwiaXRlbXMiLCJzZXR0aW5ncyJdLHJ1bjpmdW5jdGlvbihhKXt2YXIgYj0odGhpcy53aWR0aCgpL3RoaXMuc2V0dGluZ3MuaXRlbXMpLnRvRml4ZWQoMyktdGhpcy5zZXR0aW5ncy5tYXJnaW4sYz1udWxsLGQ9dGhpcy5faXRlbXMubGVuZ3RoLGU9IXRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoLGY9W107Zm9yKGEuaXRlbXM9e21lcmdlOiExLHdpZHRoOmJ9O2QtLTspYz10aGlzLl9tZXJnZXJzW2RdLGM9dGhpcy5zZXR0aW5ncy5tZXJnZUZpdCYmTWF0aC5taW4oYyx0aGlzLnNldHRpbmdzLml0ZW1zKXx8YyxhLml0ZW1zLm1lcmdlPWM+MXx8YS5pdGVtcy5tZXJnZSxmW2RdPWU/YipjOnRoaXMuX2l0ZW1zW2RdLndpZHRoKCk7dGhpcy5fd2lkdGhzPWZ9fSx7ZmlsdGVyOlsiaXRlbXMiLCJzZXR0aW5ncyJdLHJ1bjpmdW5jdGlvbigpe3ZhciBiPVtdLGM9dGhpcy5faXRlbXMsZD10aGlzLnNldHRpbmdzLGU9TWF0aC5tYXgoMipkLml0ZW1zLDQpLGY9MipNYXRoLmNlaWwoYy5sZW5ndGgvMiksZz1kLmxvb3AmJmMubGVuZ3RoP2QucmV3aW5kP2U6TWF0aC5tYXgoZSxmKTowLGg9IiIsaT0iIjtmb3IoZy89MjtnPjA7KWIucHVzaCh0aGlzLm5vcm1hbGl6ZShiLmxlbmd0aC8yLCEwKSksaCs9Y1tiW2IubGVuZ3RoLTFdXVswXS5vdXRlckhUTUwsYi5wdXNoKHRoaXMubm9ybWFsaXplKGMubGVuZ3RoLTEtKGIubGVuZ3RoLTEpLzIsITApKSxpPWNbYltiLmxlbmd0aC0xXV1bMF0ub3V0ZXJIVE1MK2ksZy09MTt0aGlzLl9jbG9uZXM9YixhKGgpLmFkZENsYXNzKCJjbG9uZWQiKS5hcHBlbmRUbyh0aGlzLiRzdGFnZSksYShpKS5hZGRDbGFzcygiY2xvbmVkIikucHJlcGVuZFRvKHRoaXMuJHN0YWdlKX19LHtmaWx0ZXI6WyJ3aWR0aCIsIml0ZW1zIiwic2V0dGluZ3MiXSxydW46ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5zZXR0aW5ncy5ydGw/MTotMSxiPXRoaXMuX2Nsb25lcy5sZW5ndGgrdGhpcy5faXRlbXMubGVuZ3RoLGM9LTEsZD0wLGU9MCxmPVtdOysrYzxiOylkPWZbYy0xXXx8MCxlPXRoaXMuX3dpZHRoc1t0aGlzLnJlbGF0aXZlKGMpXSt0aGlzLnNldHRpbmdzLm1hcmdpbixmLnB1c2goZCtlKmEpO3RoaXMuX2Nvb3JkaW5hdGVzPWZ9fSx7ZmlsdGVyOlsid2lkdGgiLCJpdGVtcyIsInNldHRpbmdzIl0scnVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZXR0aW5ncy5zdGFnZVBhZGRpbmcsYj10aGlzLl9jb29yZGluYXRlcyxjPXt3aWR0aDpNYXRoLmNlaWwoTWF0aC5hYnMoYltiLmxlbmd0aC0xXSkpKzIqYSwicGFkZGluZy1sZWZ0IjphfHwiIiwicGFkZGluZy1yaWdodCI6YXx8IiJ9O3RoaXMuJHN0YWdlLmNzcyhjKX19LHtmaWx0ZXI6WyJ3aWR0aCIsIml0ZW1zIiwic2V0dGluZ3MiXSxydW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoLGM9IXRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoLGQ9dGhpcy4kc3RhZ2UuY2hpbGRyZW4oKTtpZihjJiZhLml0ZW1zLm1lcmdlKWZvcig7Yi0tOylhLmNzcy53aWR0aD10aGlzLl93aWR0aHNbdGhpcy5yZWxhdGl2ZShiKV0sZC5lcShiKS5jc3MoYS5jc3MpO2Vsc2UgYyYmKGEuY3NzLndpZHRoPWEuaXRlbXMud2lkdGgsZC5jc3MoYS5jc3MpKX19LHtmaWx0ZXI6WyJpdGVtcyJdLHJ1bjpmdW5jdGlvbigpe3RoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDwxJiZ0aGlzLiRzdGFnZS5yZW1vdmVBdHRyKCJzdHlsZSIpfX0se2ZpbHRlcjpbIndpZHRoIiwiaXRlbXMiLCJzZXR0aW5ncyJdLHJ1bjpmdW5jdGlvbihhKXthLmN1cnJlbnQ9YS5jdXJyZW50P3RoaXMuJHN0YWdlLmNoaWxkcmVuKCkuaW5kZXgoYS5jdXJyZW50KTowLGEuY3VycmVudD1NYXRoLm1heCh0aGlzLm1pbmltdW0oKSxNYXRoLm1pbih0aGlzLm1heGltdW0oKSxhLmN1cnJlbnQpKSx0aGlzLnJlc2V0KGEuY3VycmVudCl9fSx7ZmlsdGVyOlsicG9zaXRpb24iXSxydW46ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGUodGhpcy5jb29yZGluYXRlcyh0aGlzLl9jdXJyZW50KSl9fSx7ZmlsdGVyOlsid2lkdGgiLCJwb3NpdGlvbiIsIml0ZW1zIiwic2V0dGluZ3MiXSxydW46ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlPXRoaXMuc2V0dGluZ3MucnRsPzE6LTEsZj0yKnRoaXMuc2V0dGluZ3Muc3RhZ2VQYWRkaW5nLGc9dGhpcy5jb29yZGluYXRlcyh0aGlzLmN1cnJlbnQoKSkrZixoPWcrdGhpcy53aWR0aCgpKmUsaT1bXTtmb3IoYz0wLGQ9dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoO2M8ZDtjKyspYT10aGlzLl9jb29yZGluYXRlc1tjLTFdfHwwLGI9TWF0aC5hYnModGhpcy5fY29vcmRpbmF0ZXNbY10pK2YqZSwodGhpcy5vcChhLCI8PSIsZykmJnRoaXMub3AoYSwiPiIsaCl8fHRoaXMub3AoYiwiPCIsZykmJnRoaXMub3AoYiwiPiIsaCkpJiZpLnB1c2goYyk7dGhpcy4kc3RhZ2UuY2hpbGRyZW4oIi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIiksdGhpcy4kc3RhZ2UuY2hpbGRyZW4oIjplcSgiK2kuam9pbigiKSwgOmVxKCIpKyIpIikuYWRkQ2xhc3MoImFjdGl2ZSIpLHRoaXMuJHN0YWdlLmNoaWxkcmVuKCIuY2VudGVyIikucmVtb3ZlQ2xhc3MoImNlbnRlciIpLHRoaXMuc2V0dGluZ3MuY2VudGVyJiZ0aGlzLiRzdGFnZS5jaGlsZHJlbigpLmVxKHRoaXMuY3VycmVudCgpKS5hZGRDbGFzcygiY2VudGVyIil9fV0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZVN0YWdlPWZ1bmN0aW9uKCl7dGhpcy4kc3RhZ2U9dGhpcy4kZWxlbWVudC5maW5kKCIuIit0aGlzLnNldHRpbmdzLnN0YWdlQ2xhc3MpLHRoaXMuJHN0YWdlLmxlbmd0aHx8KHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmxvYWRpbmdDbGFzcyksdGhpcy4kc3RhZ2U9YSgiPCIrdGhpcy5zZXR0aW5ncy5zdGFnZUVsZW1lbnQrIj4iLHtjbGFzczp0aGlzLnNldHRpbmdzLnN0YWdlQ2xhc3N9KS53cmFwKGEoIjxkaXYvPiIse2NsYXNzOnRoaXMuc2V0dGluZ3Muc3RhZ2VPdXRlckNsYXNzfSkpLHRoaXMuJGVsZW1lbnQuYXBwZW5kKHRoaXMuJHN0YWdlLnBhcmVudCgpKSl9LGUucHJvdG90eXBlLmluaXRpYWxpemVJdGVtcz1mdW5jdGlvbigpe3ZhciBiPXRoaXMuJGVsZW1lbnQuZmluZCgiLm93bC1pdGVtIik7aWYoYi5sZW5ndGgpcmV0dXJuIHRoaXMuX2l0ZW1zPWIuZ2V0KCkubWFwKGZ1bmN0aW9uKGIpe3JldHVybiBhKGIpfSksdGhpcy5fbWVyZ2Vycz10aGlzLl9pdGVtcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gMX0pLHZvaWQgdGhpcy5yZWZyZXNoKCk7dGhpcy5yZXBsYWNlKHRoaXMuJGVsZW1lbnQuY2hpbGRyZW4oKS5ub3QodGhpcy4kc3RhZ2UucGFyZW50KCkpKSx0aGlzLmlzVmlzaWJsZSgpP3RoaXMucmVmcmVzaCgpOnRoaXMuaW52YWxpZGF0ZSgid2lkdGgiKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3MpLmFkZENsYXNzKHRoaXMub3B0aW9ucy5sb2FkZWRDbGFzcyl9LGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtpZih0aGlzLmVudGVyKCJpbml0aWFsaXppbmciKSx0aGlzLnRyaWdnZXIoImluaXRpYWxpemUiKSx0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKHRoaXMuc2V0dGluZ3MucnRsQ2xhc3MsdGhpcy5zZXR0aW5ncy5ydGwpLHRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoJiYhdGhpcy5pcygicHJlLWxvYWRpbmciKSl7dmFyIGEsYixjO2E9dGhpcy4kZWxlbWVudC5maW5kKCJpbWciKSxiPXRoaXMuc2V0dGluZ3MubmVzdGVkSXRlbVNlbGVjdG9yPyIuIit0aGlzLnNldHRpbmdzLm5lc3RlZEl0ZW1TZWxlY3RvcjpkLGM9dGhpcy4kZWxlbWVudC5jaGlsZHJlbihiKS53aWR0aCgpLGEubGVuZ3RoJiZjPD0wJiZ0aGlzLnByZWxvYWRBdXRvV2lkdGhJbWFnZXMoYSl9dGhpcy5pbml0aWFsaXplU3RhZ2UoKSx0aGlzLmluaXRpYWxpemVJdGVtcygpLHRoaXMucmVnaXN0ZXJFdmVudEhhbmRsZXJzKCksdGhpcy5sZWF2ZSgiaW5pdGlhbGl6aW5nIiksdGhpcy50cmlnZ2VyKCJpbml0aWFsaXplZCIpfSxlLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5zZXR0aW5ncy5jaGVja1Zpc2liaWxpdHl8fHRoaXMuJGVsZW1lbnQuaXMoIjp2aXNpYmxlIil9LGUucHJvdG90eXBlLnNldHVwPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWV3cG9ydCgpLGM9dGhpcy5vcHRpb25zLnJlc3BvbnNpdmUsZD0tMSxlPW51bGw7Yz8oYS5lYWNoKGMsZnVuY3Rpb24oYSl7YTw9YiYmYT5kJiYoZD1OdW1iZXIoYSkpfSksZT1hLmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMsY1tkXSksImZ1bmN0aW9uIj09dHlwZW9mIGUuc3RhZ2VQYWRkaW5nJiYoZS5zdGFnZVBhZGRpbmc9ZS5zdGFnZVBhZGRpbmcoKSksZGVsZXRlIGUucmVzcG9uc2l2ZSxlLnJlc3BvbnNpdmVDbGFzcyYmdGhpcy4kZWxlbWVudC5hdHRyKCJjbGFzcyIsdGhpcy4kZWxlbWVudC5hdHRyKCJjbGFzcyIpLnJlcGxhY2UobmV3IFJlZ0V4cCgiKCIrdGhpcy5vcHRpb25zLnJlc3BvbnNpdmVDbGFzcysiLSlcXFMrXFxzIiwiZyIpLCIkMSIrZCkpKTplPWEuZXh0ZW5kKHt9LHRoaXMub3B0aW9ucyksdGhpcy50cmlnZ2VyKCJjaGFuZ2UiLHtwcm9wZXJ0eTp7bmFtZToic2V0dGluZ3MiLHZhbHVlOmV9fSksdGhpcy5fYnJlYWtwb2ludD1kLHRoaXMuc2V0dGluZ3M9ZSx0aGlzLmludmFsaWRhdGUoInNldHRpbmdzIiksdGhpcy50cmlnZ2VyKCJjaGFuZ2VkIix7cHJvcGVydHk6e25hbWU6InNldHRpbmdzIix2YWx1ZTp0aGlzLnNldHRpbmdzfX0pfSxlLnByb3RvdHlwZS5vcHRpb25zTG9naWM9ZnVuY3Rpb24oKXt0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCYmKHRoaXMuc2V0dGluZ3Muc3RhZ2VQYWRkaW5nPSExLHRoaXMuc2V0dGluZ3MubWVyZ2U9ITEpfSxlLnByb3RvdHlwZS5wcmVwYXJlPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMudHJpZ2dlcigicHJlcGFyZSIse2NvbnRlbnQ6Yn0pO3JldHVybiBjLmRhdGF8fChjLmRhdGE9YSgiPCIrdGhpcy5zZXR0aW5ncy5pdGVtRWxlbWVudCsiLz4iKS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaXRlbUNsYXNzKS5hcHBlbmQoYikpLHRoaXMudHJpZ2dlcigicHJlcGFyZWQiLHtjb250ZW50OmMuZGF0YX0pLGMuZGF0YX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTAsYz10aGlzLl9waXBlLmxlbmd0aCxkPWEucHJveHkoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXNbYV19LHRoaXMuX2ludmFsaWRhdGVkKSxlPXt9O2I8YzspKHRoaXMuX2ludmFsaWRhdGVkLmFsbHx8YS5ncmVwKHRoaXMuX3BpcGVbYl0uZmlsdGVyLGQpLmxlbmd0aD4wKSYmdGhpcy5fcGlwZVtiXS5ydW4oZSksYisrO3RoaXMuX2ludmFsaWRhdGVkPXt9LCF0aGlzLmlzKCJ2YWxpZCIpJiZ0aGlzLmVudGVyKCJ2YWxpZCIpfSxlLnByb3RvdHlwZS53aWR0aD1mdW5jdGlvbihhKXtzd2l0Y2goYT1hfHxlLldpZHRoLkRlZmF1bHQpe2Nhc2UgZS5XaWR0aC5Jbm5lcjpjYXNlIGUuV2lkdGguT3V0ZXI6cmV0dXJuIHRoaXMuX3dpZHRoO2RlZmF1bHQ6cmV0dXJuIHRoaXMuX3dpZHRoLTIqdGhpcy5zZXR0aW5ncy5zdGFnZVBhZGRpbmcrdGhpcy5zZXR0aW5ncy5tYXJnaW59fSxlLnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7dGhpcy5lbnRlcigicmVmcmVzaGluZyIpLHRoaXMudHJpZ2dlcigicmVmcmVzaCIpLHRoaXMuc2V0dXAoKSx0aGlzLm9wdGlvbnNMb2dpYygpLHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLnJlZnJlc2hDbGFzcyksdGhpcy51cGRhdGUoKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5yZWZyZXNoQ2xhc3MpLHRoaXMubGVhdmUoInJlZnJlc2hpbmciKSx0aGlzLnRyaWdnZXIoInJlZnJlc2hlZCIpfSxlLnByb3RvdHlwZS5vblRocm90dGxlZFJlc2l6ZT1mdW5jdGlvbigpe2IuY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZXIpLHRoaXMucmVzaXplVGltZXI9Yi5zZXRUaW1lb3V0KHRoaXMuX2hhbmRsZXJzLm9uUmVzaXplLHRoaXMuc2V0dGluZ3MucmVzcG9uc2l2ZVJlZnJlc2hSYXRlKX0sZS5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX2l0ZW1zLmxlbmd0aCYmKHRoaXMuX3dpZHRoIT09dGhpcy4kZWxlbWVudC53aWR0aCgpJiYoISF0aGlzLmlzVmlzaWJsZSgpJiYodGhpcy5lbnRlcigicmVzaXppbmciKSx0aGlzLnRyaWdnZXIoInJlc2l6ZSIpLmlzRGVmYXVsdFByZXZlbnRlZCgpPyh0aGlzLmxlYXZlKCJyZXNpemluZyIpLCExKToodGhpcy5pbnZhbGlkYXRlKCJ3aWR0aCIpLHRoaXMucmVmcmVzaCgpLHRoaXMubGVhdmUoInJlc2l6aW5nIiksdm9pZCB0aGlzLnRyaWdnZXIoInJlc2l6ZWQiKSkpKSl9LGUucHJvdG90eXBlLnJlZ2lzdGVyRXZlbnRIYW5kbGVycz1mdW5jdGlvbigpe2Euc3VwcG9ydC50cmFuc2l0aW9uJiZ0aGlzLiRzdGFnZS5vbihhLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQrIi5vd2wuY29yZSIsYS5wcm94eSh0aGlzLm9uVHJhbnNpdGlvbkVuZCx0aGlzKSksITEhPT10aGlzLnNldHRpbmdzLnJlc3BvbnNpdmUmJnRoaXMub24oYiwicmVzaXplIix0aGlzLl9oYW5kbGVycy5vblRocm90dGxlZFJlc2l6ZSksdGhpcy5zZXR0aW5ncy5tb3VzZURyYWcmJih0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5kcmFnQ2xhc3MpLHRoaXMuJHN0YWdlLm9uKCJtb3VzZWRvd24ub3dsLmNvcmUiLGEucHJveHkodGhpcy5vbkRyYWdTdGFydCx0aGlzKSksdGhpcy4kc3RhZ2Uub24oImRyYWdzdGFydC5vd2wuY29yZSBzZWxlY3RzdGFydC5vd2wuY29yZSIsZnVuY3Rpb24oKXtyZXR1cm4hMX0pKSx0aGlzLnNldHRpbmdzLnRvdWNoRHJhZyYmKHRoaXMuJHN0YWdlLm9uKCJ0b3VjaHN0YXJ0Lm93bC5jb3JlIixhLnByb3h5KHRoaXMub25EcmFnU3RhcnQsdGhpcykpLHRoaXMuJHN0YWdlLm9uKCJ0b3VjaGNhbmNlbC5vd2wuY29yZSIsYS5wcm94eSh0aGlzLm9uRHJhZ0VuZCx0aGlzKSkpfSxlLnByb3RvdHlwZS5vbkRyYWdTdGFydD1mdW5jdGlvbihiKXt2YXIgZD1udWxsOzMhPT1iLndoaWNoJiYoYS5zdXBwb3J0LnRyYW5zZm9ybT8oZD10aGlzLiRzdGFnZS5jc3MoInRyYW5zZm9ybSIpLnJlcGxhY2UoLy4qXCh8XCl8IC9nLCIiKS5zcGxpdCgiLCIpLGQ9e3g6ZFsxNj09PWQubGVuZ3RoPzEyOjRdLHk6ZFsxNj09PWQubGVuZ3RoPzEzOjVdfSk6KGQ9dGhpcy4kc3RhZ2UucG9zaXRpb24oKSxkPXt4OnRoaXMuc2V0dGluZ3MucnRsP2QubGVmdCt0aGlzLiRzdGFnZS53aWR0aCgpLXRoaXMud2lkdGgoKSt0aGlzLnNldHRpbmdzLm1hcmdpbjpkLmxlZnQseTpkLnRvcH0pLHRoaXMuaXMoImFuaW1hdGluZyIpJiYoYS5zdXBwb3J0LnRyYW5zZm9ybT90aGlzLmFuaW1hdGUoZC54KTp0aGlzLiRzdGFnZS5zdG9wKCksdGhpcy5pbnZhbGlkYXRlKCJwb3NpdGlvbiIpKSx0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKHRoaXMub3B0aW9ucy5ncmFiQ2xhc3MsIm1vdXNlZG93biI9PT1iLnR5cGUpLHRoaXMuc3BlZWQoMCksdGhpcy5fZHJhZy50aW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuX2RyYWcudGFyZ2V0PWEoYi50YXJnZXQpLHRoaXMuX2RyYWcuc3RhZ2Uuc3RhcnQ9ZCx0aGlzLl9kcmFnLnN0YWdlLmN1cnJlbnQ9ZCx0aGlzLl9kcmFnLnBvaW50ZXI9dGhpcy5wb2ludGVyKGIpLGEoYykub24oIm1vdXNldXAub3dsLmNvcmUgdG91Y2hlbmQub3dsLmNvcmUiLGEucHJveHkodGhpcy5vbkRyYWdFbmQsdGhpcykpLGEoYykub25lKCJtb3VzZW1vdmUub3dsLmNvcmUgdG91Y2htb3ZlLm93bC5jb3JlIixhLnByb3h5KGZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuZGlmZmVyZW5jZSh0aGlzLl9kcmFnLnBvaW50ZXIsdGhpcy5wb2ludGVyKGIpKTthKGMpLm9uKCJtb3VzZW1vdmUub3dsLmNvcmUgdG91Y2htb3ZlLm93bC5jb3JlIixhLnByb3h5KHRoaXMub25EcmFnTW92ZSx0aGlzKSksTWF0aC5hYnMoZC54KTxNYXRoLmFicyhkLnkpJiZ0aGlzLmlzKCJ2YWxpZCIpfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuZW50ZXIoImRyYWdnaW5nIiksdGhpcy50cmlnZ2VyKCJkcmFnIikpfSx0aGlzKSkpfSxlLnByb3RvdHlwZS5vbkRyYWdNb3ZlPWZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGQ9bnVsbCxlPXRoaXMuZGlmZmVyZW5jZSh0aGlzLl9kcmFnLnBvaW50ZXIsdGhpcy5wb2ludGVyKGEpKSxmPXRoaXMuZGlmZmVyZW5jZSh0aGlzLl9kcmFnLnN0YWdlLnN0YXJ0LGUpO3RoaXMuaXMoImRyYWdnaW5nIikmJihhLnByZXZlbnREZWZhdWx0KCksdGhpcy5zZXR0aW5ncy5sb29wPyhiPXRoaXMuY29vcmRpbmF0ZXModGhpcy5taW5pbXVtKCkpLGM9dGhpcy5jb29yZGluYXRlcyh0aGlzLm1heGltdW0oKSsxKS1iLGYueD0oKGYueC1iKSVjK2MpJWMrYik6KGI9dGhpcy5zZXR0aW5ncy5ydGw/dGhpcy5jb29yZGluYXRlcyh0aGlzLm1heGltdW0oKSk6dGhpcy5jb29yZGluYXRlcyh0aGlzLm1pbmltdW0oKSksYz10aGlzLnNldHRpbmdzLnJ0bD90aGlzLmNvb3JkaW5hdGVzKHRoaXMubWluaW11bSgpKTp0aGlzLmNvb3JkaW5hdGVzKHRoaXMubWF4aW11bSgpKSxkPXRoaXMuc2V0dGluZ3MucHVsbERyYWc/LTEqZS54LzU6MCxmLng9TWF0aC5tYXgoTWF0aC5taW4oZi54LGIrZCksYytkKSksdGhpcy5fZHJhZy5zdGFnZS5jdXJyZW50PWYsdGhpcy5hbmltYXRlKGYueCkpfSxlLnByb3RvdHlwZS5vbkRyYWdFbmQ9ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5kaWZmZXJlbmNlKHRoaXMuX2RyYWcucG9pbnRlcix0aGlzLnBvaW50ZXIoYikpLGU9dGhpcy5fZHJhZy5zdGFnZS5jdXJyZW50LGY9ZC54PjBedGhpcy5zZXR0aW5ncy5ydGw/ImxlZnQiOiJyaWdodCI7YShjKS5vZmYoIi5vd2wuY29yZSIpLHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmdyYWJDbGFzcyksKDAhPT1kLngmJnRoaXMuaXMoImRyYWdnaW5nIil8fCF0aGlzLmlzKCJ2YWxpZCIpKSYmKHRoaXMuc3BlZWQodGhpcy5zZXR0aW5ncy5kcmFnRW5kU3BlZWR8fHRoaXMuc2V0dGluZ3Muc21hcnRTcGVlZCksdGhpcy5jdXJyZW50KHRoaXMuY2xvc2VzdChlLngsMCE9PWQueD9mOnRoaXMuX2RyYWcuZGlyZWN0aW9uKSksdGhpcy5pbnZhbGlkYXRlKCJwb3NpdGlvbiIpLHRoaXMudXBkYXRlKCksdGhpcy5fZHJhZy5kaXJlY3Rpb249ZiwoTWF0aC5hYnMoZC54KT4zfHwobmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9kcmFnLnRpbWU+MzAwKSYmdGhpcy5fZHJhZy50YXJnZXQub25lKCJjbGljay5vd2wuY29yZSIsZnVuY3Rpb24oKXtyZXR1cm4hMX0pKSx0aGlzLmlzKCJkcmFnZ2luZyIpJiYodGhpcy5sZWF2ZSgiZHJhZ2dpbmciKSx0aGlzLnRyaWdnZXIoImRyYWdnZWQiKSl9LGUucHJvdG90eXBlLmNsb3Nlc3Q9ZnVuY3Rpb24oYixjKXt2YXIgZT0tMSxmPTMwLGc9dGhpcy53aWR0aCgpLGg9dGhpcy5jb29yZGluYXRlcygpO3JldHVybiB0aGlzLnNldHRpbmdzLmZyZWVEcmFnfHxhLmVhY2goaCxhLnByb3h5KGZ1bmN0aW9uKGEsaSl7cmV0dXJuImxlZnQiPT09YyYmYj5pLWYmJmI8aStmP2U9YToicmlnaHQiPT09YyYmYj5pLWctZiYmYjxpLWcrZj9lPWErMTp0aGlzLm9wKGIsIjwiLGkpJiZ0aGlzLm9wKGIsIj4iLGhbYSsxXSE9PWQ/aFthKzFdOmktZykmJihlPSJsZWZ0Ij09PWM/YSsxOmEpLC0xPT09ZX0sdGhpcykpLHRoaXMuc2V0dGluZ3MubG9vcHx8KHRoaXMub3AoYiwiPiIsaFt0aGlzLm1pbmltdW0oKV0pP2U9Yj10aGlzLm1pbmltdW0oKTp0aGlzLm9wKGIsIjwiLGhbdGhpcy5tYXhpbXVtKCldKSYmKGU9Yj10aGlzLm1heGltdW0oKSkpLGV9LGUucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5zcGVlZCgpPjA7dGhpcy5pcygiYW5pbWF0aW5nIikmJnRoaXMub25UcmFuc2l0aW9uRW5kKCksYyYmKHRoaXMuZW50ZXIoImFuaW1hdGluZyIpLHRoaXMudHJpZ2dlcigidHJhbnNsYXRlIikpLGEuc3VwcG9ydC50cmFuc2Zvcm0zZCYmYS5zdXBwb3J0LnRyYW5zaXRpb24/dGhpcy4kc3RhZ2UuY3NzKHt0cmFuc2Zvcm06InRyYW5zbGF0ZTNkKCIrYisicHgsMHB4LDBweCkiLHRyYW5zaXRpb246dGhpcy5zcGVlZCgpLzFlMysicyIrKHRoaXMuc2V0dGluZ3Muc2xpZGVUcmFuc2l0aW9uPyIgIit0aGlzLnNldHRpbmdzLnNsaWRlVHJhbnNpdGlvbjoiIil9KTpjP3RoaXMuJHN0YWdlLmFuaW1hdGUoe2xlZnQ6YisicHgifSx0aGlzLnNwZWVkKCksdGhpcy5zZXR0aW5ncy5mYWxsYmFja0Vhc2luZyxhLnByb3h5KHRoaXMub25UcmFuc2l0aW9uRW5kLHRoaXMpKTp0aGlzLiRzdGFnZS5jc3Moe2xlZnQ6YisicHgifSl9LGUucHJvdG90eXBlLmlzPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zdGF0ZXMuY3VycmVudFthXSYmdGhpcy5fc3RhdGVzLmN1cnJlbnRbYV0+MH0sZS5wcm90b3R5cGUuY3VycmVudD1mdW5jdGlvbihhKXtpZihhPT09ZClyZXR1cm4gdGhpcy5fY3VycmVudDtpZigwPT09dGhpcy5faXRlbXMubGVuZ3RoKXJldHVybiBkO2lmKGE9dGhpcy5ub3JtYWxpemUoYSksdGhpcy5fY3VycmVudCE9PWEpe3ZhciBiPXRoaXMudHJpZ2dlcigiY2hhbmdlIix7cHJvcGVydHk6e25hbWU6InBvc2l0aW9uIix2YWx1ZTphfX0pO2IuZGF0YSE9PWQmJihhPXRoaXMubm9ybWFsaXplKGIuZGF0YSkpLHRoaXMuX2N1cnJlbnQ9YSx0aGlzLmludmFsaWRhdGUoInBvc2l0aW9uIiksdGhpcy50cmlnZ2VyKCJjaGFuZ2VkIix7cHJvcGVydHk6e25hbWU6InBvc2l0aW9uIix2YWx1ZTp0aGlzLl9jdXJyZW50fX0pfXJldHVybiB0aGlzLl9jdXJyZW50fSxlLnByb3RvdHlwZS5pbnZhbGlkYXRlPWZ1bmN0aW9uKGIpe3JldHVybiJzdHJpbmciPT09YS50eXBlKGIpJiYodGhpcy5faW52YWxpZGF0ZWRbYl09ITAsdGhpcy5pcygidmFsaWQiKSYmdGhpcy5sZWF2ZSgidmFsaWQiKSksYS5tYXAodGhpcy5faW52YWxpZGF0ZWQsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYn0pfSxlLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbihhKXsoYT10aGlzLm5vcm1hbGl6ZShhKSkhPT1kJiYodGhpcy5fc3BlZWQ9MCx0aGlzLl9jdXJyZW50PWEsdGhpcy5zdXBwcmVzcyhbInRyYW5zbGF0ZSIsInRyYW5zbGF0ZWQiXSksdGhpcy5hbmltYXRlKHRoaXMuY29vcmRpbmF0ZXMoYSkpLHRoaXMucmVsZWFzZShbInRyYW5zbGF0ZSIsInRyYW5zbGF0ZWQiXSkpfSxlLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9pdGVtcy5sZW5ndGgsZT1iPzA6dGhpcy5fY2xvbmVzLmxlbmd0aDtyZXR1cm4hdGhpcy5pc051bWVyaWMoYSl8fGM8MT9hPWQ6KGE8MHx8YT49YytlKSYmKGE9KChhLWUvMiklYytjKSVjK2UvMiksYX0sZS5wcm90b3R5cGUucmVsYXRpdmU9ZnVuY3Rpb24oYSl7cmV0dXJuIGEtPXRoaXMuX2Nsb25lcy5sZW5ndGgvMix0aGlzLm5vcm1hbGl6ZShhLCEwKX0sZS5wcm90b3R5cGUubWF4aW11bT1mdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzLnNldHRpbmdzLGY9dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoO2lmKGUubG9vcClmPXRoaXMuX2Nsb25lcy5sZW5ndGgvMit0aGlzLl9pdGVtcy5sZW5ndGgtMTtlbHNlIGlmKGUuYXV0b1dpZHRofHxlLm1lcmdlKXtpZihiPXRoaXMuX2l0ZW1zLmxlbmd0aClmb3IoYz10aGlzLl9pdGVtc1stLWJdLndpZHRoKCksZD10aGlzLiRlbGVtZW50LndpZHRoKCk7Yi0tJiYhKChjKz10aGlzLl9pdGVtc1tiXS53aWR0aCgpK3RoaXMuc2V0dGluZ3MubWFyZ2luKT5kKTspO2Y9YisxfWVsc2UgZj1lLmNlbnRlcj90aGlzLl9pdGVtcy5sZW5ndGgtMTp0aGlzLl9pdGVtcy5sZW5ndGgtZS5pdGVtcztyZXR1cm4gYSYmKGYtPXRoaXMuX2Nsb25lcy5sZW5ndGgvMiksTWF0aC5tYXgoZiwwKX0sZS5wcm90b3R5cGUubWluaW11bT1mdW5jdGlvbihhKXtyZXR1cm4gYT8wOnRoaXMuX2Nsb25lcy5sZW5ndGgvMn0sZS5wcm90b3R5cGUuaXRlbXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1kP3RoaXMuX2l0ZW1zLnNsaWNlKCk6KGE9dGhpcy5ub3JtYWxpemUoYSwhMCksdGhpcy5faXRlbXNbYV0pfSxlLnByb3RvdHlwZS5tZXJnZXJzPWZ1bmN0aW9uKGEpe3JldHVybiBhPT09ZD90aGlzLl9tZXJnZXJzLnNsaWNlKCk6KGE9dGhpcy5ub3JtYWxpemUoYSwhMCksdGhpcy5fbWVyZ2Vyc1thXSl9LGUucHJvdG90eXBlLmNsb25lcz1mdW5jdGlvbihiKXt2YXIgYz10aGlzLl9jbG9uZXMubGVuZ3RoLzIsZT1jK3RoaXMuX2l0ZW1zLmxlbmd0aCxmPWZ1bmN0aW9uKGEpe3JldHVybiBhJTI9PTA/ZSthLzI6Yy0oYSsxKS8yfTtyZXR1cm4gYj09PWQ/YS5tYXAodGhpcy5fY2xvbmVzLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGYoYil9KTphLm1hcCh0aGlzLl9jbG9uZXMsZnVuY3Rpb24oYSxjKXtyZXR1cm4gYT09PWI/ZihjKTpudWxsfSl9LGUucHJvdG90eXBlLnNwZWVkPWZ1bmN0aW9uKGEpe3JldHVybiBhIT09ZCYmKHRoaXMuX3NwZWVkPWEpLHRoaXMuX3NwZWVkfSxlLnByb3RvdHlwZS5jb29yZGluYXRlcz1mdW5jdGlvbihiKXt2YXIgYyxlPTEsZj1iLTE7cmV0dXJuIGI9PT1kP2EubWFwKHRoaXMuX2Nvb3JkaW5hdGVzLGEucHJveHkoZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5jb29yZGluYXRlcyhiKX0sdGhpcykpOih0aGlzLnNldHRpbmdzLmNlbnRlcj8odGhpcy5zZXR0aW5ncy5ydGwmJihlPS0xLGY9YisxKSxjPXRoaXMuX2Nvb3JkaW5hdGVzW2JdLGMrPSh0aGlzLndpZHRoKCktYysodGhpcy5fY29vcmRpbmF0ZXNbZl18fDApKS8yKmUpOmM9dGhpcy5fY29vcmRpbmF0ZXNbZl18fDAsYz1NYXRoLmNlaWwoYykpfSxlLnByb3RvdHlwZS5kdXJhdGlvbj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIDA9PT1jPzA6TWF0aC5taW4oTWF0aC5tYXgoTWF0aC5hYnMoYi1hKSwxKSw2KSpNYXRoLmFicyhjfHx0aGlzLnNldHRpbmdzLnNtYXJ0U3BlZWQpfSxlLnByb3RvdHlwZS50bz1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY3VycmVudCgpLGQ9bnVsbCxlPWEtdGhpcy5yZWxhdGl2ZShjKSxmPShlPjApLShlPDApLGc9dGhpcy5faXRlbXMubGVuZ3RoLGg9dGhpcy5taW5pbXVtKCksaT10aGlzLm1heGltdW0oKTt0aGlzLnNldHRpbmdzLmxvb3A/KCF0aGlzLnNldHRpbmdzLnJld2luZCYmTWF0aC5hYnMoZSk+Zy8yJiYoZSs9LTEqZipnKSxhPWMrZSwoZD0oKGEtaCklZytnKSVnK2gpIT09YSYmZC1lPD1pJiZkLWU+MCYmKGM9ZC1lLGE9ZCx0aGlzLnJlc2V0KGMpKSk6dGhpcy5zZXR0aW5ncy5yZXdpbmQ/KGkrPTEsYT0oYSVpK2kpJWkpOmE9TWF0aC5tYXgoaCxNYXRoLm1pbihpLGEpKSx0aGlzLnNwZWVkKHRoaXMuZHVyYXRpb24oYyxhLGIpKSx0aGlzLmN1cnJlbnQoYSksdGhpcy5pc1Zpc2libGUoKSYmdGhpcy51cGRhdGUoKX0sZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbihhKXthPWF8fCExLHRoaXMudG8odGhpcy5yZWxhdGl2ZSh0aGlzLmN1cnJlbnQoKSkrMSxhKX0sZS5wcm90b3R5cGUucHJldj1mdW5jdGlvbihhKXthPWF8fCExLHRoaXMudG8odGhpcy5yZWxhdGl2ZSh0aGlzLmN1cnJlbnQoKSktMSxhKX0sZS5wcm90b3R5cGUub25UcmFuc2l0aW9uRW5kPWZ1bmN0aW9uKGEpe2lmKGEhPT1kJiYoYS5zdG9wUHJvcGFnYXRpb24oKSwoYS50YXJnZXR8fGEuc3JjRWxlbWVudHx8YS5vcmlnaW5hbFRhcmdldCkhPT10aGlzLiRzdGFnZS5nZXQoMCkpKXJldHVybiExO3RoaXMubGVhdmUoImFuaW1hdGluZyIpLHRoaXMudHJpZ2dlcigidHJhbnNsYXRlZCIpfSxlLnByb3RvdHlwZS52aWV3cG9ydD1mdW5jdGlvbigpe3ZhciBkO3JldHVybiB0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZUJhc2VFbGVtZW50IT09Yj9kPWEodGhpcy5vcHRpb25zLnJlc3BvbnNpdmVCYXNlRWxlbWVudCkud2lkdGgoKTpiLmlubmVyV2lkdGg/ZD1iLmlubmVyV2lkdGg6Yy5kb2N1bWVudEVsZW1lbnQmJmMuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoP2Q9Yy5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6Y29uc29sZS53YXJuKCJDYW4gbm90IGRldGVjdCB2aWV3cG9ydCB3aWR0aC4iKSxkfSxlLnByb3RvdHlwZS5yZXBsYWNlPWZ1bmN0aW9uKGIpe3RoaXMuJHN0YWdlLmVtcHR5KCksdGhpcy5faXRlbXM9W10sYiYmKGI9YiBpbnN0YW5jZW9mIGpRdWVyeT9iOmEoYikpLHRoaXMuc2V0dGluZ3MubmVzdGVkSXRlbVNlbGVjdG9yJiYoYj1iLmZpbmQoIi4iK3RoaXMuc2V0dGluZ3MubmVzdGVkSXRlbVNlbGVjdG9yKSksYi5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMubm9kZVR5cGV9KS5lYWNoKGEucHJveHkoZnVuY3Rpb24oYSxiKXtiPXRoaXMucHJlcGFyZShiKSx0aGlzLiRzdGFnZS5hcHBlbmQoYiksdGhpcy5faXRlbXMucHVzaChiKSx0aGlzLl9tZXJnZXJzLnB1c2goMSpiLmZpbmQoIltkYXRhLW1lcmdlXSIpLmFkZEJhY2soIltkYXRhLW1lcmdlXSIpLmF0dHIoImRhdGEtbWVyZ2UiKXx8MSl9LHRoaXMpKSx0aGlzLnJlc2V0KHRoaXMuaXNOdW1lcmljKHRoaXMuc2V0dGluZ3Muc3RhcnRQb3NpdGlvbik/dGhpcy5zZXR0aW5ncy5zdGFydFBvc2l0aW9uOjApLHRoaXMuaW52YWxpZGF0ZSgiaXRlbXMiKX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGIsYyl7dmFyIGU9dGhpcy5yZWxhdGl2ZSh0aGlzLl9jdXJyZW50KTtjPWM9PT1kP3RoaXMuX2l0ZW1zLmxlbmd0aDp0aGlzLm5vcm1hbGl6ZShjLCEwKSxiPWIgaW5zdGFuY2VvZiBqUXVlcnk/YjphKGIpLHRoaXMudHJpZ2dlcigiYWRkIix7Y29udGVudDpiLHBvc2l0aW9uOmN9KSxiPXRoaXMucHJlcGFyZShiKSwwPT09dGhpcy5faXRlbXMubGVuZ3RofHxjPT09dGhpcy5faXRlbXMubGVuZ3RoPygwPT09dGhpcy5faXRlbXMubGVuZ3RoJiZ0aGlzLiRzdGFnZS5hcHBlbmQoYiksMCE9PXRoaXMuX2l0ZW1zLmxlbmd0aCYmdGhpcy5faXRlbXNbYy0xXS5hZnRlcihiKSx0aGlzLl9pdGVtcy5wdXNoKGIpLHRoaXMuX21lcmdlcnMucHVzaCgxKmIuZmluZCgiW2RhdGEtbWVyZ2VdIikuYWRkQmFjaygiW2RhdGEtbWVyZ2VdIikuYXR0cigiZGF0YS1tZXJnZSIpfHwxKSk6KHRoaXMuX2l0ZW1zW2NdLmJlZm9yZShiKSx0aGlzLl9pdGVtcy5zcGxpY2UoYywwLGIpLHRoaXMuX21lcmdlcnMuc3BsaWNlKGMsMCwxKmIuZmluZCgiW2RhdGEtbWVyZ2VdIikuYWRkQmFjaygiW2RhdGEtbWVyZ2VdIikuYXR0cigiZGF0YS1tZXJnZSIpfHwxKSksdGhpcy5faXRlbXNbZV0mJnRoaXMucmVzZXQodGhpcy5faXRlbXNbZV0uaW5kZXgoKSksdGhpcy5pbnZhbGlkYXRlKCJpdGVtcyIpLHRoaXMudHJpZ2dlcigiYWRkZWQiLHtjb250ZW50OmIscG9zaXRpb246Y30pfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oYSl7KGE9dGhpcy5ub3JtYWxpemUoYSwhMCkpIT09ZCYmKHRoaXMudHJpZ2dlcigicmVtb3ZlIix7Y29udGVudDp0aGlzLl9pdGVtc1thXSxwb3NpdGlvbjphfSksdGhpcy5faXRlbXNbYV0ucmVtb3ZlKCksdGhpcy5faXRlbXMuc3BsaWNlKGEsMSksdGhpcy5fbWVyZ2Vycy5zcGxpY2UoYSwxKSx0aGlzLmludmFsaWRhdGUoIml0ZW1zIiksdGhpcy50cmlnZ2VyKCJyZW1vdmVkIix7Y29udGVudDpudWxsLHBvc2l0aW9uOmF9KSl9LGUucHJvdG90eXBlLnByZWxvYWRBdXRvV2lkdGhJbWFnZXM9ZnVuY3Rpb24oYil7Yi5lYWNoKGEucHJveHkoZnVuY3Rpb24oYixjKXt0aGlzLmVudGVyKCJwcmUtbG9hZGluZyIpLGM9YShjKSxhKG5ldyBJbWFnZSkub25lKCJsb2FkIixhLnByb3h5KGZ1bmN0aW9uKGEpe2MuYXR0cigic3JjIixhLnRhcmdldC5zcmMpLGMuY3NzKCJvcGFjaXR5IiwxKSx0aGlzLmxlYXZlKCJwcmUtbG9hZGluZyIpLCF0aGlzLmlzKCJwcmUtbG9hZGluZyIpJiYhdGhpcy5pcygiaW5pdGlhbGl6aW5nIikmJnRoaXMucmVmcmVzaCgpfSx0aGlzKSkuYXR0cigic3JjIixjLmF0dHIoInNyYyIpfHxjLmF0dHIoImRhdGEtc3JjIil8fGMuYXR0cigiZGF0YS1zcmMtcmV0aW5hIikpfSx0aGlzKSl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50Lm9mZigiLm93bC5jb3JlIiksdGhpcy4kc3RhZ2Uub2ZmKCIub3dsLmNvcmUiKSxhKGMpLm9mZigiLm93bC5jb3JlIiksITEhPT10aGlzLnNldHRpbmdzLnJlc3BvbnNpdmUmJihiLmNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVyKSx0aGlzLm9mZihiLCJyZXNpemUiLHRoaXMuX2hhbmRsZXJzLm9uVGhyb3R0bGVkUmVzaXplKSk7Zm9yKHZhciBkIGluIHRoaXMuX3BsdWdpbnMpdGhpcy5fcGx1Z2luc1tkXS5kZXN0cm95KCk7dGhpcy4kc3RhZ2UuY2hpbGRyZW4oIi5jbG9uZWQiKS5yZW1vdmUoKSx0aGlzLiRzdGFnZS51bndyYXAoKSx0aGlzLiRzdGFnZS5jaGlsZHJlbigpLmNvbnRlbnRzKCkudW53cmFwKCksdGhpcy4kc3RhZ2UuY2hpbGRyZW4oKS51bndyYXAoKSx0aGlzLiRzdGFnZS5yZW1vdmUoKSx0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5yZWZyZXNoQ2xhc3MpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3MpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sb2FkZWRDbGFzcykucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLnJ0bENsYXNzKS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuZHJhZ0NsYXNzKS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuZ3JhYkNsYXNzKS5hdHRyKCJjbGFzcyIsdGhpcy4kZWxlbWVudC5hdHRyKCJjbGFzcyIpLnJlcGxhY2UobmV3IFJlZ0V4cCh0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZUNsYXNzKyItXFxTK1xccyIsImciKSwiIikpLnJlbW92ZURhdGEoIm93bC5jYXJvdXNlbCIpfSxlLnByb3RvdHlwZS5vcD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5zZXR0aW5ncy5ydGw7c3dpdGNoKGIpe2Nhc2UiPCI6cmV0dXJuIGQ/YT5jOmE8YztjYXNlIj4iOnJldHVybiBkP2E8YzphPmM7Y2FzZSI+PSI6cmV0dXJuIGQ/YTw9YzphPj1jO2Nhc2UiPD0iOnJldHVybiBkP2E+PWM6YTw9Y319LGUucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGEsYixjLGQpe2EuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLGQpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitiLGMpfSxlLnByb3RvdHlwZS5vZmY9ZnVuY3Rpb24oYSxiLGMsZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyP2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsZCk6YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYyl9LGUucHJvdG90eXBlLnRyaWdnZXI9ZnVuY3Rpb24oYixjLGQsZixnKXt2YXIgaD17aXRlbTp7Y291bnQ6dGhpcy5faXRlbXMubGVuZ3RoLGluZGV4OnRoaXMuY3VycmVudCgpfX0saT1hLmNhbWVsQ2FzZShhLmdyZXAoWyJvbiIsYixkXSxmdW5jdGlvbihhKXtyZXR1cm4gYX0pLmpvaW4oIi0iKS50b0xvd2VyQ2FzZSgpKSxqPWEuRXZlbnQoW2IsIm93bCIsZHx8ImNhcm91c2VsIl0uam9pbigiLiIpLnRvTG93ZXJDYXNlKCksYS5leHRlbmQoe3JlbGF0ZWRUYXJnZXQ6dGhpc30saCxjKSk7cmV0dXJuIHRoaXMuX3N1cHJlc3NbYl18fChhLmVhY2godGhpcy5fcGx1Z2lucyxmdW5jdGlvbihhLGIpe2Iub25UcmlnZ2VyJiZiLm9uVHJpZ2dlcihqKX0pLHRoaXMucmVnaXN0ZXIoe3R5cGU6ZS5UeXBlLkV2ZW50LG5hbWU6Yn0pLHRoaXMuJGVsZW1lbnQudHJpZ2dlcihqKSx0aGlzLnNldHRpbmdzJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5zZXR0aW5nc1tpXSYmdGhpcy5zZXR0aW5nc1tpXS5jYWxsKHRoaXMsaikpLGp9LGUucHJvdG90eXBlLmVudGVyPWZ1bmN0aW9uKGIpe2EuZWFjaChbYl0uY29uY2F0KHRoaXMuX3N0YXRlcy50YWdzW2JdfHxbXSksYS5wcm94eShmdW5jdGlvbihhLGIpe3RoaXMuX3N0YXRlcy5jdXJyZW50W2JdPT09ZCYmKHRoaXMuX3N0YXRlcy5jdXJyZW50W2JdPTApLHRoaXMuX3N0YXRlcy5jdXJyZW50W2JdKyt9LHRoaXMpKX0sZS5wcm90b3R5cGUubGVhdmU9ZnVuY3Rpb24oYil7YS5lYWNoKFtiXS5jb25jYXQodGhpcy5fc3RhdGVzLnRhZ3NbYl18fFtdKSxhLnByb3h5KGZ1bmN0aW9uKGEsYil7dGhpcy5fc3RhdGVzLmN1cnJlbnRbYl0tLX0sdGhpcykpfSxlLnByb3RvdHlwZS5yZWdpc3Rlcj1mdW5jdGlvbihiKXtpZihiLnR5cGU9PT1lLlR5cGUuRXZlbnQpe2lmKGEuZXZlbnQuc3BlY2lhbFtiLm5hbWVdfHwoYS5ldmVudC5zcGVjaWFsW2IubmFtZV09e30pLCFhLmV2ZW50LnNwZWNpYWxbYi5uYW1lXS5vd2wpe3ZhciBjPWEuZXZlbnQuc3BlY2lhbFtiLm5hbWVdLl9kZWZhdWx0O2EuZXZlbnQuc3BlY2lhbFtiLm5hbWVdLl9kZWZhdWx0PWZ1bmN0aW9uKGEpe3JldHVybiFjfHwhYy5hcHBseXx8YS5uYW1lc3BhY2UmJi0xIT09YS5uYW1lc3BhY2UuaW5kZXhPZigib3dsIik/YS5uYW1lc3BhY2UmJmEubmFtZXNwYWNlLmluZGV4T2YoIm93bCIpPi0xOmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhLmV2ZW50LnNwZWNpYWxbYi5uYW1lXS5vd2w9ITB9fWVsc2UgYi50eXBlPT09ZS5UeXBlLlN0YXRlJiYodGhpcy5fc3RhdGVzLnRhZ3NbYi5uYW1lXT90aGlzLl9zdGF0ZXMudGFnc1tiLm5hbWVdPXRoaXMuX3N0YXRlcy50YWdzW2IubmFtZV0uY29uY2F0KGIudGFncyk6dGhpcy5fc3RhdGVzLnRhZ3NbYi5uYW1lXT1iLnRhZ3MsdGhpcy5fc3RhdGVzLnRhZ3NbYi5uYW1lXT1hLmdyZXAodGhpcy5fc3RhdGVzLnRhZ3NbYi5uYW1lXSxhLnByb3h5KGZ1bmN0aW9uKGMsZCl7cmV0dXJuIGEuaW5BcnJheShjLHRoaXMuX3N0YXRlcy50YWdzW2IubmFtZV0pPT09ZH0sdGhpcykpKX0sZS5wcm90b3R5cGUuc3VwcHJlc3M9ZnVuY3Rpb24oYil7YS5lYWNoKGIsYS5wcm94eShmdW5jdGlvbihhLGIpe3RoaXMuX3N1cHJlc3NbYl09ITB9LHRoaXMpKX0sZS5wcm90b3R5cGUucmVsZWFzZT1mdW5jdGlvbihiKXthLmVhY2goYixhLnByb3h5KGZ1bmN0aW9uKGEsYil7ZGVsZXRlIHRoaXMuX3N1cHJlc3NbYl19LHRoaXMpKX0sZS5wcm90b3R5cGUucG9pbnRlcj1mdW5jdGlvbihhKXt2YXIgYz17eDpudWxsLHk6bnVsbH07cmV0dXJuIGE9YS5vcmlnaW5hbEV2ZW50fHxhfHxiLmV2ZW50LGE9YS50b3VjaGVzJiZhLnRvdWNoZXMubGVuZ3RoP2EudG91Y2hlc1swXTphLmNoYW5nZWRUb3VjaGVzJiZhLmNoYW5nZWRUb3VjaGVzLmxlbmd0aD9hLmNoYW5nZWRUb3VjaGVzWzBdOmEsYS5wYWdlWD8oYy54PWEucGFnZVgsYy55PWEucGFnZVkpOihjLng9YS5jbGllbnRYLGMueT1hLmNsaWVudFkpLGN9LGUucHJvdG90eXBlLmlzTnVtZXJpYz1mdW5jdGlvbihhKXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdChhKSl9LGUucHJvdG90eXBlLmRpZmZlcmVuY2U9ZnVuY3Rpb24oYSxiKXtyZXR1cm57eDphLngtYi54LHk6YS55LWIueX19LGEuZm4ub3dsQ2Fyb3VzZWw9ZnVuY3Rpb24oYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hKHRoaXMpLGY9ZC5kYXRhKCJvd2wuY2Fyb3VzZWwiKTtmfHwoZj1uZXcgZSh0aGlzLCJvYmplY3QiPT10eXBlb2YgYiYmYiksZC5kYXRhKCJvd2wuY2Fyb3VzZWwiLGYpLGEuZWFjaChbIm5leHQiLCJwcmV2IiwidG8iLCJkZXN0cm95IiwicmVmcmVzaCIsInJlcGxhY2UiLCJhZGQiLCJyZW1vdmUiXSxmdW5jdGlvbihiLGMpe2YucmVnaXN0ZXIoe3R5cGU6ZS5UeXBlLkV2ZW50LG5hbWU6Y30pLGYuJGVsZW1lbnQub24oYysiLm93bC5jYXJvdXNlbC5jb3JlIixhLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZhLnJlbGF0ZWRUYXJnZXQhPT10aGlzJiYodGhpcy5zdXBwcmVzcyhbY10pLGZbY10uYXBwbHkodGhpcyxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSksdGhpcy5yZWxlYXNlKFtjXSkpfSxmKSl9KSksInN0cmluZyI9PXR5cGVvZiBiJiYiXyIhPT1iLmNoYXJBdCgwKSYmZltiXS5hcHBseShmLGMpfSl9LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3I9ZX0od2luZG93LlplcHRvfHx3aW5kb3cualF1ZXJ5LHdpbmRvdyxkb2N1bWVudCksZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYil7dGhpcy5fY29yZT1iLHRoaXMuX2ludGVydmFsPW51bGwsdGhpcy5fdmlzaWJsZT1udWxsLHRoaXMuX2hhbmRsZXJzPXsiaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9SZWZyZXNoJiZ0aGlzLndhdGNoKCl9LHRoaXMpfSx0aGlzLl9jb3JlLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyx0aGlzLl9jb3JlLm9wdGlvbnMpLHRoaXMuX2NvcmUuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpfTtlLkRlZmF1bHRzPXthdXRvUmVmcmVzaDohMCxhdXRvUmVmcmVzaEludGVydmFsOjUwMH0sZS5wcm90b3R5cGUud2F0Y2g9ZnVuY3Rpb24oKXt0aGlzLl9pbnRlcnZhbHx8KHRoaXMuX3Zpc2libGU9dGhpcy5fY29yZS5pc1Zpc2libGUoKSx0aGlzLl9pbnRlcnZhbD1iLnNldEludGVydmFsKGEucHJveHkodGhpcy5yZWZyZXNoLHRoaXMpLHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b1JlZnJlc2hJbnRlcnZhbCkpfSxlLnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7dGhpcy5fY29yZS5pc1Zpc2libGUoKSE9PXRoaXMuX3Zpc2libGUmJih0aGlzLl92aXNpYmxlPSF0aGlzLl92aXNpYmxlLHRoaXMuX2NvcmUuJGVsZW1lbnQudG9nZ2xlQ2xhc3MoIm93bC1oaWRkZW4iLCF0aGlzLl92aXNpYmxlKSx0aGlzLl92aXNpYmxlJiZ0aGlzLl9jb3JlLmludmFsaWRhdGUoIndpZHRoIikmJnRoaXMuX2NvcmUucmVmcmVzaCgpKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhLGM7Yi5jbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKTtmb3IoYSBpbiB0aGlzLl9oYW5kbGVycyl0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihhLHRoaXMuX2hhbmRsZXJzW2FdKTtmb3IoYyBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkiZnVuY3Rpb24iIT10eXBlb2YgdGhpc1tjXSYmKHRoaXNbY109bnVsbCl9LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5BdXRvUmVmcmVzaD1lfSh3aW5kb3cuWmVwdG98fHdpbmRvdy5qUXVlcnksd2luZG93LGRvY3VtZW50KSxmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mdW5jdGlvbihiKXt0aGlzLl9jb3JlPWIsdGhpcy5fbG9hZGVkPVtdLHRoaXMuX2hhbmRsZXJzPXsiaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsIGNoYW5nZS5vd2wuY2Fyb3VzZWwgcmVzaXplZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYil7aWYoYi5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuc2V0dGluZ3MmJnRoaXMuX2NvcmUuc2V0dGluZ3MubGF6eUxvYWQmJihiLnByb3BlcnR5JiYicG9zaXRpb24iPT1iLnByb3BlcnR5Lm5hbWV8fCJpbml0aWFsaXplZCI9PWIudHlwZSkpe3ZhciBjPXRoaXMuX2NvcmUuc2V0dGluZ3MsZT1jLmNlbnRlciYmTWF0aC5jZWlsKGMuaXRlbXMvMil8fGMuaXRlbXMsZj1jLmNlbnRlciYmLTEqZXx8MCxnPShiLnByb3BlcnR5JiZiLnByb3BlcnR5LnZhbHVlIT09ZD9iLnByb3BlcnR5LnZhbHVlOnRoaXMuX2NvcmUuY3VycmVudCgpKStmLGg9dGhpcy5fY29yZS5jbG9uZXMoKS5sZW5ndGgsaT1hLnByb3h5KGZ1bmN0aW9uKGEsYil7dGhpcy5sb2FkKGIpfSx0aGlzKTtmb3IoYy5sYXp5TG9hZEVhZ2VyPjAmJihlKz1jLmxhenlMb2FkRWFnZXIsYy5sb29wJiYoZy09Yy5sYXp5TG9hZEVhZ2VyLGUrKykpO2YrKzxlOyl0aGlzLmxvYWQoaC8yK3RoaXMuX2NvcmUucmVsYXRpdmUoZykpLGgmJmEuZWFjaCh0aGlzLl9jb3JlLmNsb25lcyh0aGlzLl9jb3JlLnJlbGF0aXZlKGcpKSxpKSxnKyt9fSx0aGlzKX0sdGhpcy5fY29yZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuRGVmYXVsdHMsdGhpcy5fY29yZS5vcHRpb25zKSx0aGlzLl9jb3JlLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKX07ZS5EZWZhdWx0cz17bGF6eUxvYWQ6ITEsbGF6eUxvYWRFYWdlcjowfSxlLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGMpe3ZhciBkPXRoaXMuX2NvcmUuJHN0YWdlLmNoaWxkcmVuKCkuZXEoYyksZT1kJiZkLmZpbmQoIi5vd2wtbGF6eSIpOyFlfHxhLmluQXJyYXkoZC5nZXQoMCksdGhpcy5fbG9hZGVkKT4tMXx8KGUuZWFjaChhLnByb3h5KGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hKGQpLGc9Yi5kZXZpY2VQaXhlbFJhdGlvPjEmJmYuYXR0cigiZGF0YS1zcmMtcmV0aW5hIil8fGYuYXR0cigiZGF0YS1zcmMiKXx8Zi5hdHRyKCJkYXRhLXNyY3NldCIpO3RoaXMuX2NvcmUudHJpZ2dlcigibG9hZCIse2VsZW1lbnQ6Zix1cmw6Z30sImxhenkiKSxmLmlzKCJpbWciKT9mLm9uZSgibG9hZC5vd2wubGF6eSIsYS5wcm94eShmdW5jdGlvbigpe2YuY3NzKCJvcGFjaXR5IiwxKSx0aGlzLl9jb3JlLnRyaWdnZXIoImxvYWRlZCIse2VsZW1lbnQ6Zix1cmw6Z30sImxhenkiKX0sdGhpcykpLmF0dHIoInNyYyIsZyk6Zi5pcygic291cmNlIik/Zi5vbmUoImxvYWQub3dsLmxhenkiLGEucHJveHkoZnVuY3Rpb24oKXt0aGlzLl9jb3JlLnRyaWdnZXIoImxvYWRlZCIse2VsZW1lbnQ6Zix1cmw6Z30sImxhenkiKX0sdGhpcykpLmF0dHIoInNyY3NldCIsZyk6KGU9bmV3IEltYWdlLGUub25sb2FkPWEucHJveHkoZnVuY3Rpb24oKXtmLmNzcyh7ImJhY2tncm91bmQtaW1hZ2UiOid1cmwoIicrZysnIiknLG9wYWNpdHk6IjEifSksdGhpcy5fY29yZS50cmlnZ2VyKCJsb2FkZWQiLHtlbGVtZW50OmYsdXJsOmd9LCJsYXp5Iil9LHRoaXMpLGUuc3JjPWcpfSx0aGlzKSksdGhpcy5fbG9hZGVkLnB1c2goZC5nZXQoMCkpKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhLGI7Zm9yKGEgaW4gdGhpcy5oYW5kbGVycyl0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihhLHRoaXMuaGFuZGxlcnNbYV0pO2ZvcihiIGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzW2JdJiYodGhpc1tiXT1udWxsKX0sYS5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLkxhenk9ZX0od2luZG93LlplcHRvfHx3aW5kb3cualF1ZXJ5LHdpbmRvdyxkb2N1bWVudCksZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYyl7dGhpcy5fY29yZT1jLHRoaXMuX3ByZXZpb3VzSGVpZ2h0PW51bGwsdGhpcy5faGFuZGxlcnM9eyJpbml0aWFsaXplZC5vd2wuY2Fyb3VzZWwgcmVmcmVzaGVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvSGVpZ2h0JiZ0aGlzLnVwZGF0ZSgpfSx0aGlzKSwiY2hhbmdlZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b0hlaWdodCYmInBvc2l0aW9uIj09PWEucHJvcGVydHkubmFtZSYmdGhpcy51cGRhdGUoKX0sdGhpcyksImxvYWRlZC5vd2wubGF6eSI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvSGVpZ2h0JiZhLmVsZW1lbnQuY2xvc2VzdCgiLiIrdGhpcy5fY29yZS5zZXR0aW5ncy5pdGVtQ2xhc3MpLmluZGV4KCk9PT10aGlzLl9jb3JlLmN1cnJlbnQoKSYmdGhpcy51cGRhdGUoKX0sdGhpcyl9LHRoaXMuX2NvcmUub3B0aW9ucz1hLmV4dGVuZCh7fSxlLkRlZmF1bHRzLHRoaXMuX2NvcmUub3B0aW9ucyksdGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyksdGhpcy5faW50ZXJ2YWxJZD1udWxsO3ZhciBkPXRoaXM7YShiKS5vbigibG9hZCIsZnVuY3Rpb24oKXtkLl9jb3JlLnNldHRpbmdzLmF1dG9IZWlnaHQmJmQudXBkYXRlKCl9KSxhKGIpLnJlc2l6ZShmdW5jdGlvbigpe2QuX2NvcmUuc2V0dGluZ3MuYXV0b0hlaWdodCYmKG51bGwhPWQuX2ludGVydmFsSWQmJmNsZWFyVGltZW91dChkLl9pbnRlcnZhbElkKSxkLl9pbnRlcnZhbElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtkLnVwZGF0ZSgpfSwyNTApKX0pfTtlLkRlZmF1bHRzPXthdXRvSGVpZ2h0OiExLGF1dG9IZWlnaHRDbGFzczoib3dsLWhlaWdodCJ9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBiPXRoaXMuX2NvcmUuX2N1cnJlbnQsYz1iK3RoaXMuX2NvcmUuc2V0dGluZ3MuaXRlbXMsZD10aGlzLl9jb3JlLnNldHRpbmdzLmxhenlMb2FkLGU9dGhpcy5fY29yZS4kc3RhZ2UuY2hpbGRyZW4oKS50b0FycmF5KCkuc2xpY2UoYixjKSxmPVtdLGc9MDthLmVhY2goZSxmdW5jdGlvbihiLGMpe2YucHVzaChhKGMpLmhlaWdodCgpKX0pLGc9TWF0aC5tYXguYXBwbHkobnVsbCxmKSxnPD0xJiZkJiZ0aGlzLl9wcmV2aW91c0hlaWdodCYmKGc9dGhpcy5fcHJldmlvdXNIZWlnaHQpLHRoaXMuX3ByZXZpb3VzSGVpZ2h0PWcsdGhpcy5fY29yZS4kc3RhZ2UucGFyZW50KCkuaGVpZ2h0KGcpLmFkZENsYXNzKHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b0hlaWdodENsYXNzKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhLGI7Zm9yKGEgaW4gdGhpcy5faGFuZGxlcnMpdGhpcy5fY29yZS4kZWxlbWVudC5vZmYoYSx0aGlzLl9oYW5kbGVyc1thXSk7Zm9yKGIgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXNbYl0mJih0aGlzW2JdPW51bGwpfSxhLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuQXV0b0hlaWdodD1lfSh3aW5kb3cuWmVwdG98fHdpbmRvdy5qUXVlcnksd2luZG93LGRvY3VtZW50KSxmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mdW5jdGlvbihiKXt0aGlzLl9jb3JlPWIsdGhpcy5fdmlkZW9zPXt9LHRoaXMuX3BsYXlpbmc9bnVsbCx0aGlzLl9oYW5kbGVycz17ImluaXRpYWxpemVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5fY29yZS5yZWdpc3Rlcih7dHlwZToic3RhdGUiLG5hbWU6InBsYXlpbmciLHRhZ3M6WyJpbnRlcmFjdGluZyJdfSl9LHRoaXMpLCJyZXNpemUub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLnZpZGVvJiZ0aGlzLmlzSW5GdWxsU2NyZWVuKCkmJmEucHJldmVudERlZmF1bHQoKX0sdGhpcyksInJlZnJlc2hlZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuaXMoInJlc2l6aW5nIikmJnRoaXMuX2NvcmUuJHN0YWdlLmZpbmQoIi5jbG9uZWQgLm93bC12aWRlby1mcmFtZSIpLnJlbW92ZSgpfSx0aGlzKSwiY2hhbmdlZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJiJwb3NpdGlvbiI9PT1hLnByb3BlcnR5Lm5hbWUmJnRoaXMuX3BsYXlpbmcmJnRoaXMuc3RvcCgpfSx0aGlzKSwicHJlcGFyZWQub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGIpe2lmKGIubmFtZXNwYWNlKXt2YXIgYz1hKGIuY29udGVudCkuZmluZCgiLm93bC12aWRlbyIpO2MubGVuZ3RoJiYoYy5jc3MoImRpc3BsYXkiLCJub25lIiksdGhpcy5mZXRjaChjLGEoYi5jb250ZW50KSkpfX0sdGhpcyl9LHRoaXMuX2NvcmUub3B0aW9ucz1hLmV4dGVuZCh7fSxlLkRlZmF1bHRzLHRoaXMuX2NvcmUub3B0aW9ucyksdGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyksdGhpcy5fY29yZS4kZWxlbWVudC5vbigiY2xpY2sub3dsLnZpZGVvIiwiLm93bC12aWRlby1wbGF5LWljb24iLGEucHJveHkoZnVuY3Rpb24oYSl7dGhpcy5wbGF5KGEpfSx0aGlzKSl9O2UuRGVmYXVsdHM9e3ZpZGVvOiExLHZpZGVvSGVpZ2h0OiExLHZpZGVvV2lkdGg6ITF9LGUucHJvdG90eXBlLmZldGNoPWZ1bmN0aW9uKGEsYil7dmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hdHRyKCJkYXRhLXZpbWVvLWlkIik/InZpbWVvIjphLmF0dHIoImRhdGEtdnphYXItaWQiKT8idnphYXIiOiJ5b3V0dWJlIn0oKSxkPWEuYXR0cigiZGF0YS12aW1lby1pZCIpfHxhLmF0dHIoImRhdGEteW91dHViZS1pZCIpfHxhLmF0dHIoImRhdGEtdnphYXItaWQiKSxlPWEuYXR0cigiZGF0YS13aWR0aCIpfHx0aGlzLl9jb3JlLnNldHRpbmdzLnZpZGVvV2lkdGgsZj1hLmF0dHIoImRhdGEtaGVpZ2h0Iil8fHRoaXMuX2NvcmUuc2V0dGluZ3MudmlkZW9IZWlnaHQsZz1hLmF0dHIoImhyZWYiKTtpZighZyl0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgdmlkZW8gVVJMLiIpO2lmKGQ9Zy5tYXRjaCgvKGh0dHA6fGh0dHBzOnwpXC9cLyhwbGF5ZXIufHd3dy58YXBwLik/KHZpbWVvXC5jb218eW91dHUoYmVcLmNvbXxcLmJlfGJlXC5nb29nbGVhcGlzXC5jb218YmVcLW5vY29va2llXC5jb20pfHZ6YWFyXC5jb20pXC8odmlkZW9cL3x2aWRlb3NcL3xlbWJlZFwvfGNoYW5uZWxzXC8uK1wvfGdyb3Vwc1wvLitcL3x3YXRjaFw/dj18dlwvKT8oW0EtWmEtejAtOS5fJS1dKikoXCZcUyspPy8pLGRbM10uaW5kZXhPZigieW91dHUiKT4tMSljPSJ5b3V0dWJlIjtlbHNlIGlmKGRbM10uaW5kZXhPZigidmltZW8iKT4tMSljPSJ2aW1lbyI7ZWxzZXtpZighKGRbM10uaW5kZXhPZigidnphYXIiKT4tMSkpdGhyb3cgbmV3IEVycm9yKCJWaWRlbyBVUkwgbm90IHN1cHBvcnRlZC4iKTtjPSJ2emFhciJ9ZD1kWzZdLHRoaXMuX3ZpZGVvc1tnXT17dHlwZTpjLGlkOmQsd2lkdGg6ZSxoZWlnaHQ6Zn0sYi5hdHRyKCJkYXRhLXZpZGVvIixnKSx0aGlzLnRodW1ibmFpbChhLHRoaXMuX3ZpZGVvc1tnXSl9LGUucHJvdG90eXBlLnRodW1ibmFpbD1mdW5jdGlvbihiLGMpe3ZhciBkLGUsZixnPWMud2lkdGgmJmMuaGVpZ2h0PyJ3aWR0aDoiK2Mud2lkdGgrInB4O2hlaWdodDoiK2MuaGVpZ2h0KyJweDsiOiIiLGg9Yi5maW5kKCJpbWciKSxpPSJzcmMiLGo9IiIsaz10aGlzLl9jb3JlLnNldHRpbmdzLGw9ZnVuY3Rpb24oYyl7ZT0nPGRpdiBjbGFzcz0ib3dsLXZpZGVvLXBsYXktaWNvbiI+PC9kaXY+JyxkPWsubGF6eUxvYWQ/YSgiPGRpdi8+Iix7Y2xhc3M6Im93bC12aWRlby10biAiK2osc3JjVHlwZTpjfSk6YSgiPGRpdi8+Iix7Y2xhc3M6Im93bC12aWRlby10biIsc3R5bGU6Im9wYWNpdHk6MTtiYWNrZ3JvdW5kLWltYWdlOnVybCgiK2MrIikifSksYi5hZnRlcihkKSxiLmFmdGVyKGUpfTtpZihiLndyYXAoYSgiPGRpdi8+Iix7Y2xhc3M6Im93bC12aWRlby13cmFwcGVyIixzdHlsZTpnfSkpLHRoaXMuX2NvcmUuc2V0dGluZ3MubGF6eUxvYWQmJihpPSJkYXRhLXNyYyIsaj0ib3dsLWxhenkiKSxoLmxlbmd0aClyZXR1cm4gbChoLmF0dHIoaSkpLGgucmVtb3ZlKCksITE7InlvdXR1YmUiPT09Yy50eXBlPyhmPSIvL2ltZy55b3V0dWJlLmNvbS92aS8iK2MuaWQrIi9ocWRlZmF1bHQuanBnIixsKGYpKToidmltZW8iPT09Yy50eXBlP2EuYWpheCh7dHlwZToiR0VUIix1cmw6Ii8vdmltZW8uY29tL2FwaS92Mi92aWRlby8iK2MuaWQrIi5qc29uIixqc29ucDoiY2FsbGJhY2siLGRhdGFUeXBlOiJqc29ucCIsc3VjY2VzczpmdW5jdGlvbihhKXtmPWFbMF0udGh1bWJuYWlsX2xhcmdlLGwoZil9fSk6InZ6YWFyIj09PWMudHlwZSYmYS5hamF4KHt0eXBlOiJHRVQiLHVybDoiLy92emFhci5jb20vYXBpL3ZpZGVvcy8iK2MuaWQrIi5qc29uIixqc29ucDoiY2FsbGJhY2siLGRhdGFUeXBlOiJqc29ucCIsc3VjY2VzczpmdW5jdGlvbihhKXtmPWEuZnJhbWVncmFiX3VybCxsKGYpfX0pfSxlLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5fY29yZS50cmlnZ2VyKCJzdG9wIixudWxsLCJ2aWRlbyIpLHRoaXMuX3BsYXlpbmcuZmluZCgiLm93bC12aWRlby1mcmFtZSIpLnJlbW92ZSgpLHRoaXMuX3BsYXlpbmcucmVtb3ZlQ2xhc3MoIm93bC12aWRlby1wbGF5aW5nIiksdGhpcy5fcGxheWluZz1udWxsLHRoaXMuX2NvcmUubGVhdmUoInBsYXlpbmciKSx0aGlzLl9jb3JlLnRyaWdnZXIoInN0b3BwZWQiLG51bGwsInZpZGVvIil9LGUucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oYil7dmFyIGMsZD1hKGIudGFyZ2V0KSxlPWQuY2xvc2VzdCgiLiIrdGhpcy5fY29yZS5zZXR0aW5ncy5pdGVtQ2xhc3MpLGY9dGhpcy5fdmlkZW9zW2UuYXR0cigiZGF0YS12aWRlbyIpXSxnPWYud2lkdGh8fCIxMDAlIixoPWYuaGVpZ2h0fHx0aGlzLl9jb3JlLiRzdGFnZS5oZWlnaHQoKTt0aGlzLl9wbGF5aW5nfHwodGhpcy5fY29yZS5lbnRlcigicGxheWluZyIpLHRoaXMuX2NvcmUudHJpZ2dlcigicGxheSIsbnVsbCwidmlkZW8iKSxlPXRoaXMuX2NvcmUuaXRlbXModGhpcy5fY29yZS5yZWxhdGl2ZShlLmluZGV4KCkpKSx0aGlzLl9jb3JlLnJlc2V0KGUuaW5kZXgoKSksYz1hKCc8aWZyYW1lIGZyYW1lYm9yZGVyPSIwIiBhbGxvd2Z1bGxzY3JlZW4gbW96YWxsb3dmdWxsc2NyZWVuIHdlYmtpdEFsbG93RnVsbFNjcmVlbiA+PC9pZnJhbWU+JyksYy5hdHRyKCJoZWlnaHQiLGgpLGMuYXR0cigid2lkdGgiLGcpLCJ5b3V0dWJlIj09PWYudHlwZT9jLmF0dHIoInNyYyIsIi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyIrZi5pZCsiP2F1dG9wbGF5PTEmcmVsPTAmdj0iK2YuaWQpOiJ2aW1lbyI9PT1mLnR5cGU/Yy5hdHRyKCJzcmMiLCIvL3BsYXllci52aW1lby5jb20vdmlkZW8vIitmLmlkKyI/YXV0b3BsYXk9MSIpOiJ2emFhciI9PT1mLnR5cGUmJmMuYXR0cigic3JjIiwiLy92aWV3LnZ6YWFyLmNvbS8iK2YuaWQrIi9wbGF5ZXI/YXV0b3BsYXk9dHJ1ZSIpLGEoYykud3JhcCgnPGRpdiBjbGFzcz0ib3dsLXZpZGVvLWZyYW1lIiAvPicpLmluc2VydEFmdGVyKGUuZmluZCgiLm93bC12aWRlbyIpKSx0aGlzLl9wbGF5aW5nPWUuYWRkQ2xhc3MoIm93bC12aWRlby1wbGF5aW5nIikpfSxlLnByb3RvdHlwZS5pc0luRnVsbFNjcmVlbj1mdW5jdGlvbigpe3ZhciBiPWMuZnVsbHNjcmVlbkVsZW1lbnR8fGMubW96RnVsbFNjcmVlbkVsZW1lbnR8fGMud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQ7cmV0dXJuIGImJmEoYikucGFyZW50KCkuaGFzQ2xhc3MoIm93bC12aWRlby1mcmFtZSIpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGEsYjt0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZigiY2xpY2sub3dsLnZpZGVvIik7Zm9yKGEgaW4gdGhpcy5faGFuZGxlcnMpdGhpcy5fY29yZS4kZWxlbWVudC5vZmYoYSx0aGlzLl9oYW5kbGVyc1thXSk7Zm9yKGIgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXNbYl0mJih0aGlzW2JdPW51bGwpfSxhLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuVmlkZW89ZX0od2luZG93LlplcHRvfHx3aW5kb3cualF1ZXJ5LHdpbmRvdyxkb2N1bWVudCksZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYil7dGhpcy5jb3JlPWIsdGhpcy5jb3JlLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyx0aGlzLmNvcmUub3B0aW9ucyksdGhpcy5zd2FwcGluZz0hMCx0aGlzLnByZXZpb3VzPWQsdGhpcy5uZXh0PWQsdGhpcy5oYW5kbGVycz17ImNoYW5nZS5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJiJwb3NpdGlvbiI9PWEucHJvcGVydHkubmFtZSYmKHRoaXMucHJldmlvdXM9dGhpcy5jb3JlLmN1cnJlbnQoKSx0aGlzLm5leHQ9YS5wcm9wZXJ0eS52YWx1ZSl9LHRoaXMpLCJkcmFnLm93bC5jYXJvdXNlbCBkcmFnZ2VkLm93bC5jYXJvdXNlbCB0cmFuc2xhdGVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmKHRoaXMuc3dhcHBpbmc9InRyYW5zbGF0ZWQiPT1hLnR5cGUpfSx0aGlzKSwidHJhbnNsYXRlLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5zd2FwcGluZyYmKHRoaXMuY29yZS5vcHRpb25zLmFuaW1hdGVPdXR8fHRoaXMuY29yZS5vcHRpb25zLmFuaW1hdGVJbikmJnRoaXMuc3dhcCgpfSx0aGlzKX0sdGhpcy5jb3JlLiRlbGVtZW50Lm9uKHRoaXMuaGFuZGxlcnMpfTtlLkRlZmF1bHRzPXthbmltYXRlT3V0OiExLGFuaW1hdGVJbjohMX0sZS5wcm90b3R5cGUuc3dhcD1mdW5jdGlvbigpe2lmKDE9PT10aGlzLmNvcmUuc2V0dGluZ3MuaXRlbXMmJmEuc3VwcG9ydC5hbmltYXRpb24mJmEuc3VwcG9ydC50cmFuc2l0aW9uKXt0aGlzLmNvcmUuc3BlZWQoMCk7dmFyIGIsYz1hLnByb3h5KHRoaXMuY2xlYXIsdGhpcyksZD10aGlzLmNvcmUuJHN0YWdlLmNoaWxkcmVuKCkuZXEodGhpcy5wcmV2aW91cyksZT10aGlzLmNvcmUuJHN0YWdlLmNoaWxkcmVuKCkuZXEodGhpcy5uZXh0KSxmPXRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlSW4sZz10aGlzLmNvcmUuc2V0dGluZ3MuYW5pbWF0ZU91dDt0aGlzLmNvcmUuY3VycmVudCgpIT09dGhpcy5wcmV2aW91cyYmKGcmJihiPXRoaXMuY29yZS5jb29yZGluYXRlcyh0aGlzLnByZXZpb3VzKS10aGlzLmNvcmUuY29vcmRpbmF0ZXModGhpcy5uZXh0KSxkLm9uZShhLnN1cHBvcnQuYW5pbWF0aW9uLmVuZCxjKS5jc3Moe2xlZnQ6YisicHgifSkuYWRkQ2xhc3MoImFuaW1hdGVkIG93bC1hbmltYXRlZC1vdXQiKS5hZGRDbGFzcyhnKSksZiYmZS5vbmUoYS5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsYykuYWRkQ2xhc3MoImFuaW1hdGVkIG93bC1hbmltYXRlZC1pbiIpLmFkZENsYXNzKGYpKX19LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKGIpe2EoYi50YXJnZXQpLmNzcyh7bGVmdDoiIn0pLnJlbW92ZUNsYXNzKCJhbmltYXRlZCBvd2wtYW5pbWF0ZWQtb3V0IG93bC1hbmltYXRlZC1pbiIpLnJlbW92ZUNsYXNzKHRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlSW4pLnJlbW92ZUNsYXNzKHRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlT3V0KSx0aGlzLmNvcmUub25UcmFuc2l0aW9uRW5kKCl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYSxiO2ZvcihhIGluIHRoaXMuaGFuZGxlcnMpdGhpcy5jb3JlLiRlbGVtZW50Lm9mZihhLHRoaXMuaGFuZGxlcnNbYV0pO2ZvcihiIGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzW2JdJiYodGhpc1tiXT1udWxsKX0sYS5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLkFuaW1hdGU9ZX0od2luZG93LlplcHRvfHx3aW5kb3cualF1ZXJ5LHdpbmRvdyxkb2N1bWVudCksZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYil7dGhpcy5fY29yZT1iLHRoaXMuX2NhbGw9bnVsbCx0aGlzLl90aW1lPTAsdGhpcy5fdGltZW91dD0wLHRoaXMuX3BhdXNlZD0hMCx0aGlzLl9oYW5kbGVycz17ImNoYW5nZWQub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiYic2V0dGluZ3MiPT09YS5wcm9wZXJ0eS5uYW1lP3RoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXk/dGhpcy5wbGF5KCk6dGhpcy5zdG9wKCk6YS5uYW1lc3BhY2UmJiJwb3NpdGlvbiI9PT1hLnByb3BlcnR5Lm5hbWUmJnRoaXMuX3BhdXNlZCYmKHRoaXMuX3RpbWU9MCl9LHRoaXMpLCJpbml0aWFsaXplZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXkmJnRoaXMucGxheSgpfSx0aGlzKSwicGxheS5vd2wuYXV0b3BsYXkiOmEucHJveHkoZnVuY3Rpb24oYSxiLGMpe2EubmFtZXNwYWNlJiZ0aGlzLnBsYXkoYixjKX0sdGhpcyksInN0b3Aub3dsLmF1dG9wbGF5IjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLnN0b3AoKX0sdGhpcyksIm1vdXNlb3Zlci5vd2wuYXV0b3BsYXkiOmEucHJveHkoZnVuY3Rpb24oKXt0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5SG92ZXJQYXVzZSYmdGhpcy5fY29yZS5pcygicm90YXRpbmciKSYmdGhpcy5wYXVzZSgpfSx0aGlzKSwibW91c2VsZWF2ZS5vd2wuYXV0b3BsYXkiOmEucHJveHkoZnVuY3Rpb24oKXt0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5SG92ZXJQYXVzZSYmdGhpcy5fY29yZS5pcygicm90YXRpbmciKSYmdGhpcy5wbGF5KCl9LHRoaXMpLCJ0b3VjaHN0YXJ0Lm93bC5jb3JlIjphLnByb3h5KGZ1bmN0aW9uKCl7dGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheUhvdmVyUGF1c2UmJnRoaXMuX2NvcmUuaXMoInJvdGF0aW5nIikmJnRoaXMucGF1c2UoKX0sdGhpcyksInRvdWNoZW5kLm93bC5jb3JlIjphLnByb3h5KGZ1bmN0aW9uKCl7dGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheUhvdmVyUGF1c2UmJnRoaXMucGxheSgpfSx0aGlzKX0sdGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyksdGhpcy5fY29yZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuRGVmYXVsdHMsdGhpcy5fY29yZS5vcHRpb25zKX07ZS5EZWZhdWx0cz17YXV0b3BsYXk6ITEsYXV0b3BsYXlUaW1lb3V0OjVlMyxhdXRvcGxheUhvdmVyUGF1c2U6ITEsYXV0b3BsYXlTcGVlZDohMX0sZS5wcm90b3R5cGUuX25leHQ9ZnVuY3Rpb24oZCl7dGhpcy5fY2FsbD1iLnNldFRpbWVvdXQoYS5wcm94eSh0aGlzLl9uZXh0LHRoaXMsZCksdGhpcy5fdGltZW91dCooTWF0aC5yb3VuZCh0aGlzLnJlYWQoKS90aGlzLl90aW1lb3V0KSsxKS10aGlzLnJlYWQoKSksdGhpcy5fY29yZS5pcygiaW50ZXJhY3RpbmciKXx8Yy5oaWRkZW58fHRoaXMuX2NvcmUubmV4dChkfHx0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5U3BlZWQpfSxlLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fdGltZX0sZS5wcm90b3R5cGUucGxheT1mdW5jdGlvbihjLGQpe3ZhciBlO3RoaXMuX2NvcmUuaXMoInJvdGF0aW5nIil8fHRoaXMuX2NvcmUuZW50ZXIoInJvdGF0aW5nIiksYz1jfHx0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5VGltZW91dCxlPU1hdGgubWluKHRoaXMuX3RpbWUlKHRoaXMuX3RpbWVvdXR8fGMpLGMpLHRoaXMuX3BhdXNlZD8odGhpcy5fdGltZT10aGlzLnJlYWQoKSx0aGlzLl9wYXVzZWQ9ITEpOmIuY2xlYXJUaW1lb3V0KHRoaXMuX2NhbGwpLHRoaXMuX3RpbWUrPXRoaXMucmVhZCgpJWMtZSx0aGlzLl90aW1lb3V0PWMsdGhpcy5fY2FsbD1iLnNldFRpbWVvdXQoYS5wcm94eSh0aGlzLl9uZXh0LHRoaXMsZCksYy1lKX0sZS5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbigpe3RoaXMuX2NvcmUuaXMoInJvdGF0aW5nIikmJih0aGlzLl90aW1lPTAsdGhpcy5fcGF1c2VkPSEwLGIuY2xlYXJUaW1lb3V0KHRoaXMuX2NhbGwpLHRoaXMuX2NvcmUubGVhdmUoInJvdGF0aW5nIikpfSxlLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuX2NvcmUuaXMoInJvdGF0aW5nIikmJiF0aGlzLl9wYXVzZWQmJih0aGlzLl90aW1lPXRoaXMucmVhZCgpLHRoaXMuX3BhdXNlZD0hMCxiLmNsZWFyVGltZW91dCh0aGlzLl9jYWxsKSl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYSxiO3RoaXMuc3RvcCgpO2ZvcihhIGluIHRoaXMuX2hhbmRsZXJzKXRoaXMuX2NvcmUuJGVsZW1lbnQub2ZmKGEsdGhpcy5faGFuZGxlcnNbYV0pO2ZvcihiIGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzW2JdJiYodGhpc1tiXT1udWxsKX0sYS5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLmF1dG9wbGF5PWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1mdW5jdGlvbihiKXt0aGlzLl9jb3JlPWIsdGhpcy5faW5pdGlhbGl6ZWQ9ITEsdGhpcy5fcGFnZXM9W10sdGhpcy5fY29udHJvbHM9e30sdGhpcy5fdGVtcGxhdGVzPVtdLHRoaXMuJGVsZW1lbnQ9dGhpcy5fY29yZS4kZWxlbWVudCx0aGlzLl9vdmVycmlkZXM9e25leHQ6dGhpcy5fY29yZS5uZXh0LHByZXY6dGhpcy5fY29yZS5wcmV2LHRvOnRoaXMuX2NvcmUudG99LHRoaXMuX2hhbmRsZXJzPXsicHJlcGFyZWQub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGIpe2IubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLmRvdHNEYXRhJiZ0aGlzLl90ZW1wbGF0ZXMucHVzaCgnPGRpdiBjbGFzcz0iJyt0aGlzLl9jb3JlLnNldHRpbmdzLmRvdENsYXNzKyciPicrYShiLmNvbnRlbnQpLmZpbmQoIltkYXRhLWRvdF0iKS5hZGRCYWNrKCJbZGF0YS1kb3RdIikuYXR0cigiZGF0YS1kb3QiKSsiPC9kaXY+Iil9LHRoaXMpLCJhZGRlZC5vd2wuY2Fyb3VzZWwiOmEucHJveHkoZnVuY3Rpb24oYSl7YS5uYW1lc3BhY2UmJnRoaXMuX2NvcmUuc2V0dGluZ3MuZG90c0RhdGEmJnRoaXMuX3RlbXBsYXRlcy5zcGxpY2UoYS5wb3NpdGlvbiwwLHRoaXMuX3RlbXBsYXRlcy5wb3AoKSl9LHRoaXMpLCJyZW1vdmUub3dsLmNhcm91c2VsIjphLnByb3h5KGZ1bmN0aW9uKGEpe2EubmFtZXNwYWNlJiZ0aGlzLl9jb3JlLnNldHRpbmdzLmRvdHNEYXRhJiZ0aGlzLl90ZW1wbGF0ZXMuc3BsaWNlKGEucG9zaXRpb24sMSl9LHRoaXMpLCJjaGFuZ2VkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmInBvc2l0aW9uIj09YS5wcm9wZXJ0eS5uYW1lJiZ0aGlzLmRyYXcoKX0sdGhpcyksImluaXRpYWxpemVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmIXRoaXMuX2luaXRpYWxpemVkJiYodGhpcy5fY29yZS50cmlnZ2VyKCJpbml0aWFsaXplIixudWxsLCJuYXZpZ2F0aW9uIiksdGhpcy5pbml0aWFsaXplKCksdGhpcy51cGRhdGUoKSx0aGlzLmRyYXcoKSx0aGlzLl9pbml0aWFsaXplZD0hMCx0aGlzLl9jb3JlLnRyaWdnZXIoImluaXRpYWxpemVkIixudWxsLCJuYXZpZ2F0aW9uIikpfSx0aGlzKSwicmVmcmVzaGVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihhKXthLm5hbWVzcGFjZSYmdGhpcy5faW5pdGlhbGl6ZWQmJih0aGlzLl9jb3JlLnRyaWdnZXIoInJlZnJlc2giLG51bGwsIm5hdmlnYXRpb24iKSx0aGlzLnVwZGF0ZSgpLHRoaXMuZHJhdygpLHRoaXMuX2NvcmUudHJpZ2dlcigicmVmcmVzaGVkIixudWxsLCJuYXZpZ2F0aW9uIikpfSx0aGlzKX0sdGhpcy5fY29yZS5vcHRpb25zPWEuZXh0ZW5kKHt9LGUuRGVmYXVsdHMsdGhpcy5fY29yZS5vcHRpb25zKSx0aGlzLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKX07ZS5EZWZhdWx0cz17bmF2OiExLG5hdlRleHQ6Wyc8c3BhbiBhcmlhLWxhYmVsPSJQcmV2aW91cyI+JiN4MjAzOTs8L3NwYW4+JywnPHNwYW4gYXJpYS1sYWJlbD0iTmV4dCI+JiN4MjAzYTs8L3NwYW4+J10sbmF2U3BlZWQ6ITEsbmF2RWxlbWVudDonYnV0dG9uIHR5cGU9ImJ1dHRvbiIgcm9sZT0icHJlc2VudGF0aW9uIicsbmF2Q29udGFpbmVyOiExLG5hdkNvbnRhaW5lckNsYXNzOiJvd2wtbmF2IixuYXZDbGFzczpbIm93bC1wcmV2Iiwib3dsLW5leHQiXSxzbGlkZUJ5OjEsZG90Q2xhc3M6Im93bC1kb3QiLGRvdHNDbGFzczoib3dsLWRvdHMiLGRvdHM6ITAsZG90c0VhY2g6ITEsZG90c0RhdGE6ITEsZG90c1NwZWVkOiExLGRvdHNDb250YWluZXI6ITF9LGUucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXt2YXIgYixjPXRoaXMuX2NvcmUuc2V0dGluZ3M7dGhpcy5fY29udHJvbHMuJHJlbGF0aXZlPShjLm5hdkNvbnRhaW5lcj9hKGMubmF2Q29udGFpbmVyKTphKCI8ZGl2PiIpLmFkZENsYXNzKGMubmF2Q29udGFpbmVyQ2xhc3MpLmFwcGVuZFRvKHRoaXMuJGVsZW1lbnQpKS5hZGRDbGFzcygiZGlzYWJsZWQiKSx0aGlzLl9jb250cm9scy4kcHJldmlvdXM9YSgiPCIrYy5uYXZFbGVtZW50KyI+IikuYWRkQ2xhc3MoYy5uYXZDbGFzc1swXSkuaHRtbChjLm5hdlRleHRbMF0pLnByZXBlbmRUbyh0aGlzLl9jb250cm9scy4kcmVsYXRpdmUpLm9uKCJjbGljayIsYS5wcm94eShmdW5jdGlvbihhKXt0aGlzLnByZXYoYy5uYXZTcGVlZCl9LHRoaXMpKSx0aGlzLl9jb250cm9scy4kbmV4dD1hKCI8IitjLm5hdkVsZW1lbnQrIj4iKS5hZGRDbGFzcyhjLm5hdkNsYXNzWzFdKS5odG1sKGMubmF2VGV4dFsxXSkuYXBwZW5kVG8odGhpcy5fY29udHJvbHMuJHJlbGF0aXZlKS5vbigiY2xpY2siLGEucHJveHkoZnVuY3Rpb24oYSl7dGhpcy5uZXh0KGMubmF2U3BlZWQpfSx0aGlzKSksYy5kb3RzRGF0YXx8KHRoaXMuX3RlbXBsYXRlcz1bYSgnPGJ1dHRvbiByb2xlPSJidXR0b24iPicpLmFkZENsYXNzKGMuZG90Q2xhc3MpLmFwcGVuZChhKCI8c3Bhbj4iKSkucHJvcCgib3V0ZXJIVE1MIildKSx0aGlzLl9jb250cm9scy4kYWJzb2x1dGU9KGMuZG90c0NvbnRhaW5lcj9hKGMuZG90c0NvbnRhaW5lcik6YSgiPGRpdj4iKS5hZGRDbGFzcyhjLmRvdHNDbGFzcykuYXBwZW5kVG8odGhpcy4kZWxlbWVudCkpLmFkZENsYXNzKCJkaXNhYmxlZCIpLHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5vbigiY2xpY2siLCJidXR0b24iLGEucHJveHkoZnVuY3Rpb24oYil7dmFyIGQ9YShiLnRhcmdldCkucGFyZW50KCkuaXModGhpcy5fY29udHJvbHMuJGFic29sdXRlKT9hKGIudGFyZ2V0KS5pbmRleCgpOmEoYi50YXJnZXQpLnBhcmVudCgpLmluZGV4KCk7Yi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMudG8oZCxjLmRvdHNTcGVlZCl9LHRoaXMpKTtmb3IoYiBpbiB0aGlzLl9vdmVycmlkZXMpdGhpcy5fY29yZVtiXT1hLnByb3h5KHRoaXNbYl0sdGhpcyl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlO2U9dGhpcy5fY29yZS5zZXR0aW5ncztmb3IoYSBpbiB0aGlzLl9oYW5kbGVycyl0aGlzLiRlbGVtZW50Lm9mZihhLHRoaXMuX2hhbmRsZXJzW2FdKTtmb3IoYiBpbiB0aGlzLl9jb250cm9scykiJHJlbGF0aXZlIj09PWImJmUubmF2Q29udGFpbmVyP3RoaXMuX2NvbnRyb2xzW2JdLmh0bWwoIiIpOnRoaXMuX2NvbnRyb2xzW2JdLnJlbW92ZSgpO2ZvcihkIGluIHRoaXMub3ZlcmlkZXMpdGhpcy5fY29yZVtkXT10aGlzLl9vdmVycmlkZXNbZF07Zm9yKGMgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXNbY10mJih0aGlzW2NdPW51bGwpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZD10aGlzLl9jb3JlLmNsb25lcygpLmxlbmd0aC8yLGU9ZCt0aGlzLl9jb3JlLml0ZW1zKCkubGVuZ3RoLGY9dGhpcy5fY29yZS5tYXhpbXVtKCEwKSxnPXRoaXMuX2NvcmUuc2V0dGluZ3MsaD1nLmNlbnRlcnx8Zy5hdXRvV2lkdGh8fGcuZG90c0RhdGE/MTpnLmRvdHNFYWNofHxnLml0ZW1zO2lmKCJwYWdlIiE9PWcuc2xpZGVCeSYmKGcuc2xpZGVCeT1NYXRoLm1pbihnLnNsaWRlQnksZy5pdGVtcykpLGcuZG90c3x8InBhZ2UiPT1nLnNsaWRlQnkpZm9yKHRoaXMuX3BhZ2VzPVtdLGE9ZCxiPTAsYz0wO2E8ZTthKyspe2lmKGI+PWh8fDA9PT1iKXtpZih0aGlzLl9wYWdlcy5wdXNoKHtzdGFydDpNYXRoLm1pbihmLGEtZCksZW5kOmEtZCtoLTF9KSxNYXRoLm1pbihmLGEtZCk9PT1mKWJyZWFrO2I9MCwrK2N9Yis9dGhpcy5fY29yZS5tZXJnZXJzKHRoaXMuX2NvcmUucmVsYXRpdmUoYSkpfX0sZS5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbigpe3ZhciBiLGM9dGhpcy5fY29yZS5zZXR0aW5ncyxkPXRoaXMuX2NvcmUuaXRlbXMoKS5sZW5ndGg8PWMuaXRlbXMsZT10aGlzLl9jb3JlLnJlbGF0aXZlKHRoaXMuX2NvcmUuY3VycmVudCgpKSxmPWMubG9vcHx8Yy5yZXdpbmQ7dGhpcy5fY29udHJvbHMuJHJlbGF0aXZlLnRvZ2dsZUNsYXNzKCJkaXNhYmxlZCIsIWMubmF2fHxkKSxjLm5hdiYmKHRoaXMuX2NvbnRyb2xzLiRwcmV2aW91cy50b2dnbGVDbGFzcygiZGlzYWJsZWQiLCFmJiZlPD10aGlzLl9jb3JlLm1pbmltdW0oITApKSx0aGlzLl9jb250cm9scy4kbmV4dC50b2dnbGVDbGFzcygiZGlzYWJsZWQiLCFmJiZlPj10aGlzLl9jb3JlLm1heGltdW0oITApKSksdGhpcy5fY29udHJvbHMuJGFic29sdXRlLnRvZ2dsZUNsYXNzKCJkaXNhYmxlZCIsIWMuZG90c3x8ZCksYy5kb3RzJiYoYj10aGlzLl9wYWdlcy5sZW5ndGgtdGhpcy5fY29udHJvbHMuJGFic29sdXRlLmNoaWxkcmVuKCkubGVuZ3RoLGMuZG90c0RhdGEmJjAhPT1iP3RoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5odG1sKHRoaXMuX3RlbXBsYXRlcy5qb2luKCIiKSk6Yj4wP3RoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5hcHBlbmQobmV3IEFycmF5KGIrMSkuam9pbih0aGlzLl90ZW1wbGF0ZXNbMF0pKTpiPDAmJnRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5jaGlsZHJlbigpLnNsaWNlKGIpLnJlbW92ZSgpLHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5maW5kKCIuYWN0aXZlIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5jaGlsZHJlbigpLmVxKGEuaW5BcnJheSh0aGlzLmN1cnJlbnQoKSx0aGlzLl9wYWdlcykpLmFkZENsYXNzKCJhY3RpdmUiKSl9LGUucHJvdG90eXBlLm9uVHJpZ2dlcj1mdW5jdGlvbihiKXt2YXIgYz10aGlzLl9jb3JlLnNldHRpbmdzO2IucGFnZT17aW5kZXg6YS5pbkFycmF5KHRoaXMuY3VycmVudCgpLHRoaXMuX3BhZ2VzKSxjb3VudDp0aGlzLl9wYWdlcy5sZW5ndGgsc2l6ZTpjJiYoYy5jZW50ZXJ8fGMuYXV0b1dpZHRofHxjLmRvdHNEYXRhPzE6Yy5kb3RzRWFjaHx8Yy5pdGVtcyl9fSxlLnByb3RvdHlwZS5jdXJyZW50PWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fY29yZS5yZWxhdGl2ZSh0aGlzLl9jb3JlLmN1cnJlbnQoKSk7cmV0dXJuIGEuZ3JlcCh0aGlzLl9wYWdlcyxhLnByb3h5KGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuc3RhcnQ8PWImJmEuZW5kPj1ifSx0aGlzKSkucG9wKCl9LGUucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKGIpe3ZhciBjLGQsZT10aGlzLl9jb3JlLnNldHRpbmdzO3JldHVybiJwYWdlIj09ZS5zbGlkZUJ5PyhjPWEuaW5BcnJheSh0aGlzLmN1cnJlbnQoKSx0aGlzLl9wYWdlcyksZD10aGlzLl9wYWdlcy5sZW5ndGgsYj8rK2M6LS1jLGM9dGhpcy5fcGFnZXNbKGMlZCtkKSVkXS5zdGFydCk6KGM9dGhpcy5fY29yZS5yZWxhdGl2ZSh0aGlzLl9jb3JlLmN1cnJlbnQoKSksZD10aGlzLl9jb3JlLml0ZW1zKCkubGVuZ3RoLGI/Yys9ZS5zbGlkZUJ5OmMtPWUuc2xpZGVCeSksY30sZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbihiKXthLnByb3h5KHRoaXMuX292ZXJyaWRlcy50byx0aGlzLl9jb3JlKSh0aGlzLmdldFBvc2l0aW9uKCEwKSxiKX0sZS5wcm90b3R5cGUucHJldj1mdW5jdGlvbihiKXthLnByb3h5KHRoaXMuX292ZXJyaWRlcy50byx0aGlzLl9jb3JlKSh0aGlzLmdldFBvc2l0aW9uKCExKSxiKX0sZS5wcm90b3R5cGUudG89ZnVuY3Rpb24oYixjLGQpe3ZhciBlOyFkJiZ0aGlzLl9wYWdlcy5sZW5ndGg/KGU9dGhpcy5fcGFnZXMubGVuZ3RoLGEucHJveHkodGhpcy5fb3ZlcnJpZGVzLnRvLHRoaXMuX2NvcmUpKHRoaXMuX3BhZ2VzWyhiJWUrZSklZV0uc3RhcnQsYykpOmEucHJveHkodGhpcy5fb3ZlcnJpZGVzLnRvLHRoaXMuX2NvcmUpKGIsYyl9LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5OYXZpZ2F0aW9uPWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1mdW5jdGlvbihjKXt0aGlzLl9jb3JlPWMsdGhpcy5faGFzaGVzPXt9LHRoaXMuJGVsZW1lbnQ9dGhpcy5fY29yZS4kZWxlbWVudCx0aGlzLl9oYW5kbGVycz17ImluaXRpYWxpemVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihjKXtjLm5hbWVzcGFjZSYmIlVSTEhhc2giPT09dGhpcy5fY29yZS5zZXR0aW5ncy5zdGFydFBvc2l0aW9uJiZhKGIpLnRyaWdnZXIoImhhc2hjaGFuZ2Uub3dsLm5hdmlnYXRpb24iKX0sdGhpcyksInByZXBhcmVkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihiKXtpZihiLm5hbWVzcGFjZSl7dmFyIGM9YShiLmNvbnRlbnQpLmZpbmQoIltkYXRhLWhhc2hdIikuYWRkQmFjaygiW2RhdGEtaGFzaF0iKS5hdHRyKCJkYXRhLWhhc2giKTtpZighYylyZXR1cm47dGhpcy5faGFzaGVzW2NdPWIuY29udGVudH19LHRoaXMpLCJjaGFuZ2VkLm93bC5jYXJvdXNlbCI6YS5wcm94eShmdW5jdGlvbihjKXtpZihjLm5hbWVzcGFjZSYmInBvc2l0aW9uIj09PWMucHJvcGVydHkubmFtZSl7dmFyIGQ9dGhpcy5fY29yZS5pdGVtcyh0aGlzLl9jb3JlLnJlbGF0aXZlKHRoaXMuX2NvcmUuY3VycmVudCgpKSksZT1hLm1hcCh0aGlzLl9oYXNoZXMsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWQ/YjpudWxsfSkuam9pbigpO2lmKCFlfHxiLmxvY2F0aW9uLmhhc2guc2xpY2UoMSk9PT1lKXJldHVybjtiLmxvY2F0aW9uLmhhc2g9ZX19LHRoaXMpfSx0aGlzLl9jb3JlLm9wdGlvbnM9YS5leHRlbmQoe30sZS5EZWZhdWx0cyx0aGlzLl9jb3JlLm9wdGlvbnMpLHRoaXMuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpLGEoYikub24oImhhc2hjaGFuZ2Uub3dsLm5hdmlnYXRpb24iLGEucHJveHkoZnVuY3Rpb24oYSl7dmFyIGM9Yi5sb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSxlPXRoaXMuX2NvcmUuJHN0YWdlLmNoaWxkcmVuKCksZj10aGlzLl9oYXNoZXNbY10mJmUuaW5kZXgodGhpcy5faGFzaGVzW2NdKTtmIT09ZCYmZiE9PXRoaXMuX2NvcmUuY3VycmVudCgpJiZ0aGlzLl9jb3JlLnRvKHRoaXMuX2NvcmUucmVsYXRpdmUoZiksITEsITApfSx0aGlzKSl9O2UuRGVmYXVsdHM9e1VSTGhhc2hMaXN0ZW5lcjohMX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBjLGQ7YShiKS5vZmYoImhhc2hjaGFuZ2Uub3dsLm5hdmlnYXRpb24iKTtmb3IoYyBpbiB0aGlzLl9oYW5kbGVycyl0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihjLHRoaXMuX2hhbmRsZXJzW2NdKTtmb3IoZCBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkiZnVuY3Rpb24iIT10eXBlb2YgdGhpc1tkXSYmKHRoaXNbZF09bnVsbCl9LGEuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5IYXNoPWV9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpLGZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGUoYixjKXt2YXIgZT0hMSxmPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKTtyZXR1cm4gYS5lYWNoKChiKyIgIitoLmpvaW4oZisiICIpK2YpLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtpZihnW2JdIT09ZClyZXR1cm4gZT0hY3x8YiwhMX0pLGV9ZnVuY3Rpb24gZihhKXtyZXR1cm4gZShhLCEwKX12YXIgZz1hKCI8c3VwcG9ydD4iKS5nZXQoMCkuc3R5bGUsaD0iV2Via2l0IE1veiBPIG1zIi5zcGxpdCgiICIpLGk9e3RyYW5zaXRpb246e2VuZDp7V2Via2l0VHJhbnNpdGlvbjoid2Via2l0VHJhbnNpdGlvbkVuZCIsTW96VHJhbnNpdGlvbjoidHJhbnNpdGlvbmVuZCIsT1RyYW5zaXRpb246Im9UcmFuc2l0aW9uRW5kIix0cmFuc2l0aW9uOiJ0cmFuc2l0aW9uZW5kIn19LGFuaW1hdGlvbjp7ZW5kOntXZWJraXRBbmltYXRpb246IndlYmtpdEFuaW1hdGlvbkVuZCIsTW96QW5pbWF0aW9uOiJhbmltYXRpb25lbmQiLE9BbmltYXRpb246Im9BbmltYXRpb25FbmQiLGFuaW1hdGlvbjoiYW5pbWF0aW9uZW5kIn19fSxqPXtjc3N0cmFuc2Zvcm1zOmZ1bmN0aW9uKCl7cmV0dXJuISFlKCJ0cmFuc2Zvcm0iKX0sY3NzdHJhbnNmb3JtczNkOmZ1bmN0aW9uKCl7cmV0dXJuISFlKCJwZXJzcGVjdGl2ZSIpfSxjc3N0cmFuc2l0aW9uczpmdW5jdGlvbigpe3JldHVybiEhZSgidHJhbnNpdGlvbiIpfSxjc3NhbmltYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuISFlKCJhbmltYXRpb24iKX19O2ouY3NzdHJhbnNpdGlvbnMoKSYmKGEuc3VwcG9ydC50cmFuc2l0aW9uPW5ldyBTdHJpbmcoZigidHJhbnNpdGlvbiIpKSxhLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQ9aS50cmFuc2l0aW9uLmVuZFthLnN1cHBvcnQudHJhbnNpdGlvbl0pLGouY3NzYW5pbWF0aW9ucygpJiYoYS5zdXBwb3J0LmFuaW1hdGlvbj1uZXcgU3RyaW5nKGYoImFuaW1hdGlvbiIpKSxhLnN1cHBvcnQuYW5pbWF0aW9uLmVuZD1pLmFuaW1hdGlvbi5lbmRbYS5zdXBwb3J0LmFuaW1hdGlvbl0pLGouY3NzdHJhbnNmb3JtcygpJiYoYS5zdXBwb3J0LnRyYW5zZm9ybT1uZXcgU3RyaW5nKGYoInRyYW5zZm9ybSIpKSxhLnN1cHBvcnQudHJhbnNmb3JtM2Q9ai5jc3N0cmFuc2Zvcm1zM2QoKSl9KHdpbmRvdy5aZXB0b3x8d2luZG93LmpRdWVyeSx3aW5kb3csZG9jdW1lbnQpO3ZhciB3aW5kb3dXaWR0aD13aW5kb3cuaW5uZXJXaWR0aDt2YXIgYmxvZ1Bvc3RNZXRhQXRCb3R0b209ITE7JChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXtwbGFjZUJsb2dQb3N0TWV0YSgpOyQod2luZG93KS5vbigncmVzaXplJyxmdW5jdGlvbigpe3dpbmRvd1dpZHRoPXdpbmRvdy5pbm5lcldpZHRoO3BsYWNlQmxvZ1Bvc3RNZXRhKCl9KX0pO2Z1bmN0aW9uIHBsYWNlQmxvZ1Bvc3RNZXRhKCl7dmFyIGJsb2dNZXRhQm94PSQoJyNibG9nLXBvc3QtbWV0YScpO2lmKGJsb2dNZXRhQm94Lmxlbmd0aD4wKXtpZih3aW5kb3dXaWR0aDw5OTIpe2lmKGJsb2dQb3N0TWV0YUF0Qm90dG9tPT09ITEpeyQoJyNibG9nLXBvc3QtbWV0YS1jb250YWluZXItbW9iaWxlJykuYXBwZW5kKGJsb2dNZXRhQm94KTtibG9nUG9zdE1ldGFBdEJvdHRvbT0hMH19ZWxzZXtpZihibG9nUG9zdE1ldGFBdEJvdHRvbT09PSEwKXskKCcjYmxvZy1wb3N0LW1ldGEtY29udGFpbmVyJykuYXBwZW5kKGJsb2dNZXRhQm94KTtibG9nUG9zdE1ldGFBdEJvdHRvbT0hMX19fX07JChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXt2YXIgcmVmYnk9JCgnaW5wdXRbbmFtZT1yZWZieV0nKTtpZihyZWZieS5sZW5ndGg+MCl7cmVmYnkudmFsKGRvY3VtZW50LnJlZmVycmVyKX19KTsoZnVuY3Rpb24oJCl7JC5mbG9hdFRoZWFkPSQuZmxvYXRUaGVhZHx8e307JC5mbG9hdFRoZWFkLmRlZmF1bHRzPXtoZWFkZXJDZWxsU2VsZWN0b3I6J3RyOnZpc2libGU6Zmlyc3Q+Kjp2aXNpYmxlJyx6SW5kZXg6MTAwMSxwb3NpdGlvbjonYXV0bycsdG9wOjAsYm90dG9tOjAsc2Nyb2xsQ29udGFpbmVyOmZ1bmN0aW9uKCR0YWJsZSl7cmV0dXJuICQoW10pfSxyZXNwb25zaXZlQ29udGFpbmVyOmZ1bmN0aW9uKCR0YWJsZSl7cmV0dXJuICQoW10pfSxnZXRTaXppbmdSb3c6ZnVuY3Rpb24oJHRhYmxlLCRjb2xzLCRmdGhDZWxscyl7cmV0dXJuICR0YWJsZS5maW5kKCd0Ym9keSB0cjp2aXNpYmxlOmZpcnN0Pio6dmlzaWJsZScpfSxmbG9hdFRhYmxlQ2xhc3M6J2Zsb2F0VGhlYWQtdGFibGUnLGZsb2F0V3JhcHBlckNsYXNzOidmbG9hdFRoZWFkLXdyYXBwZXInLGZsb2F0Q29udGFpbmVyQ2xhc3M6J2Zsb2F0VGhlYWQtY29udGFpbmVyJyxjb3B5VGFibGVDbGFzczohMCxlbmFibGVBcmlhOiExLGF1dG9SZWZsb3c6ITEsZGVidWc6ITEsc3VwcG9ydDp7Ym9vdHN0cmFwOiEwLGRhdGF0YWJsZXM6ITAsanF1ZXJ5VUk6ITAscGVyZmVjdFNjcm9sbGJhcjohMH19O3ZhciB1dGlsPXdpbmRvdy5fO3ZhciBjYW5PYnNlcnZlTXV0YXRpb25zPXR5cGVvZiBNdXRhdGlvbk9ic2VydmVyIT09J3VuZGVmaW5lZCc7dmFyIGllVmVyc2lvbj1mdW5jdGlvbigpe2Zvcih2YXIgYT0zLGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYiIpLGM9Yi5hbGx8fFtdO2E9MSthLGIuaW5uZXJIVE1MPSI8IS0tW2lmIGd0IElFICIrYSsiXT48aT48IVtlbmRpZl0tLT4iLGNbMF07KTtyZXR1cm4gNDxhP2E6ZG9jdW1lbnQuZG9jdW1lbnRNb2RlfSgpO3ZhciBpc0ZGPS9HZWNrb1wvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO3ZhciBpc1dlYmtpdD0vV2ViS2l0XC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoIShpZVZlcnNpb258fGlzRkZ8fGlzV2Via2l0KSl7aWVWZXJzaW9uPTExfQp2YXIgaXNUYWJsZVdpZHRoQnVnPWZ1bmN0aW9uKCl7aWYoaXNXZWJraXQpe3ZhciAkdGVzdD0kKCc8ZGl2IHN0eWxlPSJ3aWR0aDowcHgiPjx0YWJsZSBzdHlsZT0ibWF4LXdpZHRoOjEwMCUiPjx0cj48dGg+PGRpdiBzdHlsZT0ibWluLXdpZHRoOjEwMHB4OyI+WDwvZGl2PjwvdGg+PC90cj48L3RhYmxlPjwvZGl2PicpOyQoImJvZHkiKS5hcHBlbmQoJHRlc3QpO3ZhciByZXQ9KCR0ZXN0LmZpbmQoInRhYmxlIikud2lkdGgoKT09MCk7JHRlc3QucmVtb3ZlKCk7cmV0dXJuIHJldH0KcmV0dXJuITF9O3ZhciBjcmVhdGVFbGVtZW50cz0haXNGRiYmIWllVmVyc2lvbjt2YXIgJHdpbmRvdz0kKHdpbmRvdyk7aWYoIXdpbmRvdy5tYXRjaE1lZGlhKXt2YXIgX2JlZm9yZVByaW50PXdpbmRvdy5vbmJlZm9yZXByaW50O3ZhciBfYWZ0ZXJQcmludD13aW5kb3cub25hZnRlcnByaW50O3dpbmRvdy5vbmJlZm9yZXByaW50PWZ1bmN0aW9uKCl7X2JlZm9yZVByaW50JiZfYmVmb3JlUHJpbnQoKTskd2luZG93LnRyaWdnZXJIYW5kbGVyKCJiZWZvcmVwcmludCIpfTt3aW5kb3cub25hZnRlcnByaW50PWZ1bmN0aW9uKCl7X2FmdGVyUHJpbnQmJl9hZnRlclByaW50KCk7JHdpbmRvdy50cmlnZ2VySGFuZGxlcigiYWZ0ZXJwcmludCIpfX0KZnVuY3Rpb24gd2luZG93UmVzaXplKGV2ZW50TmFtZSxjYil7aWYoaWVWZXJzaW9uPT04KXt2YXIgd2luV2lkdGg9JHdpbmRvdy53aWR0aCgpO3ZhciBkZWJvdW5jZWRDYj11dGlsLmRlYm91bmNlKGZ1bmN0aW9uKCl7dmFyIHdpbldpZHRoTmV3PSR3aW5kb3cud2lkdGgoKTtpZih3aW5XaWR0aCE9d2luV2lkdGhOZXcpe3dpbldpZHRoPXdpbldpZHRoTmV3O2NiKCl9fSwxKTskd2luZG93Lm9uKGV2ZW50TmFtZSxkZWJvdW5jZWRDYil9ZWxzZXskd2luZG93Lm9uKGV2ZW50TmFtZSx1dGlsLmRlYm91bmNlKGNiLDEpKX19CmZ1bmN0aW9uIGdldENsb3Nlc3RTY3JvbGxDb250YWluZXIoJGVsZW0pe3ZhciBlbGVtPSRlbGVtWzBdO3ZhciBwYXJlbnQ9ZWxlbS5wYXJlbnRFbGVtZW50O2Rve3ZhciBwb3M9d2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdvdmVyZmxvdycpO2lmKHBvcyE9J3Zpc2libGUnKWJyZWFrfXdoaWxlKHBhcmVudD1wYXJlbnQucGFyZW50RWxlbWVudCk7aWYocGFyZW50PT1kb2N1bWVudC5ib2R5KXtyZXR1cm4gJChbXSl9CnJldHVybiAkKHBhcmVudCl9CmZ1bmN0aW9uIGRlYnVnKHN0cil7d2luZG93JiZ3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUuZXJyb3ImJndpbmRvdy5jb25zb2xlLmVycm9yKCJqUXVlcnkuZmxvYXRUaGVhZDogIitzdHIpfQpmdW5jdGlvbiBnZXRPZmZzZXRXaWR0aChlbCl7dmFyIHJlY3Q9ZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHJlY3Qud2lkdGh8fHJlY3QucmlnaHQtcmVjdC5sZWZ0fQpmdW5jdGlvbiBzY3JvbGxiYXJXaWR0aCgpe3ZhciAkZGl2PSQoJzxkaXYgc3R5bGU9IndpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3cteTpzY3JvbGw7JysncG9zaXRpb246YWJzb2x1dGU7dG9wOi0yMDBweDtsZWZ0Oi0yMDBweDsiPjxkaXYgc3R5bGU9ImhlaWdodDoxMDBweDt3aWR0aDoxMDAlIj4nKyc8L2Rpdj4nKTskKCdib2R5JykuYXBwZW5kKCRkaXYpO3ZhciB3MT0kZGl2LmlubmVyV2lkdGgoKTt2YXIgdzI9JCgnZGl2JywkZGl2KS5pbm5lcldpZHRoKCk7JGRpdi5yZW1vdmUoKTtyZXR1cm4gdzEtdzJ9CmZ1bmN0aW9uIGlzRGF0YXRhYmxlKCR0YWJsZSl7aWYoJHRhYmxlLmRhdGFUYWJsZVNldHRpbmdzKXtmb3IodmFyIGk9MDtpPCR0YWJsZS5kYXRhVGFibGVTZXR0aW5ncy5sZW5ndGg7aSsrKXt2YXIgdGFibGU9JHRhYmxlLmRhdGFUYWJsZVNldHRpbmdzW2ldLm5UYWJsZTtpZigkdGFibGVbMF09PXRhYmxlKXtyZXR1cm4hMH19fQpyZXR1cm4hMX0KZnVuY3Rpb24gdGFibGVXaWR0aCgkdGFibGUsJGZ0aENlbGxzLGlzT3V0ZXIpe3ZhciBmbj1pc091dGVyPyJvdXRlcldpZHRoIjoid2lkdGgiO2lmKGlzVGFibGVXaWR0aEJ1ZyYmJHRhYmxlLmNzcygibWF4LXdpZHRoIikpe3ZhciB3PTA7aWYoaXNPdXRlcil7dys9cGFyc2VJbnQoJHRhYmxlLmNzcygiYm9yZGVyTGVmdCIpLDEwKTt3Kz1wYXJzZUludCgkdGFibGUuY3NzKCJib3JkZXJSaWdodCIpLDEwKX0KZm9yKHZhciBpPTA7aTwkZnRoQ2VsbHMubGVuZ3RoO2krKyl7dys9JGZ0aENlbGxzLmdldChpKS5vZmZzZXRXaWR0aH0KcmV0dXJuIHd9ZWxzZXtyZXR1cm4gJHRhYmxlW2ZuXSgpfX0KJC5mbi5mbG9hdFRoZWFkPWZ1bmN0aW9uKG1hcCl7bWFwPW1hcHx8e307aWYoIXV0aWwpe3V0aWw9d2luZG93Ll98fCQuZmxvYXRUaGVhZC5fO2lmKCF1dGlsKXt0aHJvdyBuZXcgRXJyb3IoImpxdWVyeS5mbG9hdFRoZWFkLXNsaW0uanMgcmVxdWlyZXMgdW5kZXJzY29yZS4gWW91IHNob3VsZCB1c2UgdGhlIG5vbi1saXRlIHZlcnNpb24gc2luY2UgeW91IGRvIG5vdCBoYXZlIHVuZGVyc2NvcmUuIil9fQppZihpZVZlcnNpb248OCl7cmV0dXJuIHRoaXN9CnZhciBtT2JzPW51bGw7aWYodXRpbC5pc0Z1bmN0aW9uKGlzVGFibGVXaWR0aEJ1Zykpe2lzVGFibGVXaWR0aEJ1Zz1pc1RhYmxlV2lkdGhCdWcoKX0KaWYodXRpbC5pc1N0cmluZyhtYXApKXt2YXIgY29tbWFuZD1tYXA7dmFyIHJldD10aGlzO3RoaXMuZmlsdGVyKCd0YWJsZScpLmVhY2goZnVuY3Rpb24oKXt2YXIgJHRoaXM9JCh0aGlzKTt2YXIgb3B0cz0kdGhpcy5kYXRhKCdmbG9hdFRoZWFkLWxhenknKTtpZihvcHRzKXskdGhpcy5mbG9hdFRoZWFkKG9wdHMpfQp2YXIgb2JqPSR0aGlzLmRhdGEoJ2Zsb2F0VGhlYWQtYXR0YWNoZWQnKTtpZihvYmomJnV0aWwuaXNGdW5jdGlvbihvYmpbY29tbWFuZF0pKXt2YXIgcj1vYmpbY29tbWFuZF0oKTtpZih0eXBlb2YgciE9PSd1bmRlZmluZWQnKXtyZXQ9cn19fSk7cmV0dXJuIHJldH0KdmFyIG9wdHM9JC5leHRlbmQoe30sJC5mbG9hdFRoZWFkLmRlZmF1bHRzfHx7fSxtYXApOyQuZWFjaChtYXAsZnVuY3Rpb24oa2V5LHZhbCl7aWYoKCEoa2V5IGluICQuZmxvYXRUaGVhZC5kZWZhdWx0cykpJiZvcHRzLmRlYnVnKXtkZWJ1ZygiVXNlZCBbIitrZXkrIl0ga2V5IHRvIGluaXQgcGx1Z2luLCBidXQgdGhhdCBwYXJhbSBpcyBub3QgYW4gb3B0aW9uIGZvciB0aGUgcGx1Z2luLiBWYWxpZCBvcHRpb25zIGFyZTogIisodXRpbC5rZXlzKCQuZmxvYXRUaGVhZC5kZWZhdWx0cykpLmpvaW4oJywgJykpfX0pO2lmKG9wdHMuZGVidWcpe3ZhciB2PSQuZm4uanF1ZXJ5LnNwbGl0KCIuIik7aWYocGFyc2VJbnQodlswXSwxMCk9PTEmJnBhcnNlSW50KHZbMV0sMTApPD03KXtkZWJ1ZygialF1ZXJ5IHZlcnNpb24gIiskLmZuLmpxdWVyeSsiIGRldGVjdGVkISBUaGlzIHBsdWdpbiBzdXBwb3J0cyAxLjggb3IgYmV0dGVyLCBvciAxLjcueCB3aXRoIGpRdWVyeSBVSSAxLjguMjQgLT4gaHR0cDovL2pxdWVyeXVpLmNvbS9yZXNvdXJjZXMvZG93bmxvYWQvanF1ZXJ5LXVpLTEuOC4yNC56aXAiKX19CnRoaXMuZmlsdGVyKCc6bm90KC4nK29wdHMuZmxvYXRUYWJsZUNsYXNzKycpJykuZWFjaChmdW5jdGlvbigpe3ZhciBmbG9hdFRoZWFkSWQ9dXRpbC51bmlxdWVJZCgpO3ZhciAkdGFibGU9JCh0aGlzKTtpZigkdGFibGUuZGF0YSgnZmxvYXRUaGVhZC1hdHRhY2hlZCcpKXtyZXR1cm4hMH0KaWYoISR0YWJsZS5pcygndGFibGUnKSl7dGhyb3cgbmV3IEVycm9yKCdqUXVlcnkuZmxvYXRUaGVhZCBtdXN0IGJlIHJ1biBvbiBhIHRhYmxlIGVsZW1lbnQuIGV4OiAkKCJ0YWJsZSIpLmZsb2F0VGhlYWQoKTsnKX0KY2FuT2JzZXJ2ZU11dGF0aW9ucz1vcHRzLmF1dG9SZWZsb3cmJmNhbk9ic2VydmVNdXRhdGlvbnM7dmFyICRoZWFkZXI9JHRhYmxlLmNoaWxkcmVuKCd0aGVhZDpmaXJzdCcpO3ZhciAkdGJvZHk9JHRhYmxlLmNoaWxkcmVuKCd0Ym9keTpmaXJzdCcpO2lmKCRoZWFkZXIubGVuZ3RoPT0wfHwkdGJvZHkubGVuZ3RoPT0wKXskdGFibGUuZGF0YSgnZmxvYXRUaGVhZC1sYXp5JyxvcHRzKTskdGFibGUudW5iaW5kKCJyZWZsb3ciKS5vbmUoJ3JlZmxvdycsZnVuY3Rpb24oKXskdGFibGUuZmxvYXRUaGVhZChvcHRzKX0pO3JldHVybn0KaWYoJHRhYmxlLmRhdGEoJ2Zsb2F0VGhlYWQtbGF6eScpKXskdGFibGUudW5iaW5kKCJyZWZsb3ciKX0KJHRhYmxlLmRhdGEoJ2Zsb2F0VGhlYWQtbGF6eScsITEpO3ZhciBoZWFkZXJGbG9hdGVkPSEwO3ZhciBzY3JvbGxpbmdUb3Asc2Nyb2xsaW5nQm90dG9tO3ZhciBzY3JvbGxiYXJPZmZzZXQ9e3ZlcnRpY2FsOjAsaG9yaXpvbnRhbDowfTt2YXIgc2NXaWR0aD1zY3JvbGxiYXJXaWR0aCgpO3ZhciBsYXN0Q29sdW1uQ291bnQ9MDtpZihvcHRzLnNjcm9sbENvbnRhaW5lcj09PSEwKXtvcHRzLnNjcm9sbENvbnRhaW5lcj1nZXRDbG9zZXN0U2Nyb2xsQ29udGFpbmVyfQp2YXIgJHNjcm9sbENvbnRhaW5lcj1vcHRzLnNjcm9sbENvbnRhaW5lcigkdGFibGUpfHwkKFtdKTt2YXIgbG9ja2VkPSRzY3JvbGxDb250YWluZXIubGVuZ3RoPjA7dmFyICRyZXNwb25zaXZlQ29udGFpbmVyPWxvY2tlZD8kKFtdKTpvcHRzLnJlc3BvbnNpdmVDb250YWluZXIoJHRhYmxlKXx8JChbXSk7dmFyIHJlc3BvbnNpdmU9aXNSZXNwb25zaXZlQ29udGFpbmVyQWN0aXZlKCk7dmFyIHVzZUFic29sdXRlUG9zaXRpb25pbmc9bnVsbDtpZih0eXBlb2Ygb3B0cy51c2VBYnNvbHV0ZVBvc2l0aW9uaW5nIT09J3VuZGVmaW5lZCcpe29wdHMucG9zaXRpb249J2F1dG8nO2lmKG9wdHMudXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7b3B0cy5wb3NpdGlvbj1vcHRzLnVzZUFic29sdXRlUG9zaXRpb25pbmc/J2Fic29sdXRlJzonZml4ZWQnfQpkZWJ1Zygib3B0aW9uICd1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nJyBoYXMgYmVlbiByZW1vdmVkIGluIHYxLjMuMCwgdXNlIGBwb3NpdGlvbjonIitvcHRzLnBvc2l0aW9uKyInYCBpbnN0ZWFkLiBTZWUgZG9jcyBmb3IgbW9yZSBpbmZvOiBodHRwOi8vbWtvcnlhay5naXRodWIuaW8vZmxvYXRUaGVhZC8jb3B0aW9ucyIpfQppZih0eXBlb2Ygb3B0cy5zY3JvbGxpbmdUb3AhPT0ndW5kZWZpbmVkJyl7b3B0cy50b3A9b3B0cy5zY3JvbGxpbmdUb3A7ZGVidWcoIm9wdGlvbiAnc2Nyb2xsaW5nVG9wJyBoYXMgYmVlbiByZW5hbWVkIHRvICd0b3AnIGluIHYxLjMuMC4gU2VlIGRvY3MgZm9yIG1vcmUgaW5mbzogaHR0cDovL21rb3J5YWsuZ2l0aHViLmlvL2Zsb2F0VGhlYWQvI29wdGlvbnMiKX0KaWYodHlwZW9mIG9wdHMuc2Nyb2xsaW5nQm90dG9tIT09J3VuZGVmaW5lZCcpe29wdHMuYm90dG9tPW9wdHMuc2Nyb2xsaW5nQm90dG9tO2RlYnVnKCJvcHRpb24gJ3Njcm9sbGluZ0JvdHRvbScgaGFzIGJlZW4gcmVuYW1lZCB0byAnYm90dG9tJyBpbiB2MS4zLjAuIFNlZSBkb2NzIGZvciBtb3JlIGluZm86IGh0dHA6Ly9ta29yeWFrLmdpdGh1Yi5pby9mbG9hdFRoZWFkLyNvcHRpb25zIil9CmlmKG9wdHMucG9zaXRpb249PSdhdXRvJyl7dXNlQWJzb2x1dGVQb3NpdGlvbmluZz1udWxsfWVsc2UgaWYob3B0cy5wb3NpdGlvbj09J2ZpeGVkJyl7dXNlQWJzb2x1dGVQb3NpdGlvbmluZz0hMX1lbHNlIGlmKG9wdHMucG9zaXRpb249PSdhYnNvbHV0ZScpe3VzZUFic29sdXRlUG9zaXRpb25pbmc9ITB9ZWxzZSBpZihvcHRzLmRlYnVnKXtkZWJ1ZygnSW52YWxpZCB2YWx1ZSBnaXZlbiB0byAicG9zaXRpb24iIG9wdGlvbiwgdmFsaWQgaXMgImZpeGVkIiwgImFic29sdXRlIiBhbmQgImF1dG8iLiBZb3UgcGFzc2VkOiAnLG9wdHMucG9zaXRpb24pfQppZih1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nPT1udWxsKXt1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nPWxvY2tlZH0KdmFyICRjYXB0aW9uPSR0YWJsZS5maW5kKCJjYXB0aW9uIik7dmFyIGhhdmVDYXB0aW9uPSRjYXB0aW9uLmxlbmd0aD09MTtpZihoYXZlQ2FwdGlvbil7dmFyIGNhcHRpb25BbGlnblRvcD0oJGNhcHRpb24uY3NzKCJjYXB0aW9uLXNpZGUiKXx8JGNhcHRpb24uYXR0cigiYWxpZ24iKXx8InRvcCIpPT09InRvcCJ9CnZhciAkZnRoR3JwPSQoJzxmdGhmb290IHN0eWxlPSJkaXNwbGF5OnRhYmxlLWZvb3Rlci1ncm91cDtib3JkZXItc3BhY2luZzowO2hlaWdodDowO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTt2aXNpYmlsaXR5OmhpZGRlbiIvPicpO3ZhciB3cmFwcGVkQ29udGFpbmVyPSExO3ZhciAkd3JhcHBlcj0kKFtdKTt2YXIgYWJzb2x1dGVUb0ZpeGVkT25TY3JvbGw9aWVWZXJzaW9uPD05JiYhbG9ja2VkJiZ1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nO3ZhciAkZmxvYXRUYWJsZT0kKCI8dGFibGUvPiIpO3ZhciAkZmxvYXRDb2xHcm91cD0kKCI8Y29sZ3JvdXAvPiIpO3ZhciAkdGFibGVDb2xHcm91cD0kdGFibGUuY2hpbGRyZW4oJ2NvbGdyb3VwOmZpcnN0Jyk7dmFyIGV4aXN0aW5nQ29sR3JvdXA9ITA7aWYoJHRhYmxlQ29sR3JvdXAubGVuZ3RoPT0wKXskdGFibGVDb2xHcm91cD0kKCI8Y29sZ3JvdXAvPiIpO2V4aXN0aW5nQ29sR3JvdXA9ITF9CnZhciAkZnRoUm93PSQoJzxmdGh0ciBzdHlsZT0iZGlzcGxheTp0YWJsZS1yb3c7Ym9yZGVyLXNwYWNpbmc6MDtoZWlnaHQ6MDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2UiLz4nKTt2YXIgJGZsb2F0Q29udGFpbmVyPSQoJzxkaXYgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW47IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9kaXY+Jyk7dmFyIGZsb2F0VGFibGVIaWRkZW49ITE7dmFyICRuZXdIZWFkZXI9JCgiPHRoZWFkLz4iKTt2YXIgJHNpemVyUm93PSQoJzx0ciBjbGFzcz0ic2l6ZS1yb3ciLz4nKTt2YXIgJHNpemVyQ2VsbHM9JChbXSk7dmFyICR0YWJsZUNlbGxzPSQoW10pO3ZhciAkaGVhZGVyQ2VsbHM9JChbXSk7dmFyICRmdGhDZWxscz0kKFtdKTskbmV3SGVhZGVyLmFwcGVuZCgkc2l6ZXJSb3cpOyR0YWJsZS5wcmVwZW5kKCR0YWJsZUNvbEdyb3VwKTtpZihjcmVhdGVFbGVtZW50cyl7JGZ0aEdycC5hcHBlbmQoJGZ0aFJvdyk7JHRhYmxlLmFwcGVuZCgkZnRoR3JwKX0KJGZsb2F0VGFibGUuYXBwZW5kKCRmbG9hdENvbEdyb3VwKTskZmxvYXRDb250YWluZXIuYXBwZW5kKCRmbG9hdFRhYmxlKTtpZihvcHRzLmNvcHlUYWJsZUNsYXNzKXskZmxvYXRUYWJsZS5hdHRyKCdjbGFzcycsJHRhYmxlLmF0dHIoJ2NsYXNzJykpfQokZmxvYXRUYWJsZS5hdHRyKHsnY2VsbHBhZGRpbmcnOiR0YWJsZS5hdHRyKCdjZWxscGFkZGluZycpLCdjZWxsc3BhY2luZyc6JHRhYmxlLmF0dHIoJ2NlbGxzcGFjaW5nJyksJ2JvcmRlcic6JHRhYmxlLmF0dHIoJ2JvcmRlcicpfSk7dmFyIHRhYmxlRGlzcGxheUNzcz0kdGFibGUuY3NzKCdkaXNwbGF5Jyk7JGZsb2F0VGFibGUuY3NzKHsnYm9yZGVyQ29sbGFwc2UnOiR0YWJsZS5jc3MoJ2JvcmRlckNvbGxhcHNlJyksJ2JvcmRlcic6JHRhYmxlLmNzcygnYm9yZGVyJyksJ2Rpc3BsYXknOnRhYmxlRGlzcGxheUNzc30pO2lmKCFsb2NrZWQpeyRmbG9hdFRhYmxlLmNzcygnd2lkdGgnLCdhdXRvJyl9CmlmKHRhYmxlRGlzcGxheUNzcz09J25vbmUnKXtmbG9hdFRhYmxlSGlkZGVuPSEwfQokZmxvYXRUYWJsZS5hZGRDbGFzcyhvcHRzLmZsb2F0VGFibGVDbGFzcykuY3NzKHsnbWFyZ2luJzowLCdib3JkZXItYm90dG9tLXdpZHRoJzowfSk7aWYodXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7dmFyIG1ha2VSZWxhdGl2ZT1mdW5jdGlvbigkY29udGFpbmVyLGFsd2F5c1dyYXApe3ZhciBwb3NpdGlvbkNzcz0kY29udGFpbmVyLmNzcygncG9zaXRpb24nKTt2YXIgcmVsYXRpdmVUb1Njcm9sbENvbnRhaW5lcj0ocG9zaXRpb25Dc3M9PSJyZWxhdGl2ZSJ8fHBvc2l0aW9uQ3NzPT0iYWJzb2x1dGUiKTt2YXIgJGNvbnRhaW5lcldyYXA9JGNvbnRhaW5lcjtpZighcmVsYXRpdmVUb1Njcm9sbENvbnRhaW5lcnx8YWx3YXlzV3JhcCl7dmFyIGNzcz17InBhZGRpbmdMZWZ0IjokY29udGFpbmVyLmNzcygncGFkZGluZ0xlZnQnKSwicGFkZGluZ1JpZ2h0IjokY29udGFpbmVyLmNzcygncGFkZGluZ1JpZ2h0Jyl9OyRmbG9hdENvbnRhaW5lci5jc3MoY3NzKTskY29udGFpbmVyV3JhcD0kY29udGFpbmVyLmRhdGEoJ2Zsb2F0VGhlYWQtY29udGFpbmVyV3JhcCcpfHwkY29udGFpbmVyLndyYXAoIjxkaXYgY2xhc3M9JyIrb3B0cy5mbG9hdFdyYXBwZXJDbGFzcysiJyBzdHlsZT0ncG9zaXRpb246IHJlbGF0aXZlOyBjbGVhcjpib3RoOyc+PC9kaXY+IikucGFyZW50KCk7JGNvbnRhaW5lci5kYXRhKCdmbG9hdFRoZWFkLWNvbnRhaW5lcldyYXAnLCRjb250YWluZXJXcmFwKTt3cmFwcGVkQ29udGFpbmVyPSEwfQpyZXR1cm4gJGNvbnRhaW5lcldyYXB9O2lmKGxvY2tlZCl7JHdyYXBwZXI9bWFrZVJlbGF0aXZlKCRzY3JvbGxDb250YWluZXIsITApOyR3cmFwcGVyLnByZXBlbmQoJGZsb2F0Q29udGFpbmVyKX1lbHNleyR3cmFwcGVyPW1ha2VSZWxhdGl2ZSgkdGFibGUpOyR0YWJsZS5iZWZvcmUoJGZsb2F0Q29udGFpbmVyKX19ZWxzZXskdGFibGUuYmVmb3JlKCRmbG9hdENvbnRhaW5lcil9CiRmbG9hdENvbnRhaW5lci5jc3Moe3Bvc2l0aW9uOnVzZUFic29sdXRlUG9zaXRpb25pbmc/J2Fic29sdXRlJzonZml4ZWQnLG1hcmdpblRvcDowLHRvcDp1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nPzA6J2F1dG8nLHpJbmRleDpvcHRzLnpJbmRleH0pOyRmbG9hdENvbnRhaW5lci5hZGRDbGFzcyhvcHRzLmZsb2F0Q29udGFpbmVyQ2xhc3MpO3VwZGF0ZVNjcm9sbGluZ09mZnNldHMoKTt2YXIgbGF5b3V0Rml4ZWQ9eyd0YWJsZS1sYXlvdXQnOidmaXhlZCd9O3ZhciBsYXlvdXRBdXRvPXsndGFibGUtbGF5b3V0JzokdGFibGUuY3NzKCd0YWJsZUxheW91dCcpfHwnYXV0byd9O3ZhciBvcmlnaW5hbFRhYmxlV2lkdGg9JHRhYmxlWzBdLnN0eWxlLndpZHRofHwiIjt2YXIgb3JpZ2luYWxUYWJsZU1pbldpZHRoPSR0YWJsZS5jc3MoJ21pbldpZHRoJyl8fCIiO2Z1bmN0aW9uIGV2ZW50TmFtZShuYW1lKXtyZXR1cm4gbmFtZSsnLmZ0aC0nK2Zsb2F0VGhlYWRJZCsnLmZsb2F0VEhlYWQnfQpmdW5jdGlvbiBzZXRIZWFkZXJIZWlnaHQoKXt2YXIgaGVhZGVySGVpZ2h0PTA7JGhlYWRlci5jaGlsZHJlbigidHI6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24oKXtoZWFkZXJIZWlnaHQrPSQodGhpcykub3V0ZXJIZWlnaHQoITApfSk7aWYoJHRhYmxlLmNzcygnYm9yZGVyLWNvbGxhcHNlJyk9PSdjb2xsYXBzZScpe3ZhciB0YWJsZUJvcmRlclRvcEhlaWdodD1wYXJzZUludCgkdGFibGUuY3NzKCdib3JkZXItdG9wLXdpZHRoJyksMTApO3ZhciBjZWxsQm9yZGVyVG9wSGVpZ2h0PXBhcnNlSW50KCR0YWJsZS5maW5kKCJ0aGVhZCB0cjpmaXJzdCIpLmZpbmQoIj4qOmZpcnN0IikuY3NzKCdib3JkZXItdG9wLXdpZHRoJyksMTApO2lmKHRhYmxlQm9yZGVyVG9wSGVpZ2h0PmNlbGxCb3JkZXJUb3BIZWlnaHQpe2hlYWRlckhlaWdodC09KHRhYmxlQm9yZGVyVG9wSGVpZ2h0LzIpfX0KJHNpemVyUm93Lm91dGVySGVpZ2h0KGhlYWRlckhlaWdodCk7JHNpemVyQ2VsbHMub3V0ZXJIZWlnaHQoaGVhZGVySGVpZ2h0KX0KZnVuY3Rpb24gc2V0RmxvYXRXaWR0aCgpe3ZhciB0dz10YWJsZVdpZHRoKCR0YWJsZSwkZnRoQ2VsbHMsITApO3ZhciAkY29udGFpbmVyPXJlc3BvbnNpdmU/JHJlc3BvbnNpdmVDb250YWluZXI6JHNjcm9sbENvbnRhaW5lcjt2YXIgd2lkdGg9JGNvbnRhaW5lci53aWR0aCgpfHx0dzt2YXIgZmxvYXRDb250YWluZXJXaWR0aD0kY29udGFpbmVyLmNzcygib3ZlcmZsb3cteSIpIT0naGlkZGVuJz93aWR0aC1zY3JvbGxiYXJPZmZzZXQudmVydGljYWw6d2lkdGg7JGZsb2F0Q29udGFpbmVyLndpZHRoKGZsb2F0Q29udGFpbmVyV2lkdGgpO2lmKGxvY2tlZCl7dmFyIHBlcmNlbnQ9MTAwKnR3LyhmbG9hdENvbnRhaW5lcldpZHRoKTskZmxvYXRUYWJsZS5jc3MoJ3dpZHRoJyxwZXJjZW50KyclJyl9ZWxzZXskZmxvYXRUYWJsZS5vdXRlcldpZHRoKHR3KX19CmZ1bmN0aW9uIHVwZGF0ZVNjcm9sbGluZ09mZnNldHMoKXtzY3JvbGxpbmdUb3A9KHV0aWwuaXNGdW5jdGlvbihvcHRzLnRvcCk/b3B0cy50b3AoJHRhYmxlKTpvcHRzLnRvcCl8fDA7c2Nyb2xsaW5nQm90dG9tPSh1dGlsLmlzRnVuY3Rpb24ob3B0cy5ib3R0b20pP29wdHMuYm90dG9tKCR0YWJsZSk6b3B0cy5ib3R0b20pfHwwfQpmdW5jdGlvbiBjb2x1bW5OdW0oKXt2YXIgY291bnQ7dmFyICRoZWFkZXJDb2x1bW5zPSRoZWFkZXIuZmluZChvcHRzLmhlYWRlckNlbGxTZWxlY3Rvcik7aWYoZXhpc3RpbmdDb2xHcm91cCl7Y291bnQ9JHRhYmxlQ29sR3JvdXAuZmluZCgnY29sJykubGVuZ3RofWVsc2V7Y291bnQ9MDskaGVhZGVyQ29sdW1ucy5lYWNoKGZ1bmN0aW9uKCl7Y291bnQrPXBhcnNlSW50KCgkKHRoaXMpLmF0dHIoJ2NvbHNwYW4nKXx8MSksMTApfSl9CmlmKGNvdW50IT1sYXN0Q29sdW1uQ291bnQpe2xhc3RDb2x1bW5Db3VudD1jb3VudDt2YXIgY2VsbHM9W10sY29scz1bXSxwc3VlZG89W10sY29udGVudDtmb3IodmFyIHg9MDt4PGNvdW50O3grKyl7aWYob3B0cy5lbmFibGVBcmlhJiYoY29udGVudD0kaGVhZGVyQ29sdW1ucy5lcSh4KS50ZXh0KCkpKXtjZWxscy5wdXNoKCc8dGggc2NvcGU9ImNvbCIgY2xhc3M9ImZsb2F0VGhlYWQtY29sIj4nK2NvbnRlbnQrJzwvdGg+Jyl9ZWxzZXtjZWxscy5wdXNoKCc8dGggY2xhc3M9ImZsb2F0VGhlYWQtY29sIi8+Jyl9CmNvbHMucHVzaCgnPGNvbC8+Jyk7cHN1ZWRvLnB1c2goIjxmdGh0ZCBzdHlsZT0nZGlzcGxheTp0YWJsZS1jZWxsO2hlaWdodDowO3dpZHRoOmF1dG87Jy8+Iil9CmNvbHM9Y29scy5qb2luKCcnKTtjZWxscz1jZWxscy5qb2luKCcnKTtpZihjcmVhdGVFbGVtZW50cyl7cHN1ZWRvPXBzdWVkby5qb2luKCcnKTskZnRoUm93Lmh0bWwocHN1ZWRvKTskZnRoQ2VsbHM9JGZ0aFJvdy5maW5kKCdmdGh0ZCcpfQokc2l6ZXJSb3cuaHRtbChjZWxscyk7JHNpemVyQ2VsbHM9JHNpemVyUm93LmZpbmQoInRoIik7aWYoIWV4aXN0aW5nQ29sR3JvdXApeyR0YWJsZUNvbEdyb3VwLmh0bWwoY29scyl9CiR0YWJsZUNlbGxzPSR0YWJsZUNvbEdyb3VwLmZpbmQoJ2NvbCcpOyRmbG9hdENvbEdyb3VwLmh0bWwoY29scyk7JGhlYWRlckNlbGxzPSRmbG9hdENvbEdyb3VwLmZpbmQoImNvbCIpfQpyZXR1cm4gY291bnR9CmZ1bmN0aW9uIHJlZmxvYXQoKXtpZighaGVhZGVyRmxvYXRlZCl7aGVhZGVyRmxvYXRlZD0hMDtpZih1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nKXt2YXIgdHc9dGFibGVXaWR0aCgkdGFibGUsJGZ0aENlbGxzLCEwKTt2YXIgd3JhcHBlcldpZHRoPSR3cmFwcGVyLndpZHRoKCk7aWYodHc+d3JhcHBlcldpZHRoKXskdGFibGUuY3NzKCdtaW5XaWR0aCcsdHcpfX0KJHRhYmxlLmNzcyhsYXlvdXRGaXhlZCk7JGZsb2F0VGFibGUuY3NzKGxheW91dEZpeGVkKTskZmxvYXRUYWJsZS5hcHBlbmQoJGhlYWRlcik7JHRib2R5LmJlZm9yZSgkbmV3SGVhZGVyKTtzZXRIZWFkZXJIZWlnaHQoKX19CmZ1bmN0aW9uIHVuZmxvYXQoKXtpZihoZWFkZXJGbG9hdGVkKXtoZWFkZXJGbG9hdGVkPSExO2lmKHVzZUFic29sdXRlUG9zaXRpb25pbmcpeyR0YWJsZS53aWR0aChvcmlnaW5hbFRhYmxlV2lkdGgpfQokbmV3SGVhZGVyLmRldGFjaCgpOyR0YWJsZS5wcmVwZW5kKCRoZWFkZXIpOyR0YWJsZS5jc3MobGF5b3V0QXV0byk7JGZsb2F0VGFibGUuY3NzKGxheW91dEF1dG8pOyR0YWJsZS5jc3MoJ21pbldpZHRoJyxvcmlnaW5hbFRhYmxlTWluV2lkdGgpOyR0YWJsZS5jc3MoJ21pbldpZHRoJyx0YWJsZVdpZHRoKCR0YWJsZSwkZnRoQ2VsbHMpKX19CnZhciBpc0hlYWRlckZsb2F0aW5nTG9naWNhbD0hMTtmdW5jdGlvbiB0cmlnZ2VyRmxvYXRFdmVudChpc0Zsb2F0aW5nKXtpZihpc0hlYWRlckZsb2F0aW5nTG9naWNhbCE9aXNGbG9hdGluZyl7aXNIZWFkZXJGbG9hdGluZ0xvZ2ljYWw9aXNGbG9hdGluZzskdGFibGUudHJpZ2dlckhhbmRsZXIoImZsb2F0VGhlYWQiLFtpc0Zsb2F0aW5nLCRmbG9hdENvbnRhaW5lcl0pfX0KZnVuY3Rpb24gY2hhbmdlUG9zaXRpb25pbmcoaXNBYnNvbHV0ZSl7aWYodXNlQWJzb2x1dGVQb3NpdGlvbmluZyE9aXNBYnNvbHV0ZSl7dXNlQWJzb2x1dGVQb3NpdGlvbmluZz1pc0Fic29sdXRlOyRmbG9hdENvbnRhaW5lci5jc3Moe3Bvc2l0aW9uOnVzZUFic29sdXRlUG9zaXRpb25pbmc/J2Fic29sdXRlJzonZml4ZWQnfSl9fQpmdW5jdGlvbiBnZXRTaXppbmdSb3coJHRhYmxlLCRjb2xzLCRmdGhDZWxscyxpZVZlcnNpb24pe2lmKGNyZWF0ZUVsZW1lbnRzKXtyZXR1cm4gJGZ0aENlbGxzfWVsc2UgaWYoaWVWZXJzaW9uKXtyZXR1cm4gb3B0cy5nZXRTaXppbmdSb3coJHRhYmxlLCRjb2xzLCRmdGhDZWxscyl9ZWxzZXtyZXR1cm4gJGNvbHN9fQpmdW5jdGlvbiByZWZsb3coKXt2YXIgaTt2YXIgbnVtQ29scz1jb2x1bW5OdW0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgc2Nyb2xsTGVmdD0kZmxvYXRDb250YWluZXIuc2Nyb2xsTGVmdCgpOyR0YWJsZUNlbGxzPSR0YWJsZUNvbEdyb3VwLmZpbmQoJ2NvbCcpO3ZhciAkcm93Q2VsbHM9Z2V0U2l6aW5nUm93KCR0YWJsZSwkdGFibGVDZWxscywkZnRoQ2VsbHMsaWVWZXJzaW9uKTtpZigkcm93Q2VsbHMubGVuZ3RoPT1udW1Db2xzJiZudW1Db2xzPjApe2lmKCFleGlzdGluZ0NvbEdyb3VwKXtmb3IoaT0wO2k8bnVtQ29scztpKyspeyR0YWJsZUNlbGxzLmVxKGkpLmNzcygnd2lkdGgnLCcnKX19CnVuZmxvYXQoKTt2YXIgd2lkdGhzPVtdO2ZvcihpPTA7aTxudW1Db2xzO2krKyl7d2lkdGhzW2ldPWdldE9mZnNldFdpZHRoKCRyb3dDZWxscy5nZXQoaSkpfQpmb3IoaT0wO2k8bnVtQ29scztpKyspeyRoZWFkZXJDZWxscy5lcShpKS53aWR0aCh3aWR0aHNbaV0pOyR0YWJsZUNlbGxzLmVxKGkpLndpZHRoKHdpZHRoc1tpXSl9CnJlZmxvYXQoKX1lbHNleyRmbG9hdFRhYmxlLmFwcGVuZCgkaGVhZGVyKTskdGFibGUuY3NzKGxheW91dEF1dG8pOyRmbG9hdFRhYmxlLmNzcyhsYXlvdXRBdXRvKTtzZXRIZWFkZXJIZWlnaHQoKX0KJGZsb2F0Q29udGFpbmVyLnNjcm9sbExlZnQoc2Nyb2xsTGVmdCk7JHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJyZWZsb3dlZCIsWyRmbG9hdENvbnRhaW5lcl0pfX0KZnVuY3Rpb24gZmxvYXRDb250YWluZXJCb3JkZXJXaWR0aChzaWRlKXt2YXIgYm9yZGVyPSRzY3JvbGxDb250YWluZXIuY3NzKCJib3JkZXItIitzaWRlKyItd2lkdGgiKTt2YXIgdz0wO2lmKGJvcmRlciYmfmJvcmRlci5pbmRleE9mKCdweCcpKXt3PXBhcnNlSW50KGJvcmRlciwxMCl9CnJldHVybiB3fQpmdW5jdGlvbiBpc1Jlc3BvbnNpdmVDb250YWluZXJBY3RpdmUoKXtyZXR1cm4gJHJlc3BvbnNpdmVDb250YWluZXIuY3NzKCJvdmVyZmxvdy14Iik9PSdhdXRvJ30KZnVuY3Rpb24gY2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3NGbigpe3ZhciBzY3JvbGxpbmdDb250YWluZXJUb3A9JHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AoKTt2YXIgZmxvYXRFbmQ7dmFyIHRhYmxlQ29udGFpbmVyR2FwPTA7dmFyIGNhcHRpb25IZWlnaHQ9aGF2ZUNhcHRpb24/JGNhcHRpb24ub3V0ZXJIZWlnaHQoITApOjA7dmFyIGNhcHRpb25TY3JvbGxPZmZzZXQ9Y2FwdGlvbkFsaWduVG9wP2NhcHRpb25IZWlnaHQ6LWNhcHRpb25IZWlnaHQ7dmFyIGZsb2F0Q29udGFpbmVySGVpZ2h0PSRmbG9hdENvbnRhaW5lci5oZWlnaHQoKTt2YXIgdGFibGVPZmZzZXQ9JHRhYmxlLm9mZnNldCgpO3ZhciB0YWJsZUxlZnRHYXA9MDt2YXIgdGFibGVUb3BHYXA9MDtpZihsb2NrZWQpe3ZhciBjb250YWluZXJPZmZzZXQ9JHNjcm9sbENvbnRhaW5lci5vZmZzZXQoKTt0YWJsZUNvbnRhaW5lckdhcD10YWJsZU9mZnNldC50b3AtY29udGFpbmVyT2Zmc2V0LnRvcCtzY3JvbGxpbmdDb250YWluZXJUb3A7aWYoaGF2ZUNhcHRpb24mJmNhcHRpb25BbGlnblRvcCl7dGFibGVDb250YWluZXJHYXArPWNhcHRpb25IZWlnaHR9CnRhYmxlTGVmdEdhcD1mbG9hdENvbnRhaW5lckJvcmRlcldpZHRoKCdsZWZ0Jyk7dGFibGVUb3BHYXA9ZmxvYXRDb250YWluZXJCb3JkZXJXaWR0aCgndG9wJyk7dGFibGVDb250YWluZXJHYXAtPXRhYmxlVG9wR2FwfWVsc2V7ZmxvYXRFbmQ9dGFibGVPZmZzZXQudG9wLXNjcm9sbGluZ1RvcC1mbG9hdENvbnRhaW5lckhlaWdodCtzY3JvbGxpbmdCb3R0b20rc2Nyb2xsYmFyT2Zmc2V0Lmhvcml6b250YWx9CnZhciB3aW5kb3dUb3A9JHdpbmRvdy5zY3JvbGxUb3AoKTt2YXIgd2luZG93TGVmdD0kd2luZG93LnNjcm9sbExlZnQoKTt2YXIgc2Nyb2xsQ29udGFpbmVyTGVmdD0oaXNSZXNwb25zaXZlQ29udGFpbmVyQWN0aXZlKCk/JHJlc3BvbnNpdmVDb250YWluZXI6JHNjcm9sbENvbnRhaW5lcikuc2Nyb2xsTGVmdCgpO3JldHVybiBmdW5jdGlvbihldmVudFR5cGUpe3Jlc3BvbnNpdmU9aXNSZXNwb25zaXZlQ29udGFpbmVyQWN0aXZlKCk7dmFyIGlzVGFibGVIaWRkZW49JHRhYmxlWzBdLm9mZnNldFdpZHRoPD0wJiYkdGFibGVbMF0ub2Zmc2V0SGVpZ2h0PD0wO2lmKCFpc1RhYmxlSGlkZGVuJiZmbG9hdFRhYmxlSGlkZGVuKXtmbG9hdFRhYmxlSGlkZGVuPSExO3NldFRpbWVvdXQoZnVuY3Rpb24oKXskdGFibGUudHJpZ2dlckhhbmRsZXIoInJlZmxvdyIpfSwxKTtyZXR1cm4gbnVsbH0KaWYoaXNUYWJsZUhpZGRlbil7ZmxvYXRUYWJsZUhpZGRlbj0hMDtpZighdXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7cmV0dXJuIG51bGx9fQppZihldmVudFR5cGU9PSd3aW5kb3dTY3JvbGwnKXt3aW5kb3dUb3A9JHdpbmRvdy5zY3JvbGxUb3AoKTt3aW5kb3dMZWZ0PSR3aW5kb3cuc2Nyb2xsTGVmdCgpfWVsc2UgaWYoZXZlbnRUeXBlPT0nY29udGFpbmVyU2Nyb2xsJyl7aWYoJHJlc3BvbnNpdmVDb250YWluZXIubGVuZ3RoKXtpZighcmVzcG9uc2l2ZSl7cmV0dXJufQpzY3JvbGxDb250YWluZXJMZWZ0PSRyZXNwb25zaXZlQ29udGFpbmVyLnNjcm9sbExlZnQoKX1lbHNle3Njcm9sbGluZ0NvbnRhaW5lclRvcD0kc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCgpO3Njcm9sbENvbnRhaW5lckxlZnQ9JHNjcm9sbENvbnRhaW5lci5zY3JvbGxMZWZ0KCl9fWVsc2UgaWYoZXZlbnRUeXBlIT0naW5pdCcpe3dpbmRvd1RvcD0kd2luZG93LnNjcm9sbFRvcCgpO3dpbmRvd0xlZnQ9JHdpbmRvdy5zY3JvbGxMZWZ0KCk7c2Nyb2xsaW5nQ29udGFpbmVyVG9wPSRzY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wKCk7c2Nyb2xsQ29udGFpbmVyTGVmdD0ocmVzcG9uc2l2ZT8kcmVzcG9uc2l2ZUNvbnRhaW5lcjokc2Nyb2xsQ29udGFpbmVyKS5zY3JvbGxMZWZ0KCl9CmlmKGlzV2Via2l0JiYod2luZG93VG9wPDB8fHdpbmRvd0xlZnQ8MCkpe3JldHVybn0KaWYoYWJzb2x1dGVUb0ZpeGVkT25TY3JvbGwpe2lmKGV2ZW50VHlwZT09J3dpbmRvd1Njcm9sbERvbmUnKXtjaGFuZ2VQb3NpdGlvbmluZyghMCl9ZWxzZXtjaGFuZ2VQb3NpdGlvbmluZyghMSl9fWVsc2UgaWYoZXZlbnRUeXBlPT0nd2luZG93U2Nyb2xsRG9uZScpe3JldHVybiBudWxsfQp0YWJsZU9mZnNldD0kdGFibGUub2Zmc2V0KCk7aWYoaGF2ZUNhcHRpb24mJmNhcHRpb25BbGlnblRvcCl7dGFibGVPZmZzZXQudG9wKz1jYXB0aW9uSGVpZ2h0fQp2YXIgdG9wLGxlZnQ7dmFyIHRhYmxlSGVpZ2h0PSR0YWJsZS5vdXRlckhlaWdodCgpO2lmKGxvY2tlZCYmdXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7aWYodGFibGVDb250YWluZXJHYXA+PXNjcm9sbGluZ0NvbnRhaW5lclRvcCl7dmFyIGdhcD10YWJsZUNvbnRhaW5lckdhcC1zY3JvbGxpbmdDb250YWluZXJUb3ArdGFibGVUb3BHYXA7dG9wPWdhcD4wP2dhcDowO3RyaWdnZXJGbG9hdEV2ZW50KCExKX1lbHNle3RvcD13cmFwcGVkQ29udGFpbmVyP3RhYmxlVG9wR2FwOnNjcm9sbGluZ0NvbnRhaW5lclRvcDt0cmlnZ2VyRmxvYXRFdmVudCghMCl9CmxlZnQ9dGFibGVMZWZ0R2FwfWVsc2UgaWYoIWxvY2tlZCYmdXNlQWJzb2x1dGVQb3NpdGlvbmluZyl7aWYod2luZG93VG9wPmZsb2F0RW5kK3RhYmxlSGVpZ2h0K2NhcHRpb25TY3JvbGxPZmZzZXQpe3RvcD10YWJsZUhlaWdodC1mbG9hdENvbnRhaW5lckhlaWdodCtjYXB0aW9uU2Nyb2xsT2Zmc2V0fWVsc2UgaWYodGFibGVPZmZzZXQudG9wPj13aW5kb3dUb3Arc2Nyb2xsaW5nVG9wKXt0b3A9MDt1bmZsb2F0KCk7dHJpZ2dlckZsb2F0RXZlbnQoITEpfWVsc2V7dG9wPXNjcm9sbGluZ1RvcCt3aW5kb3dUb3AtdGFibGVPZmZzZXQudG9wK3RhYmxlQ29udGFpbmVyR2FwKyhjYXB0aW9uQWxpZ25Ub3A/Y2FwdGlvbkhlaWdodDowKTtyZWZsb2F0KCk7dHJpZ2dlckZsb2F0RXZlbnQoITApfQpsZWZ0PXNjcm9sbENvbnRhaW5lckxlZnR9ZWxzZSBpZihsb2NrZWQmJiF1c2VBYnNvbHV0ZVBvc2l0aW9uaW5nKXtpZih0YWJsZUNvbnRhaW5lckdhcD5zY3JvbGxpbmdDb250YWluZXJUb3B8fHNjcm9sbGluZ0NvbnRhaW5lclRvcC10YWJsZUNvbnRhaW5lckdhcD50YWJsZUhlaWdodCl7dG9wPXRhYmxlT2Zmc2V0LnRvcC13aW5kb3dUb3A7dW5mbG9hdCgpO3RyaWdnZXJGbG9hdEV2ZW50KCExKX1lbHNle3RvcD10YWJsZU9mZnNldC50b3Arc2Nyb2xsaW5nQ29udGFpbmVyVG9wLXdpbmRvd1RvcC10YWJsZUNvbnRhaW5lckdhcDtyZWZsb2F0KCk7dHJpZ2dlckZsb2F0RXZlbnQoITApfQpsZWZ0PXRhYmxlT2Zmc2V0LmxlZnQrc2Nyb2xsQ29udGFpbmVyTGVmdC13aW5kb3dMZWZ0fWVsc2UgaWYoIWxvY2tlZCYmIXVzZUFic29sdXRlUG9zaXRpb25pbmcpe2lmKHdpbmRvd1RvcD5mbG9hdEVuZCt0YWJsZUhlaWdodCtjYXB0aW9uU2Nyb2xsT2Zmc2V0KXt0b3A9dGFibGVIZWlnaHQrc2Nyb2xsaW5nVG9wLXdpbmRvd1RvcCtmbG9hdEVuZCtjYXB0aW9uU2Nyb2xsT2Zmc2V0fWVsc2UgaWYodGFibGVPZmZzZXQudG9wPndpbmRvd1RvcCtzY3JvbGxpbmdUb3Ape3RvcD10YWJsZU9mZnNldC50b3Atd2luZG93VG9wO3JlZmxvYXQoKTt0cmlnZ2VyRmxvYXRFdmVudCghMSl9ZWxzZXt0b3A9c2Nyb2xsaW5nVG9wO3RyaWdnZXJGbG9hdEV2ZW50KCEwKX0KbGVmdD10YWJsZU9mZnNldC5sZWZ0K3Njcm9sbENvbnRhaW5lckxlZnQtd2luZG93TGVmdH0KcmV0dXJue3RvcDp0b3AsbGVmdDpsZWZ0fX19CmZ1bmN0aW9uIHJlcG9zaXRpb25GbG9hdENvbnRhaW5lckZuKCl7dmFyIG9sZFRvcD1udWxsO3ZhciBvbGRMZWZ0PW51bGw7dmFyIG9sZFNjcm9sbExlZnQ9bnVsbDtyZXR1cm4gZnVuY3Rpb24ocG9zLHNldFdpZHRoLHNldEhlaWdodCl7aWYocG9zIT1udWxsJiYob2xkVG9wIT1wb3MudG9wfHxvbGRMZWZ0IT1wb3MubGVmdCkpeyRmbG9hdENvbnRhaW5lci5jc3Moe3RvcDpwb3MudG9wLGxlZnQ6cG9zLmxlZnR9KTtvbGRUb3A9cG9zLnRvcDtvbGRMZWZ0PXBvcy5sZWZ0fQppZihzZXRXaWR0aCl7c2V0RmxvYXRXaWR0aCgpfQppZihzZXRIZWlnaHQpe3NldEhlYWRlckhlaWdodCgpfQp2YXIgc2Nyb2xsTGVmdD0ocmVzcG9uc2l2ZT8kcmVzcG9uc2l2ZUNvbnRhaW5lcjokc2Nyb2xsQ29udGFpbmVyKS5zY3JvbGxMZWZ0KCk7aWYoIXVzZUFic29sdXRlUG9zaXRpb25pbmd8fG9sZFNjcm9sbExlZnQhPXNjcm9sbExlZnQpeyRmbG9hdENvbnRhaW5lci5zY3JvbGxMZWZ0KHNjcm9sbExlZnQpO29sZFNjcm9sbExlZnQ9c2Nyb2xsTGVmdH19fQpmdW5jdGlvbiBjYWxjdWxhdGVTY3JvbGxCYXJTaXplKCl7aWYoJHNjcm9sbENvbnRhaW5lci5sZW5ndGgpe2lmKG9wdHMuc3VwcG9ydCYmb3B0cy5zdXBwb3J0LnBlcmZlY3RTY3JvbGxiYXImJiRzY3JvbGxDb250YWluZXIuZGF0YSgpLnBlcmZlY3RTY3JvbGxiYXIpe3Njcm9sbGJhck9mZnNldD17aG9yaXpvbnRhbDowLHZlcnRpY2FsOjB9fWVsc2V7aWYoJHNjcm9sbENvbnRhaW5lci5jc3MoJ292ZXJmbG93LXgnKT09J3Njcm9sbCcpe3Njcm9sbGJhck9mZnNldC5ob3Jpem9udGFsPXNjV2lkdGh9ZWxzZXt2YXIgc3c9JHNjcm9sbENvbnRhaW5lci53aWR0aCgpLHR3PXRhYmxlV2lkdGgoJHRhYmxlLCRmdGhDZWxscyk7dmFyIG9mZnNldHY9c2g8dGg/c2NXaWR0aDowO3Njcm9sbGJhck9mZnNldC5ob3Jpem9udGFsPXN3LW9mZnNldHY8dHc/c2NXaWR0aDowfQppZigkc2Nyb2xsQ29udGFpbmVyLmNzcygnb3ZlcmZsb3cteScpPT0nc2Nyb2xsJyl7c2Nyb2xsYmFyT2Zmc2V0LnZlcnRpY2FsPXNjV2lkdGh9ZWxzZXt2YXIgc2g9JHNjcm9sbENvbnRhaW5lci5oZWlnaHQoKSx0aD0kdGFibGUuaGVpZ2h0KCk7dmFyIG9mZnNldGg9c3c8dHc/c2NXaWR0aDowO3Njcm9sbGJhck9mZnNldC52ZXJ0aWNhbD1zaC1vZmZzZXRoPHRoP3NjV2lkdGg6MH19fX0KY2FsY3VsYXRlU2Nyb2xsQmFyU2l6ZSgpO3ZhciBmbG93O3ZhciBlbnN1cmVSZWZsb3c9ZnVuY3Rpb24oKXtmbG93PXJlZmxvdygpO2Zsb3coKX07ZW5zdXJlUmVmbG93KCk7dmFyIGNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zPWNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zRm4oKTt2YXIgcmVwb3NpdGlvbkZsb2F0Q29udGFpbmVyPXJlcG9zaXRpb25GbG9hdENvbnRhaW5lckZuKCk7cmVwb3NpdGlvbkZsb2F0Q29udGFpbmVyKGNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zKCdpbml0JyksITApO3ZhciB3aW5kb3dTY3JvbGxEb25lRXZlbnQ9dXRpbC5kZWJvdW5jZShmdW5jdGlvbigpe3JlcG9zaXRpb25GbG9hdENvbnRhaW5lcihjYWxjdWxhdGVGbG9hdENvbnRhaW5lclBvcygnd2luZG93U2Nyb2xsRG9uZScpLCExKX0sMSk7dmFyIHdpbmRvd1Njcm9sbEV2ZW50PWZ1bmN0aW9uKCl7cmVwb3NpdGlvbkZsb2F0Q29udGFpbmVyKGNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zKCd3aW5kb3dTY3JvbGwnKSwhMSk7aWYoYWJzb2x1dGVUb0ZpeGVkT25TY3JvbGwpe3dpbmRvd1Njcm9sbERvbmVFdmVudCgpfX07dmFyIGNvbnRhaW5lclNjcm9sbEV2ZW50PWZ1bmN0aW9uKCl7cmVwb3NpdGlvbkZsb2F0Q29udGFpbmVyKGNhbGN1bGF0ZUZsb2F0Q29udGFpbmVyUG9zKCdjb250YWluZXJTY3JvbGwnKSwhMSl9O3ZhciB3aW5kb3dSZXNpemVFdmVudD1mdW5jdGlvbigpe2lmKCR0YWJsZS5pcygiOmhpZGRlbiIpKXtyZXR1cm59CnVwZGF0ZVNjcm9sbGluZ09mZnNldHMoKTtjYWxjdWxhdGVTY3JvbGxCYXJTaXplKCk7ZW5zdXJlUmVmbG93KCk7Y2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3M9Y2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3NGbigpO3JlcG9zaXRpb25GbG9hdENvbnRhaW5lcj1yZXBvc2l0aW9uRmxvYXRDb250YWluZXJGbigpO3JlcG9zaXRpb25GbG9hdENvbnRhaW5lcihjYWxjdWxhdGVGbG9hdENvbnRhaW5lclBvcygncmVzaXplJyksITAsITApfTt2YXIgcmVmbG93RXZlbnQ9dXRpbC5kZWJvdW5jZShmdW5jdGlvbigpe2lmKCR0YWJsZS5pcygiOmhpZGRlbiIpKXtyZXR1cm59CmNhbGN1bGF0ZVNjcm9sbEJhclNpemUoKTt1cGRhdGVTY3JvbGxpbmdPZmZzZXRzKCk7ZW5zdXJlUmVmbG93KCk7Y2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3M9Y2FsY3VsYXRlRmxvYXRDb250YWluZXJQb3NGbigpO3JlcG9zaXRpb25GbG9hdENvbnRhaW5lcihjYWxjdWxhdGVGbG9hdENvbnRhaW5lclBvcygncmVmbG93JyksITApfSwxKTt2YXIgYmVmb3JlUHJpbnQ9ZnVuY3Rpb24oKXskdGFibGUuZmxvYXRUaGVhZCgnZGVzdHJveScsWyEwXSl9O3ZhciBhZnRlclByaW50PWZ1bmN0aW9uKCl7JHRhYmxlLmZsb2F0VGhlYWQob3B0cyl9O3ZhciBwcmludEV2ZW50PWZ1bmN0aW9uKG1xbCl7aWYobXFsLm1hdGNoZXMpe2JlZm9yZVByaW50KCl9ZWxzZXthZnRlclByaW50KCl9fTtpZih3aW5kb3cubWF0Y2hNZWRpYSl7d2luZG93Lm1hdGNoTWVkaWEoInByaW50IikuYWRkTGlzdGVuZXIocHJpbnRFdmVudCl9ZWxzZXskd2luZG93Lm9uKCdiZWZvcmVwcmludCcsYmVmb3JlUHJpbnQpOyR3aW5kb3cub24oJ2FmdGVycHJpbnQnLGFmdGVyUHJpbnQpfQppZihsb2NrZWQpe2lmKHVzZUFic29sdXRlUG9zaXRpb25pbmcpeyRzY3JvbGxDb250YWluZXIub24oZXZlbnROYW1lKCdzY3JvbGwnKSxjb250YWluZXJTY3JvbGxFdmVudCl9ZWxzZXskc2Nyb2xsQ29udGFpbmVyLm9uKGV2ZW50TmFtZSgnc2Nyb2xsJyksY29udGFpbmVyU2Nyb2xsRXZlbnQpOyR3aW5kb3cub24oZXZlbnROYW1lKCdzY3JvbGwnKSx3aW5kb3dTY3JvbGxFdmVudCl9fWVsc2V7JHJlc3BvbnNpdmVDb250YWluZXIub24oZXZlbnROYW1lKCdzY3JvbGwnKSxjb250YWluZXJTY3JvbGxFdmVudCk7JHdpbmRvdy5vbihldmVudE5hbWUoJ3Njcm9sbCcpLHdpbmRvd1Njcm9sbEV2ZW50KX0KJHdpbmRvdy5vbihldmVudE5hbWUoJ2xvYWQnKSxyZWZsb3dFdmVudCk7d2luZG93UmVzaXplKGV2ZW50TmFtZSgncmVzaXplJyksd2luZG93UmVzaXplRXZlbnQpOyR0YWJsZS5vbigncmVmbG93JyxyZWZsb3dFdmVudCk7aWYob3B0cy5zdXBwb3J0JiZvcHRzLnN1cHBvcnQuZGF0YXRhYmxlcyYmaXNEYXRhdGFibGUoJHRhYmxlKSl7JHRhYmxlLm9uKCdmaWx0ZXInLHJlZmxvd0V2ZW50KS5vbignc29ydCcscmVmbG93RXZlbnQpLm9uKCdwYWdlJyxyZWZsb3dFdmVudCl9CmlmKG9wdHMuc3VwcG9ydCYmb3B0cy5zdXBwb3J0LmJvb3RzdHJhcCl7JHdpbmRvdy5vbihldmVudE5hbWUoJ3Nob3duLmJzLnRhYicpLHJlZmxvd0V2ZW50KX0KaWYob3B0cy5zdXBwb3J0JiZvcHRzLnN1cHBvcnQuanF1ZXJ5VUkpeyR3aW5kb3cub24oZXZlbnROYW1lKCd0YWJzYWN0aXZhdGUnKSxyZWZsb3dFdmVudCl9CmlmKGNhbk9ic2VydmVNdXRhdGlvbnMpe3ZhciBtdXRhdGlvbkVsZW1lbnQ9bnVsbDtpZih1dGlsLmlzRnVuY3Rpb24ob3B0cy5hdXRvUmVmbG93KSl7bXV0YXRpb25FbGVtZW50PW9wdHMuYXV0b1JlZmxvdygkdGFibGUsJHNjcm9sbENvbnRhaW5lcil9CmlmKCFtdXRhdGlvbkVsZW1lbnQpe211dGF0aW9uRWxlbWVudD0kc2Nyb2xsQ29udGFpbmVyLmxlbmd0aD8kc2Nyb2xsQ29udGFpbmVyWzBdOiR0YWJsZVswXX0KbU9icz1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihlKXt2YXIgd2FzVGFibGVSZWxhdGVkPWZ1bmN0aW9uKG5vZGVzKXtyZXR1cm4gbm9kZXMmJm5vZGVzWzBdJiYobm9kZXNbMF0ubm9kZU5hbWU9PSJUSEVBRCJ8fG5vZGVzWzBdLm5vZGVOYW1lPT0iVEQifHxub2Rlc1swXS5ub2RlTmFtZT09IlRIIil9O2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXtpZighKHdhc1RhYmxlUmVsYXRlZChlW2ldLmFkZGVkTm9kZXMpfHx3YXNUYWJsZVJlbGF0ZWQoZVtpXS5yZW1vdmVkTm9kZXMpKSl7cmVmbG93RXZlbnQoKTticmVha319fSk7bU9icy5vYnNlcnZlKG11dGF0aW9uRWxlbWVudCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KX0KJHRhYmxlLmRhdGEoJ2Zsb2F0VGhlYWQtYXR0YWNoZWQnLHtkZXN0cm95OmZ1bmN0aW9uKGUsaXNQcmludEV2ZW50KXt2YXIgbnM9Jy5mdGgtJytmbG9hdFRoZWFkSWQ7dW5mbG9hdCgpOyR0YWJsZS5jc3MobGF5b3V0QXV0byk7JHRhYmxlQ29sR3JvdXAucmVtb3ZlKCk7Y3JlYXRlRWxlbWVudHMmJiRmdGhHcnAucmVtb3ZlKCk7aWYoJG5ld0hlYWRlci5wYXJlbnQoKS5sZW5ndGgpeyRuZXdIZWFkZXIucmVwbGFjZVdpdGgoJGhlYWRlcil9CnRyaWdnZXJGbG9hdEV2ZW50KCExKTtpZihjYW5PYnNlcnZlTXV0YXRpb25zKXttT2JzLmRpc2Nvbm5lY3QoKTttT2JzPW51bGx9CiR0YWJsZS5vZmYoJ3JlZmxvdyByZWZsb3dlZCcpOyRzY3JvbGxDb250YWluZXIub2ZmKG5zKTskcmVzcG9uc2l2ZUNvbnRhaW5lci5vZmYobnMpO2lmKHdyYXBwZWRDb250YWluZXIpe2lmKCRzY3JvbGxDb250YWluZXIubGVuZ3RoKXskc2Nyb2xsQ29udGFpbmVyLnVud3JhcCgpfQplbHNleyR0YWJsZS51bndyYXAoKX19CmlmKGxvY2tlZCl7JHNjcm9sbENvbnRhaW5lci5kYXRhKCdmbG9hdFRoZWFkLWNvbnRhaW5lcldyYXAnLCExKX1lbHNleyR0YWJsZS5kYXRhKCdmbG9hdFRoZWFkLWNvbnRhaW5lcldyYXAnLCExKX0KJHRhYmxlLmNzcygnbWluV2lkdGgnLG9yaWdpbmFsVGFibGVNaW5XaWR0aCk7JGZsb2F0Q29udGFpbmVyLnJlbW92ZSgpOyR0YWJsZS5kYXRhKCdmbG9hdFRoZWFkLWF0dGFjaGVkJywhMSk7JHdpbmRvdy5vZmYobnMpO2lmKCFpc1ByaW50RXZlbnQpe3dpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgicHJpbnQiKS5yZW1vdmVMaXN0ZW5lcihwcmludEV2ZW50KTtiZWZvcmVQcmludD1hZnRlclByaW50PWZ1bmN0aW9uKCl7fX19LHJlZmxvdzpmdW5jdGlvbigpe3JlZmxvd0V2ZW50KCl9LHNldEhlYWRlckhlaWdodDpmdW5jdGlvbigpe3NldEhlYWRlckhlaWdodCgpfSxnZXRGbG9hdENvbnRhaW5lcjpmdW5jdGlvbigpe3JldHVybiAkZmxvYXRDb250YWluZXJ9LGdldFJvd0dyb3VwczpmdW5jdGlvbigpe2lmKGhlYWRlckZsb2F0ZWQpe3JldHVybiAkZmxvYXRDb250YWluZXIuZmluZCgnPnRhYmxlPnRoZWFkJykuYWRkKCR0YWJsZS5jaGlsZHJlbigidGJvZHksdGZvb3QiKSl9ZWxzZXtyZXR1cm4gJHRhYmxlLmNoaWxkcmVuKCJ0aGVhZCx0Ym9keSx0Zm9vdCIpfX19KX0pO3JldHVybiB0aGlzfX0pKGpRdWVyeSk7KGZ1bmN0aW9uKCQpeyQuZmxvYXRUaGVhZD0kLmZsb2F0VGhlYWR8fHt9OyQuZmxvYXRUaGVhZC5fPXdpbmRvdy5ffHwoZnVuY3Rpb24oKXt2YXIgdGhhdD17fTt2YXIgaGFzT3duUHJvcGVydHk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxpc1RoaW5ncz1bJ0FyZ3VtZW50cycsJ0Z1bmN0aW9uJywnU3RyaW5nJywnTnVtYmVyJywnRGF0ZScsJ1JlZ0V4cCddO3RoYXQuaGFzPWZ1bmN0aW9uKG9iaixrZXkpe3JldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixrZXkpfTt0aGF0LmtleXM9ZnVuY3Rpb24ob2JqKXtpZihvYmohPT1PYmplY3Qob2JqKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG9iamVjdCcpO3ZhciBrZXlzPVtdO2Zvcih2YXIga2V5IGluIG9iailpZih0aGF0LmhhcyhvYmosa2V5KSlrZXlzLnB1c2goa2V5KTtyZXR1cm4ga2V5c307dmFyIGlkQ291bnRlcj0wO3RoYXQudW5pcXVlSWQ9ZnVuY3Rpb24ocHJlZml4KXt2YXIgaWQ9KytpZENvdW50ZXIrJyc7cmV0dXJuIHByZWZpeD9wcmVmaXgraWQ6aWR9OyQuZWFjaChpc1RoaW5ncyxmdW5jdGlvbigpe3ZhciBuYW1lPXRoaXM7dGhhdFsnaXMnK25hbWVdPWZ1bmN0aW9uKG9iail7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopPT0nW29iamVjdCAnK25hbWUrJ10nfX0pO3RoYXQuZGVib3VuY2U9ZnVuY3Rpb24oZnVuYyx3YWl0LGltbWVkaWF0ZSl7dmFyIHRpbWVvdXQsYXJncyxjb250ZXh0LHRpbWVzdGFtcCxyZXN1bHQ7cmV0dXJuIGZ1bmN0aW9uKCl7Y29udGV4dD10aGlzO2FyZ3M9YXJndW1lbnRzO3RpbWVzdGFtcD1uZXcgRGF0ZSgpO3ZhciBsYXRlcj1mdW5jdGlvbigpe3ZhciBsYXN0PShuZXcgRGF0ZSgpKS10aW1lc3RhbXA7aWYobGFzdDx3YWl0KXt0aW1lb3V0PXNldFRpbWVvdXQobGF0ZXIsd2FpdC1sYXN0KX1lbHNle3RpbWVvdXQ9bnVsbDtpZighaW1tZWRpYXRlKXJlc3VsdD1mdW5jLmFwcGx5KGNvbnRleHQsYXJncyl9fTt2YXIgY2FsbE5vdz1pbW1lZGlhdGUmJiF0aW1lb3V0O2lmKCF0aW1lb3V0KXt0aW1lb3V0PXNldFRpbWVvdXQobGF0ZXIsd2FpdCl9CmlmKGNhbGxOb3cpcmVzdWx0PWZ1bmMuYXBwbHkoY29udGV4dCxhcmdzKTtyZXR1cm4gcmVzdWx0fX07cmV0dXJuIHRoYXR9KSgpfSkoalF1ZXJ5KTsoZnVuY3Rpb24oKXt2YXIgaW5pdGlhbGl6aW5nPSExLGZuVGVzdD0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87dGhpcy5DbGFzcz1mdW5jdGlvbigpe307Q2xhc3MuZXh0ZW5kPWZ1bmN0aW9uKHByb3Ape3ZhciBfc3VwZXI9dGhpcy5wcm90b3R5cGU7aW5pdGlhbGl6aW5nPSEwO3ZhciBwcm90b3R5cGU9bmV3IHRoaXMoKTtpbml0aWFsaXppbmc9ITE7Zm9yKHZhciBuYW1lIGluIHByb3Ape3Byb3RvdHlwZVtuYW1lXT10eXBlb2YgcHJvcFtuYW1lXT09ImZ1bmN0aW9uIiYmdHlwZW9mIF9zdXBlcltuYW1lXT09ImZ1bmN0aW9uIiYmZm5UZXN0LnRlc3QocHJvcFtuYW1lXSk/KGZ1bmN0aW9uKG5hbWUsZm4pe3JldHVybiBmdW5jdGlvbigpe3ZhciB0bXA9dGhpcy5fc3VwZXI7dGhpcy5fc3VwZXI9X3N1cGVyW25hbWVdO3ZhciByZXQ9Zm4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuX3N1cGVyPXRtcDtyZXR1cm4gcmV0fX0pKG5hbWUscHJvcFtuYW1lXSk6cHJvcFtuYW1lXX0KZnVuY3Rpb24gQ2xhc3MoKXtpZighaW5pdGlhbGl6aW5nJiZ0aGlzLmluaXQpCnRoaXMuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9CkNsYXNzLnByb3RvdHlwZT1wcm90b3R5cGU7Q2xhc3MuY29uc3RydWN0b3I9Q2xhc3M7Q2xhc3MuZXh0ZW5kPWFyZ3VtZW50cy5jYWxsZWU7cmV0dXJuIENsYXNzfX0pKCk7SlNMaXN0Qm94PWZ1bmN0aW9uKGNvbmZpZ09iamVjdCl7dGhpcy5pdGVtcz1bXTt0aGlzLmNvbnRhaW5lclNlbGVjdG9yPScjJytjb25maWdPYmplY3QuY29udGFpbmVyU2VsZWN0b3I7JCh0aGlzLmNvbnRhaW5lclNlbGVjdG9yKS5jc3MoInBvc2l0aW9uIiwicmVsYXRpdmUiKTt2YXIgdG1wQ29udGFpbmVyPSQoJzxkaXYgY2xhc3M9Im1lbnVDb250YWluZXJKU0xpc3RCb3giIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDsiPjwvZGl2PicpO2lmKGNvbmZpZ09iamVjdC5zdHlsZW1hcCkKdG1wQ29udGFpbmVyLmNzcyhjb25maWdPYmplY3Quc3R5bGVtYXApO3RoaXMubWVudUNvbnRhaW5lckhUTUw9dG1wQ29udGFpbmVyLmNsb25lKCkud3JhcCgnPGRpdj48L2Rpdj4nKS5wYXJlbnQoKS5odG1sKCk7dGhpcy5TZWxlY3RlZEl0ZW09bnVsbDt0aGlzLlNlbGVjdGVkSW5kZXg9bnVsbH07SlNMaXN0Qm94LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaXRlbXM9W107dGhpcy5yZWZyZXNoKCl9O0pTTGlzdEJveC5wcm90b3R5cGUuYWRkSXRlbT1mdW5jdGlvbihpdGVtKXt0aGlzLml0ZW1zLnB1c2goaXRlbSk7dGhpcy5yZWZyZXNoKCl9O0pTTGlzdEJveC5wcm90b3R5cGUuYWRkSXRlbXM9ZnVuY3Rpb24obmV3SXRlbXMpe2Zvcih2YXIgaSBpbiBuZXdJdGVtcykKe3RoaXMuaXRlbXMucHVzaChuZXdJdGVtc1tpXSl9CnRoaXMucmVmcmVzaCgpfTtKU0xpc3RCb3gucHJvdG90eXBlLnJlbW92ZUF0PWZ1bmN0aW9uKGluZGV4KXt0aGlzLml0ZW1zLnNwbGljZShpbmRleCwxKTt0aGlzLnJlZnJlc2goKX07SlNMaXN0Qm94LnByb3RvdHlwZS5yZWZyZXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5tZW51Q29udGFpbmVyKQp0aGlzLm1lbnVDb250YWluZXIudW5iaW5kKCk7JCh0aGlzLmNvbnRhaW5lclNlbGVjdG9yKS5odG1sKHRoaXMubWVudUNvbnRhaW5lckhUTUwpO3RoaXMubWVudUNvbnRhaW5lcj0kKHRoaXMuY29udGFpbmVyU2VsZWN0b3IrJyAubWVudUNvbnRhaW5lckpTTGlzdEJveCcpO2Zvcih2YXIgaSBpbiB0aGlzLml0ZW1zKQp7dmFyIGl0ZW09dGhpcy5pdGVtc1tpXTt2YXIgcmVuZGVyZWRJdGVtSFRNTD1pdGVtLnJlbmRlcigpO3ZhciBpdGVtQWN0aXZhdGVkPSExO2lmKHRoaXMuU2VsZWN0ZWRJdGVtPT1pdGVtKQppdGVtQWN0aXZhdGVkPSEwOyQoIjxsaT48L2xpPiIpLmRhdGEoImpzbGlzdGJveC5pdGVtIixpdGVtKS5hdHRyKCJlbmFibGVkIixpdGVtLmVuYWJsZWQpLmF0dHIoImFjdGl2YXRlZCIsaXRlbUFjdGl2YXRlZCkuYXBwZW5kKCQocmVuZGVyZWRJdGVtSFRNTCkpLmFwcGVuZFRvKHRoaXMubWVudUNvbnRhaW5lcil9CnZhciBzZWxmPXRoaXM7JCh0aGlzLm1lbnVDb250YWluZXIpLmxpc3Qoe3NlbGVjdGVkOmZ1bmN0aW9uKGV2ZW50LHVpKXt2YXIgaXRlbT11aS5pdGVtLmRhdGEoImpzbGlzdGJveC5pdGVtIik7c2VsZi5zZXRTZWxlY3RlZEl0ZW0oaXRlbSk7aXRlbS5vbkNsaWNrKCk7cmV0dXJuITB9LGRibHNlbGVjdGVkOmZ1bmN0aW9uKGV2ZW50LHVpKXt2YXIgaXRlbT11aS5pdGVtLmRhdGEoImpzbGlzdGJveC5pdGVtIik7aXRlbS5vbkRibENsaWNrKCk7cmV0dXJuITB9fSl9O0pTTGlzdEJveC5wcm90b3R5cGUuc2V0U2VsZWN0ZWRJdGVtPWZ1bmN0aW9uKGl0ZW0pe3RoaXMuU2VsZWN0ZWRJdGVtPWl0ZW07dGhpcy5TZWxlY3RlZEluZGV4PXRoaXMuZ2V0SXRlbUluZGV4KGl0ZW0pfTtKU0xpc3RCb3gucHJvdG90eXBlLnNldFNlbGVjdGVkSW5kZXg9ZnVuY3Rpb24oaW5kZXgpe3RoaXMuU2VsZWN0ZWRJdGVtPXRoaXMuaXRlbXNbaW5kZXhdO3RoaXMuU2VsZWN0ZWRJbmRleD1pbmRleH07SlNMaXN0Qm94LnByb3RvdHlwZS5nZXRJdGVtSW5kZXg9ZnVuY3Rpb24oaXRlbSl7Zm9yKHZhciBpIGluIHRoaXMuaXRlbXMpCntpZih0aGlzLml0ZW1zW2ldPT1pdGVtKQpyZXR1cm4gaX0KcmV0dXJuIG51bGx9O0pTTGlzdEJveC5JdGVtPUNsYXNzLmV4dGVuZCh7dmFsdWU6IiIsZW5hYmxlZDohMCxpbml0OmZ1bmN0aW9uKCl7fSxyZW5kZXI6ZnVuY3Rpb24oKXtyZXR1cm4nPGEgaHJlZj0iIyI+Jyt0aGlzLnZhbHVlKyc8L2E+J30sb25DbGljazpmdW5jdGlvbigpe30sb25EYmxDbGljazpmdW5jdGlvbigpe319KTsoZnVuY3Rpb24oJCl7JC53aWRnZXQoInVpLmxpc3QiLHtfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpczt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS5hdHRyKHtyb2xlOiJsaXN0Ym94IiwiYXJpYS1hY3RpdmVkZXNjZW5kYW50IjoidWktYWN0aXZlLW1lbnVpdGVtIn0pLmNsaWNrKGZ1bmN0aW9uKGV2ZW50KXtpZighJChldmVudC50YXJnZXQpLmNsb3Nlc3QoIi51aS1tZW51LWl0ZW0gYSIpLmxlbmd0aCl7cmV0dXJufQppZihzZWxmLmhpZ2hsaWdodGVkKQp7dmFyIGhpZ2hsaWdodGVkSXRlbT1zZWxmLmhpZ2hsaWdodGVkO2lmKHNlbGYuY2xpY2tIYW5kbGVyJiYhc2VsZi5jbGlja0hhbmRsZXIoKSl7cmV0dXJufQpzZWxmLmFjdGl2YXRlKGV2ZW50LGhpZ2hsaWdodGVkSXRlbSk7ZXZlbnQucHJldmVudERlZmF1bHQoKTtzZWxmLnNlbGVjdChldmVudCl9fSkuZGJsY2xpY2soZnVuY3Rpb24oZXZlbnQpe2lmKCEkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSBhIikubGVuZ3RoKXtyZXR1cm59CmlmKHNlbGYuaGlnaGxpZ2h0ZWQpCntldmVudC5wcmV2ZW50RGVmYXVsdCgpO3NlbGYuZGJsc2VsZWN0KGV2ZW50KX19KTt0aGlzLnJlZnJlc2goKX0sc2V0Q2xpY2tIYW5kbGVyOmZ1bmN0aW9uKGhhbmRsZXIpe3RoaXMuY2xpY2tIYW5kbGVyPWhhbmRsZXJ9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3ZhciBpdGVtcz10aGlzLmVsZW1lbnQuY2hpbGRyZW4oImxpOm5vdCgudWktbWVudS1pdGVtKTpoYXMoYSkiKS5hZGRDbGFzcygidWktbWVudS1pdGVtIikuYXR0cigicm9sZSIsIm1lbnVpdGVtIik7aXRlbXMuY2hpbGRyZW4oImEiKS5hZGRDbGFzcygidWktY29ybmVyLWFsbCIpLmF0dHIoInRhYmluZGV4IiwtMSkubW91c2VlbnRlcihmdW5jdGlvbihldmVudCl7c2VsZi5oaWdobGlnaHQoZXZlbnQsJCh0aGlzKS5wYXJlbnQoKSl9KS5tb3VzZWxlYXZlKGZ1bmN0aW9uKCl7c2VsZi5sb3dsaWdodCgpfSk7Zm9yKHZhciBpPTA7aTxpdGVtcy5sZW5ndGg7aSsrKQp7dmFyIGl0ZW09JChpdGVtc1tpXSk7aWYoaXRlbS5hdHRyKCJhY3RpdmF0ZWQiKT09InRydWUiKQpzZWxmLmFjdGl2YXRlKG51bGwsaXRlbSl9fSxoaWdobGlnaHQ6ZnVuY3Rpb24oZXZlbnQsaXRlbSl7dGhpcy5sb3dsaWdodCgpO2lmKGl0ZW0uYXR0cigiZW5hYmxlZCIpPT0idHJ1ZSIpCnt0aGlzLmhpZ2hsaWdodGVkPWl0ZW0uZXEoMCkuY2hpbGRyZW4oImEiKS5hZGRDbGFzcygidWktbGlzdGJveC1zdGF0ZS1oaWdobGlnaHQiKS5lbmQoKX19LGxvd2xpZ2h0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGlnaGxpZ2h0ZWQpe3JldHVybn0KdGhpcy5oaWdobGlnaHRlZC5jaGlsZHJlbigiYSIpLnJlbW92ZUNsYXNzKCJ1aS1saXN0Ym94LXN0YXRlLWhpZ2hsaWdodCIpO3RoaXMuaGlnaGxpZ2h0ZWQ9bnVsbH0sYWN0aXZhdGU6ZnVuY3Rpb24oZXZlbnQsaXRlbSl7dGhpcy5kZWFjdGl2YXRlKCk7aWYodGhpcy5oYXNTY3JvbGwoKSl7dmFyIG9mZnNldD1pdGVtLm9mZnNldCgpLnRvcC10aGlzLmVsZW1lbnQub2Zmc2V0KCkudG9wLHNjcm9sbD10aGlzLmVsZW1lbnQuYXR0cigic2Nyb2xsVG9wIiksZWxlbWVudEhlaWdodD10aGlzLmVsZW1lbnQuaGVpZ2h0KCk7aWYob2Zmc2V0PDApe3RoaXMuZWxlbWVudC5hdHRyKCJzY3JvbGxUb3AiLHNjcm9sbCtvZmZzZXQpfWVsc2UgaWYob2Zmc2V0Pj1lbGVtZW50SGVpZ2h0KXt0aGlzLmVsZW1lbnQuYXR0cigic2Nyb2xsVG9wIixzY3JvbGwrb2Zmc2V0LWVsZW1lbnRIZWlnaHQraXRlbS5oZWlnaHQoKSl9fQp0aGlzLmFjdGl2ZT1pdGVtLmVxKDApLmNoaWxkcmVuKCJhIikuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIikuYXR0cigiaWQiLCJ1aS1hY3RpdmUtbWVudWl0ZW0iKS5lbmQoKTt0aGlzLl90cmlnZ2VyKCJmb2N1cyIsZXZlbnQse2l0ZW06aXRlbX0pfSxkZWFjdGl2YXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYWN0aXZlKXtyZXR1cm59CnRoaXMuYWN0aXZlLmNoaWxkcmVuKCJhIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIikucmVtb3ZlQXR0cigiaWQiKTt0aGlzLl90cmlnZ2VyKCJibHVyIik7dGhpcy5hY3RpdmU9bnVsbH0sbmV4dDpmdW5jdGlvbihldmVudCl7dGhpcy5tb3ZlKCJuZXh0IiwiLnVpLW1lbnUtaXRlbTpmaXJzdCIsZXZlbnQpfSxwcmV2aW91czpmdW5jdGlvbihldmVudCl7dGhpcy5tb3ZlKCJwcmV2IiwiLnVpLW1lbnUtaXRlbTpsYXN0IixldmVudCl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUucHJldkFsbCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aH0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLm5leHRBbGwoIi51aS1tZW51LWl0ZW0iKS5sZW5ndGh9LG1vdmU6ZnVuY3Rpb24oZGlyZWN0aW9uLGVkZ2UsZXZlbnQpe2lmKCF0aGlzLmFjdGl2ZSl7dGhpcy5hY3RpdmF0ZShldmVudCx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oZWRnZSkpO3JldHVybn0KdmFyIG5leHQ9dGhpcy5hY3RpdmVbZGlyZWN0aW9uKyJBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKDApO2lmKG5leHQubGVuZ3RoKXt0aGlzLmFjdGl2YXRlKGV2ZW50LG5leHQpfWVsc2V7dGhpcy5hY3RpdmF0ZShldmVudCx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oZWRnZSkpfX0sbmV4dFBhZ2U6ZnVuY3Rpb24oZXZlbnQpe2lmKHRoaXMuaGFzU2Nyb2xsKCkpe2lmKCF0aGlzLmFjdGl2ZXx8dGhpcy5sYXN0KCkpe3RoaXMuYWN0aXZhdGUoZXZlbnQsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmZpcnN0IikpO3JldHVybn0KdmFyIGJhc2U9dGhpcy5hY3RpdmUub2Zmc2V0KCkudG9wLGhlaWdodD10aGlzLmVsZW1lbnQuaGVpZ2h0KCkscmVzdWx0PXRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBjbG9zZT0kKHRoaXMpLm9mZnNldCgpLnRvcC1iYXNlLWhlaWdodCskKHRoaXMpLmhlaWdodCgpO3JldHVybiBjbG9zZTwxMCYmY2xvc2U+LTEwfSk7aWYoIXJlc3VsdC5sZW5ndGgpe3Jlc3VsdD10aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW06bGFzdCIpfQp0aGlzLmFjdGl2YXRlKGV2ZW50LHJlc3VsdCl9ZWxzZXt0aGlzLmFjdGl2YXRlKGV2ZW50LHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcighdGhpcy5hY3RpdmV8fHRoaXMubGFzdCgpPyI6Zmlyc3QiOiI6bGFzdCIpKX19LHByZXZpb3VzUGFnZTpmdW5jdGlvbihldmVudCl7aWYodGhpcy5oYXNTY3JvbGwoKSl7aWYoIXRoaXMuYWN0aXZlfHx0aGlzLmZpcnN0KCkpe3RoaXMuYWN0aXZhdGUoZXZlbnQsdGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmxhc3QiKSk7cmV0dXJufQp2YXIgYmFzZT10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3AsaGVpZ2h0PXRoaXMuZWxlbWVudC5oZWlnaHQoKTtyZXN1bHQ9dGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtIikuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGNsb3NlPSQodGhpcykub2Zmc2V0KCkudG9wLWJhc2UraGVpZ2h0LSQodGhpcykuaGVpZ2h0KCk7cmV0dXJuIGNsb3NlPDEwJiZjbG9zZT4tMTB9KTtpZighcmVzdWx0Lmxlbmd0aCl7cmVzdWx0PXRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbTpmaXJzdCIpfQp0aGlzLmFjdGl2YXRlKGV2ZW50LHJlc3VsdCl9ZWxzZXt0aGlzLmFjdGl2YXRlKGV2ZW50LHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbSIpLmZpbHRlcighdGhpcy5hY3RpdmV8fHRoaXMuZmlyc3QoKT8iOmxhc3QiOiI6Zmlyc3QiKSl9fSxoYXNTY3JvbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50LmhlaWdodCgpPHRoaXMuZWxlbWVudC5hdHRyKCJzY3JvbGxIZWlnaHQiKX0sc2VsZWN0OmZ1bmN0aW9uKGV2ZW50KXt0aGlzLl90cmlnZ2VyKCJzZWxlY3RlZCIsZXZlbnQse2l0ZW06dGhpcy5hY3RpdmV9KX0sZGJsc2VsZWN0OmZ1bmN0aW9uKGV2ZW50KXt0aGlzLl90cmlnZ2VyKCJkYmxzZWxlY3RlZCIsZXZlbnQse2l0ZW06dGhpcy5hY3RpdmV9KX19KX0oalF1ZXJ5KSk=(Line 720)
Message:
No zoomed img found, please set "data-zoomed" for evenZoom selector
console-api warning URL: https://connect.facebook.net/en_US/fbevents.js(Line 23)
Message:
[Facebook Pixel] - Unable to parse JSON-LD tag. Malformed JSON found: '// <![CDATA[ { "@context": "http://schema.org", "@type": "WebSite", "name": "Ecreative", "url": "www.ecreativeworks.com" } // ]]> '.
console-api warning URL: https://connect.facebook.net/en_US/fbevents.js(Line 23)
Message:
[Facebook Pixel] - Unable to parse JSON-LD tag. Malformed JSON found: '// <![CDATA[ { "@context": "http://schema.org", "@type": "Organization", "address": { "@type": "PostalAddress", "addressCountry": "United States", "addressLocality": "St. Louis Park", "addressRegion": "MN", "name": "Ecreative", "postalCode": "55426", "streetAddress": "2219 Edgewood Ave S." }, "logo": "https://www.ecreativeworks.com/images/site/store_logo.png", "telephone": "763-450-3900", "url": "https://www.ecreativeworks.com/", "faxNumber": "", "sameAs": ["https:\/\/www.instagram.com\/ecreative.works\/","https:\/\/www.facebook.com\/ecreativeworks\/","https:\/\/www.linkedin.com\/company\/ecreativeworks"] } // ]]> '.
console-api warning URL: https://connect.facebook.net/en_US/fbevents.js(Line 23)
Message:
[Facebook Pixel] - Unable to parse JSON-LD tag. Malformed JSON found: '// <![CDATA[ { "@context": "http://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": "0", "item": { "@id": "https://www.ecreativeworks.com/", "name": "Home" } }]} // ]]> '.

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.

app.upcity.com
connect.facebook.net
d10lpsik1i8c69.cloudfront.net
fonts.googleapis.com
fonts.gstatic.com
koi-3q3g4nfwrm.marketingautomation.services
px.ads.linkedin.com
settings.luckyorange.net
snap.licdn.com
stats.g.doubleclick.net
www.ecreativeworks.com
www.facebook.com
www.google-analytics.com
www.googletagmanager.com
www.linkedin.com
104.26.10.16
130.211.21.179
2a00:1450:4001:809::200e
2a00:1450:4001:81b::2008
2a00:1450:4001:820::200a
2a00:1450:4001:825::2003
2a00:1450:400c:c08::9b
2a02:26f0:6c00:296::25ea
2a03:2880:f01c:8012:face:b00c:0:3
2a03:2880:f11c:8183:face:b00c:0:25de
2a05:f500:11:101::b93f:9001
2a05:f500:11:101::b93f:9005
52.15.252.66
52.201.62.231
54.230.182.218
00b98a610223c6c8bd4999f2bf0fbf955c80402e5653470a626854afa0fead4d
030a504f6af242025b83d7d4529ed81b65bb28f57c7ed0e0c678bdd2ff255c85
07d2b7c2df967b7820b8ce99be3f7db1a1db5a82797826cd9a06e6489e89f71a
0f98f6cbfe4db40cefe20f56786aaf7b081c9f932f89d0ae151819ad99522a40
102ab6fc2905309e46856f1de126e7d04cd65e47e0598fdea09ab65d05b4511d
1090ff45b6becb6c9bba38b60e28490f1179ede3e15c8e4846e5cc1f0f9abb01
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
14030d4f41b7a841cec79a6e3c8964b022e170d0a8f5f575a0242f27768a9a54
1809b0ddee97a4c3f0e0d8bbdd0746c7f8392cdd7c6ae922e8b6f96506688e73
1c5da31374e600dcd21e71e2e4516bdebcc503939696b7ec7bb938c07eaf44e3
1f19b04d453c734bff0822a3f3f1b3c0425326c23c5fa63f5dab297932819527
1f27d96616132cf8ed47c92b3ada7a95e436fad94a6e1d9fbdefc8b971a0b886
25cde4db7efe2cd1075740dcf1124af203222f46004983aa19e5fa3a015b2ad3
26083d50e6708d4eb990d1ea835efaffaf3cee261fbf456149e6d88183ae9b47
27db729de5779173be0b867986ea683bf2e775febf232133c8a6cf73d6b4eb41
27fa747fc887357ebb7eed88e9fc71fc92bfd897ae340a930f0b24e35efaae03
29cdb278cf4344fd438e1da49b4f63178f5956b47c2a4b0be48d8ef32bafaf4a
2d5cc6472080ff74d56ba0b097db640a80a5ec9db5db8f88483e907dd2de43ad
2f9bda49eeb48e49c5c35766ed5fa3451f0e702263bc4f8d461eb15217330930
31802e55f4df3d79ef1420db9ae3099a240eb9bfba7b9228efcb43e40be4068a
318babccb01c2a5eebfa9de29e487356f57c5b35557d090327c3bba6de4bcd5a
3301b7e73c1d28f4d0d674a7b8b1b5301054c4681412e72ad04db5378fae1c4b
371b10b23f14610e0ef2f044409f4df8d1b25db7b16554df68d855035e558f33
3a2936103fb579714922878f9219badd0af8bb8b5bba1183f31300245150a4b2
3ada23c286df06e50efd4dca6e891def40ac276b448ab0cdfb0e598e40891941
3fabc7bfc1e38f6ce4eef18236a9248540991742e1826b8dfa87dabdebdd7fb0
401f533697cfb484598d2da76b5f4708bbca985a1fab42dbcfaa0741374d3245
41dd5e421fe221a7d2921d6fa2b36e8b01a9f2c054aaef5fad866fe896c1d1e0
45b141a1c45b34684bc774f75fe8dcb21aa3d16318b0656589fae7b67bfa1b9d
4c918e69b9ebde59259f77706135564aca9743ae030d4cde4ac7441f09b56a55
4cb61e44bf63a9e090e666898cd04d382e4c33b55b62cc5e9ff7dab055fbf787
4e485ca0517ad6447256d97ba190f99ac89a72ae0ea3f2be5e2e4bf746bf7b2e
53e89c047f52fd0eca6fad064498e5d599d0e75a59a1a98f670c167f2d24e059
56a522e79770e488da6015ed10f8c2bdafbcd87a7c6d443f7a293579bd0ef58d
5804dc77e75f1256342cb0b663cbdd01dcac3b625b370120373db2d167c5a5ab
5c640d204f4479aed5e52ac6cfae68b884246b06254cd667fc114abc9f4ac9c5
5e36b29f89695999bed52411619edfbfba42def33ca81ad923e164929b08f47a
5fe92ebf69a0c3dc25ed351fef072cf1ad0d2d9626a76404388192e80aa1be1f
62e8b597c89925ebedba3ba1a94b473cd5567f659b4d84251e2bcfeffb0768d9
648d4df909cfa33329e74f8c7998a53c6ccf24dda8e9227cf97f3fd20d352367
64d79d0dacbda4605cc4034285043bd51205b3592234041e2aaa92434236e089
668b8d096532cab4d44d1fcddc49954f4eaa5592c4c30570bac6cbba0f16b9da
6dfbb3a5977d5ee77885bf535c809055e6a8601ce8f1e96895a675726a29e0cc
6f898d04d9e4516c95aeaea50806b22d14c1db61e33c459cd1d86e777ef78a2c
6fdd2332ca88e2faaa5531fd1efd4eac8853874b6737722b48db0e13131ca2a5
75d794cc3c600b261fbe69d246fe70095ae42ec5baa058b54c9a212cad7e8f4b
75ef0b2d1635509eca8209eb48a32e1d97806a049b469cea711156ddaa3af4fb
7658be1a132f9b08d801dd1673981fa6ea0599c4721524e25244fb6009cb69bc
77b4e68bf4dc87f0467a3d4a79bafeeb19bfb3024e12f1c8a64513659f9db7b8
79c8384e3b86b9ea99d87d72c37e76eafc4e6140e8ad275e04c46012241f01e5
7ae2262558d82df8584cfb59dce27500ede202480bca653e0e4c719c7acfa24e
7b07d2dd503c0a45a5c845583aa4c8c60d0518cbda034d78381ddf66f37509ee
7d59a2f9aa73b9422ac5ee230b5fbd842b44d0c01d7fcb08db90666d561b2a09
80f1f18e199fb25e0eae6ca63cd7d090492ba7fe835e476a5a2eb1a9f14ff755
8180e17668d32cec8b6c253a475cb7558c00e19ef9978d3cf5c3bfc4d2b110cd
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8a78db525aefef993f014828cac3ebfc02fa7e3d6dace3b3681f4de392f6d657
8adefcf5ddde7c959d91ba5cd7940e19aad6b5fafaca8cb5e77d157ff93f15bc
8c34bc7bc1985e63394c3c2afff88cdcfc06e501320432dd23eaff83ea6754eb
8c5a67eac3d977dcdccde320917e3a9f668de7d99224914a84af13cb94ca9b57
8f13f24eae9473fab6b7697e2940c8ccd4ae6825988fbef504f051210650553f
8f359bc7c2d05637f97b500ce90841e277ae98f04ebdd1955a24035255cd8567
9429a652e87bd60be9d098d8e0eb918967da03d3e80b82ca12c79cfde202aef0
94e2c78cc48c176bc7ca009256eba3a076b0002c96e04f4fad4313db9c2bfde7
9746bbc8be1eacd912bb90f2226b3f9141b15938f7b0281825c74999c0040c9b
97ca49770524f0b673605e2ed55081f74de1ee492f4bb53a6640aa676f5e3ea6
9cc3ca263fc9fcacaccba927c3ddf8a04d665d15c896fd1794530198d84d0ca3
9d8c3917c05233409d54343c05da3fe2d973da798527c48853a09f61852a08e2
9ebe2ebd3cfa6ec47b06e567271056e03ca765fe134eba9a407e05501ae2c74a
a0d8555dedb7c0a98b7f8d878fc97eb21fe47bb0675077b8f39e29c716e20ba1
aa9312e541dd4cc5544a647cb45ed3156983f886171ca8b5e87cf4d7abae7eb9
ab2ef76dffeae79cf8924b6e69368c855af10f35510888e098143971b3a62ed1
ad9dc6e8d18248de5769e12ea8a472680f34b0f3eb251d32bdaa7da45e9cc635
ae30c0806fd7bf4719dd5a1f55b9f5e9c875f2187770970d42ea26693b0daf77
ae8dbbf0cb37d107246836d58c2631d5b8bb9a83edcb6ca26eabc8fcf70338d8
b656a39b06929bf2677a3f977a177802483c409f6e251d89a01759944ec9cd10
bd0237ffcaabcf21233577376aea37b6229e67f7a1627b8b8738d5a37b0bf5a8
bf777a4155086d6d4adc9aca654041a288eb55e7e788f0c547682917e288f080
c0061950f346f58694af1252d09cd10d94feacf507f4bf190e0c48c2c1146cad
c04ca1ced1436aa83d224d32d327465fd12f78ef846e78ce10bfb81547e129a4
ccf5e45be41f49ebc05783c77b1a11d918f3d66f10d7113c9ab617ac940654be
cd8f07b8ecb499dca7b70ebd7aef530872a3a41f401ec317a6f7f2c3b39fff1b
cda5d73b2545c303a5ad596345c5124bf743f07e7484f5d4c852b54cb7e74fe5
cf3966b5901d6a3090495028e940ab2dc2d43ebbcb2b8155fc46be1e27620674
d8b7fb75bb30bf2c228d9786d99fc3fb14471aca4529fc1c205f5e464d1f5086
da0c1bc51d4ebfa2570f3e7546d9d3ccfb3f9d3c1199b1ca49869510aa79392a
dc4fd4f42225faf069ded1c10c56974109d3433f5dfb816c56df2f43050dab7a
e2949ddde471e83bd3653e22184e8a796f94cdc4b5df92a01daa07df343a6333
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e5e04552d8c5ad293c0718d48b927dd58995459abc92d45294c4040d2b6af63c
e7cd20153a4f0498ba4b708f622e9274b54b3b7042eeb770e9ea69ad0be0aa89
eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
f40ef454b97664010baf3237b8839fac360733cfeb955301fed2a141d2dd90a8
f5e4bda8c0d819c31b13e9dd4305a1ca1759c79cf78ca9039f7bff1de3c3b02e
f8edc759de929c9234f027a7f92755cdb807150604aa32f85466f76f60945fcc
f968a340bc76c476577ec1d41088f8d4f7a19a941adf66c20dfbeba9953c9cbc
fab32ccef85408b763c899ad7c0b910c96c76dc9ed7158ce304fdcd3c0bf8388
fc48ffc5fb3c0d64e0137a32f3f14e3f2c5cda4dad45918ea69b01ed91040ec7
ff759fa7898573742f87010d78054f31ab1fb1f678e9a6134c7de4cea28ea6eb
ffe05ec2ca4c2ced4c935db89dd5b255922cb5af0a0eebd56fa1b40ec35b8f0e