URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Submission Tags: phishing malicious Search All
Submission: On November 15 via api from US

Summary

This website contacted 80 IPs in 9 countries across 67 domains to perform 220 HTTP transactions. The main IP is 178.19.72.10, located in Germany and belongs to HGCOMP-ASN, DE. The main domain is www.giga.de.
TLS certificate: Issued by RapidSSL RSA CA 2018 on July 18th 2018. Valid for: 2 years.
This is the only time www.giga.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
14 178.19.72.10 29551 (HGCOMP-ASN)
1 46.253.113.178 29551 (HGCOMP-ASN)
1 151.101.114.217 54113 (FASTLY)
1 91.215.103.64 43407 (INFONLINE-AS)
3 188.40.16.106 24940 (HETZNER-AS)
2 178.19.70.100 29551 (HGCOMP-ASN)
6 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2 161.156.66.178 36351 (SOFTLAYER)
1 2 2a03:2880:f11... 32934 (FACEBOOK)
10 2a00:1450:400... 15169 (GOOGLE)
3 13.225.86.250 16509 (AMAZON-02)
2 7 2.18.234.72 16625 (AKAMAI-AS)
1 9 104.109.82.87 20940 (AKAMAI-ASN1)
1 193.46.63.75 43407 (INFONLINE-AS)
1 2 91.215.103.65 43407 (INFONLINE-AS)
6 109.71.25.30 29551 (HGCOMP-ASN)
6 107.178.241.34 15169 (GOOGLE)
3 178.19.72.20 29551 (HGCOMP-ASN)
1 11 172.217.23.98 15169 (GOOGLE)
1 13.224.196.8 16509 (AMAZON-02)
1 2.18.233.67 16625 (AKAMAI-AS)
1 1 2600:9000:215... 16509 (AMAZON-02)
1 2600:9000:215... 16509 (AMAZON-02)
1 35.156.29.62 16509 (AMAZON-02)
1 2600:9000:21f... 16509 (AMAZON-02)
1 2a00:1450:400... 15169 (GOOGLE)
7 2a00:1450:400... 15169 (GOOGLE)
3 2606:4700:20:... 13335 (CLOUDFLAR...)
1 2a00:1450:400... 15169 (GOOGLE)
1 178.19.65.130 29551 (HGCOMP-ASN)
5 26 151.101.14.2 54113 (FASTLY)
3 3.122.213.19 16509 (AMAZON-02)
2 104.16.68.69 13335 (CLOUDFLAR...)
1 3 34.95.120.147 15169 (GOOGLE)
1 185.64.189.112 62713 (AS-PUBMATIC)
1 2.18.234.21 16625 (AKAMAI-AS)
3 35.206.134.202 19527 (GOOGLE-2)
1 178.250.2.152 44788 (ASN-CRITE...)
1 2a00:1450:400... 15169 (GOOGLE)
2 2 216.58.205.226 15169 (GOOGLE)
1 3 2.16.31.65 16625 (AKAMAI-AS)
1 2a00:1450:400... 15169 (GOOGLE)
1 2001:4de0:ac1... 20446 (HIGHWINDS3)
7 136.243.4.7 24940 (HETZNER-AS)
2 151.101.13.194 54113 (FASTLY)
2 52.219.73.163 16509 (AMAZON-02)
1 2 52.94.218.7 16509 (AMAZON-02)
3 13.224.196.120 16509 (AMAZON-02)
1 2600:9000:21f... 16509 (AMAZON-02)
1 95.100.66.110 16625 (AKAMAI-AS)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 13.225.78.37 16509 (AMAZON-02)
11 151.101.114.49 54113 (FASTLY)
2 2 18.194.102.89 16509 (AMAZON-02)
1 69.173.144.165 26667 (RUBICONPR...)
1 1 40.113.136.100 8075 (MICROSOFT...)
1 1 185.29.135.190 30419 (MEDIAMATH...)
1 1 151.101.12.166 54113 (FASTLY)
2 37.252.172.250 29990 (ASN-APPNEXUS)
2 2 54.229.35.82 16509 (AMAZON-02)
1 1 52.42.6.223 16509 (AMAZON-02)
1 192.132.33.46 18568 (BIDTELLECT)
1 130.211.13.252 15169 (GOOGLE)
3 3 52.59.36.197 16509 (AMAZON-02)
1 1 35.210.239.72 19527 (GOOGLE-2)
2 3 37.157.4.23 198622 (ADFORM)
1 85.14.248.71 24961 (MYLOC-AS)
2 4 199.166.0.24 7415 (ADSAFE-1)
4 199.166.0.32 7415 (ADSAFE-1)
9 104.244.36.20 7415 (ADSAFE-1)
2 5.9.139.135 24940 (HETZNER-AS)
1 148.251.51.163 24940 (HETZNER-AS)
1 178.250.0.130 44788 (ASN-CRITE...)
1 52.214.103.10 16509 (AMAZON-02)
1 2a03:2880:f01... 32934 (FACEBOOK)
1 2 89.163.159.100 24961 (MYLOC-AS)
1 194.213.222.30 5588 (GTSCE GTS...)
4 52.208.73.164 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 62.138.221.190 61157 (PLUSSERVE...)
1 34.95.76.218 15169 (GOOGLE)
2 52.29.86.7 16509 (AMAZON-02)
1 89.163.159.123 24961 (MYLOC-AS)
1 2600:9000:20e... 16509 (AMAZON-02)
1 63.34.92.224 16509 (AMAZON-02)
1 34.248.95.73 16509 (AMAZON-02)
2 52.208.125.71 16509 (AMAZON-02)
1 2.18.233.180 16625 (AKAMAI-AS)
220 80
Apex Domain
Subdomains
Transfer
38 taboola.com
cdn.taboola.com
trc.taboola.com
15.taboola.com
match.taboola.com
cds.taboola.com
vidstat.taboola.com
imprammp.taboola.com
convammp.taboola.com
vidanalytics.taboola.com
544 KB
24 giga.de
www.giga.de
static.giga.de
videos.giga.de
ssl.2.damoh.giga.de
ssl.1.damoh.giga.de
448 KB
17 adsafeprotected.com
fw.adsafeprotected.com
static.adsafeprotected.com
dt.adsafeprotected.com
179 KB
16 doubleclick.net
securepubads.g.doubleclick.net
googleads.g.doubleclick.net
cm.g.doubleclick.net
113 KB
10 m6r.eu
cdn.m6r.eu
tracking.m6r.eu
6 KB
10 google-analytics.com
www.google-analytics.com
40 KB
9 nativendo.de
d.nativendo.de
c.nativendo.de
t.nativendo.de
70 KB
7 meetrics.net
lb67.s400.meetrics.net
2 KB
7 adscale.de
ih.adscale.de
native.adscale.de
js.adscale.de
12 KB
6 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
127 KB
5 yieldlove-ad-serving.net
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
api.yieldlove-ad-serving.net
1 KB
5 amazon-adsystem.com
c.amazon-adsystem.com
aax-eu.amazon-adsystem.com
29 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 pubstack.io
boot.pubstack.io
cdn.prod.pubstack.io
intake.prod.pubstack.io
20 KB
4 googletagservices.com
www.googletagservices.com
115 KB
4 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
13 KB
4 stroeermediabrands.de
js.stroeermediabrands.de
gocp.stroeermediabrands.de
87 KB
3 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
14 KB
3 adform.net
track.adform.net
1 KB
3 bidswitch.net
x.bidswitch.net
1 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
60 KB
3 scorecardresearch.com
sb.scorecardresearch.com
2 KB
3 otto.de
orbidder.otto.de
433 B
3 openx.net
yieldlove-d.openx.net
eu-u.openx.net
5 KB
3 giga-abs.de
go.giga-abs.de
2 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 adsrvr.org
match.adsrvr.org
893 B
2 adnxs.com
ib.adnxs.com
1 KB
2 mfadsrvr.com
rtb.mfadsrvr.com
1 KB
2 amazonaws.com
s3.eu-central-1.amazonaws.com
1 KB
2 fastly.net
confiant-integrations.global.ssl.fastly.net
25 KB
2 pubmatic.com
hbopenbid.pubmatic.com
ads.pubmatic.com
113 B
2 districtm.io
dmx.districtm.io
cdn.districtm.io
428 B
2 googleapis.com
imasdk.googleapis.com
ajax.googleapis.com
123 KB
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 facebook.com
www.facebook.com
680 B
2 vgwort.de
ssl-econa.met.vgwort.de
733 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 consentric.de
pixel.consentric.de
354 B
1 mookie1.com
de-gmtdmp.mookie1.com
496 B
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
1014 B
1 atdmt.com
cx.atdmt.com
406 B
1 criteo.net
static.criteo.net
14 KB
1 exactag.com
m.exactag.com
654 B
1 metadsp.co.uk
u.ipw.metadsp.co.uk
261 B
1 bttrack.com
bttrack.com
380 B
1 storygize.net
www.storygize.net
450 B
1 contextweb.com
bh.contextweb.com
680 B
1 mathtag.com
sync.mathtag.com
472 B
1 powerlinks.com
px.powerlinks.com
402 B
1 rubiconproject.com
pixel.rubiconproject.com
239 B
1 stroeerdigital.de
templates.stroeerdigital.de
1 KB
1 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
343 B
1 giga-video.de
files.giga-video.de
15 KB
1 bootstrapcdn.com
maxcdn.bootstrapcdn.com
10 KB
1 criteo.com
bidder.criteo.com
141 B
1 casalemedia.com
as-sec.casalemedia.com
901 B
1 dkuim.de
dkuim.de
151 KB
1 google.com
adservice.google.com
778 B
1 google.de
adservice.google.de
778 B
1 dunkirkinception.com
www.dunkirkinception.com
441 B
1 userreport.com
nugmw.userreport.com
2 KB
1 nuggad.net
si.nuggad.net
596 B
1 mxcdn.net
s400.mxcdn.net
48 KB
1 yieldlove.com
cdn-a.yieldlove.com
92 KB
1 gstatic.com
www.gstatic.com
174 B
1 speedcurve.com
cdn.speedcurve.com
7 KB
220 67
Domain Requested by
14 www.giga.de www.giga.de
11 trc.taboola.com 5 redirects cdn.taboola.com
www.giga.de
11 securepubads.g.doubleclick.net 1 redirects js.stroeermediabrands.de
securepubads.g.doubleclick.net
www.giga.de
10 www.google-analytics.com www.giga.de
www.google-analytics.com
9 dt.adsafeprotected.com www.giga.de
9 tracking.m6r.eu 1 redirects www.giga.de
js.stroeermediabrands.de
tracking.m6r.eu
7 vidstat.taboola.com cdn.taboola.com
vidstat.taboola.com
7 lb67.s400.meetrics.net www.giga.de
6 match.taboola.com www.giga.de
vidstat.taboola.com
6 cdn.taboola.com www.giga.de
cdn.taboola.com
6 videos.giga.de www.giga.de
videos.giga.de
text
5 pagead2.googlesyndication.com www.giga.de
pagead2.googlesyndication.com
4 static.adsafeprotected.com www.giga.de
4 fw.adsafeprotected.com 2 redirects securepubads.g.doubleclick.net
4 ih.adscale.de 1 redirects www.giga.de
js.adscale.de
4 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
3 convammp.taboola.com
3 track.adform.net 2 redirects js.stroeermediabrands.de
3 x.bidswitch.net 3 redirects
3 t.nativendo.de c.nativendo.de
3 hgc-cf-cache-1.svonm.com videos.giga.de
text
3 sb.scorecardresearch.com 1 redirects cdn.taboola.com
www.giga.de
3 orbidder.otto.de cdn-a.yieldlove.com
3 prod-ingestion.tracking.v2.yieldlove-ad-serving.net cdn-a.yieldlove.com
3 c.nativendo.de d.nativendo.de
c.nativendo.de
www.giga.de
3 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 go.giga-abs.de www.giga.de
3 d.nativendo.de www.giga.de
c.nativendo.de
3 c.amazon-adsystem.com www.giga.de
c.amazon-adsystem.com
3 gocp.stroeermediabrands.de www.giga.de
gocp.stroeermediabrands.de
2 eu-u.openx.net 1 redirects cdn-a.yieldlove.com
2 intake.prod.pubstack.io www.giga.de
2 uss.xplosion.de www.giga.de
2 api.yieldlove-ad-serving.net cdn-a.yieldlove.com
2 vidanalytics.taboola.com vidstat.taboola.com
2 ups.xplosion.de js.stroeermediabrands.de
cdn.emetriq.de
2 ssl.2.damoh.giga.de text
2 match.adsrvr.org 2 redirects
2 ib.adnxs.com www.giga.de
2 rtb.mfadsrvr.com 2 redirects
2 js.adscale.de c.nativendo.de
js.stroeermediabrands.de
2 aax-eu.amazon-adsystem.com 1 redirects c.amazon-adsystem.com
2 s3.eu-central-1.amazonaws.com videos.giga.de
text
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 cm.g.doubleclick.net 2 redirects
2 de.ioam.de 1 redirects www.giga.de
2 www.facebook.com 1 redirects www.giga.de
2 ssl-econa.met.vgwort.de 1 redirects www.giga.de
1 cdn.districtm.io cdn-a.yieldlove.com
1 ads.pubmatic.com cdn-a.yieldlove.com
1 adstax-match.adrtx.net cdn.adrtx.net
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.giga.de
1 cdn.emetriq.de ups.xplosion.de
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 cdn.prod.pubstack.io boot.pubstack.io
1 pixel.consentric.de
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com js.stroeermediabrands.de
1 dmp.theadex.com js.stroeermediabrands.de
1 cx.atdmt.com
1 boot.pubstack.io js.stroeermediabrands.de
1 static.criteo.net cdn-a.yieldlove.com
1 ssl.1.damoh.giga.de text
1 imprammp.taboola.com www.giga.de
1 m.exactag.com www.giga.de
1 u.ipw.metadsp.co.uk 1 redirects
1 cds.taboola.com www.giga.de
1 bttrack.com www.giga.de
1 www.storygize.net 1 redirects
1 bh.contextweb.com 1 redirects
1 sync.mathtag.com 1 redirects
1 px.powerlinks.com 1 redirects
1 pixel.rubiconproject.com www.giga.de
1 15.taboola.com cdn.taboola.com
1 templates.stroeerdigital.de js.stroeermediabrands.de
1 cdn.stroeerdigitalmedia.de www.giga.de
1 native.adscale.de c.nativendo.de
1 d.agkn.com js.agkn.com
1 files.giga-video.de www.googletagservices.com
1 maxcdn.bootstrapcdn.com www.giga.de
1 tpc.googlesyndication.com securepubads.g.doubleclick.net
1 ajax.googleapis.com www.giga.de
1 bidder.criteo.com cdn-a.yieldlove.com
1 as-sec.casalemedia.com cdn-a.yieldlove.com
1 hbopenbid.pubmatic.com cdn-a.yieldlove.com
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 dmx.districtm.io cdn-a.yieldlove.com
1 dkuim.de www.giga.de
1 imasdk.googleapis.com videos.giga.de
1 adservice.google.com pagead2.googlesyndication.com
1 adservice.google.de pagead2.googlesyndication.com
1 js.agkn.com js.stroeermediabrands.de
1 www.dunkirkinception.com www.giga.de
1 nugmw.userreport.com www.giga.de
1 si.nuggad.net 1 redirects
1 s400.mxcdn.net js.stroeermediabrands.de
1 cdn-a.yieldlove.com js.stroeermediabrands.de
1 irqs.ioam.de script.ioam.de
1 cdn.m6r.eu 1 redirects
1 www.gstatic.com www.giga.de
1 static.giga.de www.giga.de
1 script.ioam.de www.giga.de
1 cdn.speedcurve.com www.giga.de
1 js.stroeermediabrands.de www.giga.de
220 105
Subject Issuer Validity Valid
*.giga.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-02
2 years crt.sh
*.stroeermediabrands.de
RapidSSL RSA CA 2018
2018-09-06 -
2020-12-05
2 years crt.sh
a3.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-11-13 -
2020-09-10
10 months crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
*.google.com
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
*.met.vgwort.de
Thawte RSA CA 2018
2018-05-22 -
2020-03-25
2 years crt.sh
*.facebook.com
DigiCert SHA2 High Assurance Server CA
2019-11-06 -
2020-02-04
3 months crt.sh
*.google-analytics.com
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
c.amazon-adsystem.com
Amazon
2019-10-07 -
2020-09-29
a year crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
a year crt.sh
*.nativendo.de
Thawte TLS RSA CA G1
2019-04-30 -
2021-05-29
2 years crt.sh
*.giga-abs.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-09-04
2 years crt.sh
cdn-a.yieldlove.com
Amazon
2019-10-02 -
2020-11-02
a year crt.sh
*.mxcdn.net
DigiCert SHA2 Secure Server CA
2019-11-04 -
2021-02-02
a year crt.sh
*.userreport.com
RapidSSL RSA CA 2018
2019-01-10 -
2021-03-10
2 years crt.sh
www.dunkirkinception.com
Amazon
2019-05-22 -
2020-06-22
a year crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
ssl379338.cloudflaressl.com
COMODO ECC Domain Validation Secure Server CA 2
2019-11-14 -
2020-05-22
6 months crt.sh
*.googleapis.com
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
*.dkuim.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-03
2 years crt.sh
f2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-07-30 -
2020-07-25
a year crt.sh
*.tracking.v2.yieldlove-ad-serving.net
Amazon
2019-04-02 -
2020-05-02
a year crt.sh
districtm.io
CloudFlare Inc ECC CA-2
2019-03-26 -
2020-03-26
a year crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years crt.sh
*.pubmatic.com
Sectigo RSA Organization Validation Secure Server CA
2019-02-22 -
2021-02-21
2 years crt.sh
san.casalemedia.com
GeoTrust RSA CA 2018
2019-07-17 -
2020-03-09
8 months crt.sh
orbidder.otto.de
Let's Encrypt Authority X3
2019-10-23 -
2020-01-21
3 months crt.sh
*.criteo.com
DigiCert ECC Secure Server CA
2019-03-28 -
2020-04-01
a year crt.sh
*.scorecardresearch.com
COMODO RSA Organization Validation Secure Server CA
2018-11-28 -
2019-12-26
a year crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
*.bootstrapcdn.com
Sectigo RSA Domain Validation Secure Server CA
2019-09-14 -
2020-10-13
a year crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-01-02 -
2020-01-03
a year crt.sh
*.giga-video.de
RapidSSL RSA CA 2018
2019-11-15 -
2022-02-13
2 years crt.sh
*.s3.eu-central-1.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-09-06 -
2020-12-10
a year crt.sh
aax-eu.amazon-adsystem.com
Amazon
2019-09-18 -
2020-08-26
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
*.adscale.de
DigiCert SHA2 Secure Server CA
2019-02-19 -
2020-05-20
a year crt.sh
cdn.stroeerdigitalgroup.de
DigiCert ECC Secure Server CA
2018-12-04 -
2020-03-04
a year crt.sh
templates.stroeerdigital.de
Amazon
2019-06-26 -
2020-07-26
a year crt.sh
g2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-11-12 -
2020-11-12
a year crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.bttrack.com
Sectigo RSA Domain Validation Secure Server CA
2019-03-19 -
2021-04-13
2 years crt.sh
*.taboola.com
DigiCert ECC Secure Server CA
2019-09-03 -
2020-09-10
a year crt.sh
*.exactag.com
Sectigo ECC Domain Validation Secure Server CA
2019-08-28 -
2021-09-13
2 years crt.sh
*.adsafeprotected.com
COMODO RSA Domain Validation Secure Server CA
2018-08-20 -
2020-09-17
2 years crt.sh
ssl.1.damoh.giga.de
Let's Encrypt Authority X3
2019-10-16 -
2020-01-14
3 months crt.sh
*.criteo.net
DigiCert ECC Secure Server CA
2019-03-26 -
2020-03-30
a year crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years crt.sh
*.prod.pubstack.io
Amazon
2019-09-18 -
2020-10-18
a year crt.sh
*.atlassolutions.com
DigiCert SHA2 High Assurance Server CA
2019-10-28 -
2020-01-26
3 months crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2019-10-11 -
2021-10-10
2 years crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-12-10 -
2020-02-08
a year crt.sh
*.mookie1.com
DigiCert SHA2 Secure Server CA
2019-02-07 -
2020-03-22
a year crt.sh
pixel.consentric.de
GlobalSign Organization Validation CA - SHA256 - G2
2019-05-02 -
2020-05-02
a year crt.sh
cdn.prod.pubstack.io
Let's Encrypt Authority X3
2019-09-19 -
2019-12-18
3 months crt.sh
yieldlove-ad-serving.net
Amazon
2019-10-23 -
2020-11-23
a year crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh

This page contains 24 frames:

Primary Page: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Frame ID: A42E40A3741050396AA8A77765819F6E
Requests: 160 HTTP requests in this frame

Frame: https://videos.giga.de/embed/2006343101
Frame ID: A0DFC91A1226F0D15376109F644E322B
Requests: 18 HTTP requests in this frame

Frame: https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Frame ID: FDA464E4F2CE04E5FE8B6D16576C4C14
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20191112/r20190131/zrt_lookup.html
Frame ID: 5AF043DA02178DB34B8772C57A967FFC
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1459277723&w=468&lmt=1573857464&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&flash=0&wgl=1&dt=1573857464711&bpp=7&bdt=149&fdt=83&idt=83&shv=r20191112&cbv=r20190131&saldr=aa&abxe=1&correlator=453027684172&frm=20&pv=2&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&ga_fc=0&iag=0&icsg=206393356280&dssz=63&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=486&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065125&oid=3&pvsid=3992682346307461&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=6YV9SgWTZA&p=https%3A//www.giga.de&dtd=95
Frame ID: B45EA538FBFAD414830A6DCD0976FCEC
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1573857464&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1573857464718&bpp=4&bdt=156&fdt=115&idt=115&shv=r20191112&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=453027684172&frm=20&pv=1&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&ga_fc=0&iag=0&icsg=3302293700392&dssz=67&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065125&oid=3&pvsid=3992682346307461&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&dtd=119
Frame ID: E8D5E75712756B3A8191B6EC267E337E
Requests: 1 HTTP requests in this frame

Frame: https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Frame ID: F641D9A0D51CD2C97FEB476647CCB26A
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=413231862&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Frame ID: 58504AE32355D83CAEB4DC65399DD24C
Requests: 1 HTTP requests in this frame

Frame: https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Frame ID: 90C320CE73DFA35F128FB4828A61C84A
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstw9wry5MD1fOLngaB8FhbjXjHc8oraHQaVNPYzg-OKthgPVPdjxQxjTPychOfAEYabefHDXtr4VXkvxRe-Z5V5s16DU_wVmXvWejIkCKhoUL1MUspOYCRD576Oc6NIeu9YuYph1ROoImdnOOsWXWYwJFnc05eIq8oC7YkRDPrCh_F09tjpO38e4oZ2H2iAefHMgM2O8btaqtqhi_i-VH-u3CAkrZkHhA-o6uzmGVjsNMYQNdAbuIL_L2GjOVU2Gop_4vwai9rDZwsI2mD9TaR0YQ&sig=Cg0ArKJSzFqMXPyZNrhIEAE&urlfix=1&adurl=
Frame ID: 1D344677F2DB9F37DD9E29A181AF364E
Requests: 4 HTTP requests in this frame

Frame: https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=b6c551e1-ae71-4801-9a76-1505f1bcd460
Frame ID: 7E6825EB0097D6E5CF30F8ED7AC047DC
Requests: 13 HTTP requests in this frame

Frame: https://ih.adscale.de/map?format=display&ssl=1
Frame ID: FE9DF3A858B0D9FFA0322EBF21864461
Requests: 1 HTTP requests in this frame

Frame: https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=1D26B4B21450068731176809945&cicmp=1657475&cijs=1&dast=V7DfcCFgMauEugUItsDAQauEugUItsDAUAAAAGBvQHGzGizCakCWUxWg0Gs-FushgsN4vVcrcaTCHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3AhabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtfDgAAAAAPAEqF_RA_gAAAEQAAAAASAAAAABQBFf8WAhcAAAAAGAAFWD8aAFAcDOe6W192o8P1edn9AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA1VK7VvMI7tH9EVIBYxAgAAAAAkqnN42hSJ1QWVQAABOlWAFcAAAFucTcUMlm6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTYhozC0tiKWAV-0XEABg7RcQAIBN3QAA3gLggi4AVmcQk81oN5kdAAAAwN3___-_HsiMVo6Nw-MaDkaejcmzWjmMw5Fn4ls5TIvZyGXynt21hWn3nbN034iwzH7fQUE5PT1ml0HGcpkMaoGsaXL5DeKDhmE5GQTzm7DFaDWZbJbD2XIxGQxHw9FofwI3GuAEDYeDxW6w2C0Ww8liMhosBwsUiMEEJ2Q42kxWo91qN1kOJ6PRbDPZIEWrVrPRZjBczSaz3W41HAyXoxFStGYxm0wWs9FytxksJ6PBcDIcIkzuhpuZZeVc63Yj11o0G47cEodpsNaMLJOZy7McrSzDtej1MZ02xoXLs9yiYMDRXgQX6URzuvxdLstb87a4dU6fwyKWaE4W6UR22XdGK8fG4XENByPPxuRZrRzG4cgz8a0cpsVs5DL5m7vhZmZZOde63ci1Fs2GI7fEYRqsNSPLZObyLEcry3Aten1Mp41x4fIs943VbjNc7Uaz1b6x2m2Gq91ottp36Azf1edsVN60Co_MY3uWdLuZ06BwGSzen8S0mHZnB8_vd3SqVBeNsSH7JhRmg8dgUMQSwekinYhextNFLJE8LdKJZDJbrRarlXFiW65ctt1gsFgONy6XybAwbhyT4UQsUZou0ole97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtF_ceGGI3mutlcMVjONYNVAgAAAAAAAABYwpx5EwAAAIDTQBaLwWSxXAAIMdZdf-VRDm_uueTixo8h5nT5u1yWt-ZtceucPocB!&excid=22&tst=1&docw=0&cs=false
Frame ID: AD32FC28A2B890448975C57FCF6DB061
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuGKrcVxutBQLJAxtD78sjkKmlSv3j--HwEsvauSi7JpyzY0Ht2UjYQ5wL22erPot-pQdhHn8vWx_67d9Pm-iDm0vAiB_UxIfoTBYCvN8T6LzYbY930JEwmbWWZ5a4b09VQxpKrmLdMex6lve5rMNeHvgykh9mSZQuqT2rqLFWKbtQGCKD7wDpFSiB8n3S_o9lA7bQ4W0FYBVuFILo1P6TrOrHjMR5tro_9CMERaFe-NT9v3q5OOP2rG2A-pAszgJusKtV5xHb2RPsoV1MllUH1MBBBGylop8mAEjxFeMyzzAVazFQ7-FrZKAc&sig=Cg0ArKJSzBsoDSHIqPJBEAE&urlfix=1&adurl=
Frame ID: 1CA2FD6255541A3263AF0A0728B9D437
Requests: 6 HTTP requests in this frame

Frame: https://static.adsafeprotected.com/sca.17.4.95.js
Frame ID: A016E7881129DE71BECAC10279246B49
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuThGaecvm-iyVBxO-20HDJAZIozAyRsoc6xY1N3xM7Pp-sr930p2RCUpbm94hme6QZOwqrq0o1UT9Jg4nwkEGwkFZoqQbeBfqDBhiI_bbboOApaSNBe1IS3PkvM2NJXE3-lyX91EiRJHTX_3kZpGVK6RRl_URl8jxbUe0YLcL_UZxzjpyEbiZd3DMkWe60HySoDYkxr89LUdI7qud9lIyRK1bOv8SDCKjhOkERC6ujAqqx7n880WNyJZOl-6o-UzY8oINN5sXljY0ulfwkSF-orU60oWfBlSeSShChoDmsZR_s2Nlqfjyqz8c&sig=Cg0ArKJSzMIEJEOfUYXvEAE&urlfix=1&adurl=
Frame ID: A60D31CC0540EFA2B0A6A9945B83167E
Requests: 6 HTTP requests in this frame

Frame: https://static.adsafeprotected.com/sca.17.4.95.js
Frame ID: 2AC6DEECE2D77FFA2254EC6A075A30F5
Requests: 1 HTTP requests in this frame

Frame: data://truncated
Frame ID: 765194DA8A9E1249C8646832CCDBB82A
Requests: 1 HTTP requests in this frame

Frame: https://match.taboola.com/sync?dast=V7DfcCFgMauEugUItsDAQauEugUItsDAUAAAAGBvQHGzGizCakCWUxWg0Gs-FushgsN4vVcrcaTCHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3AhabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtfDgAAAAAPAEqF_RA_gAAAEQAAAAASAAAAABQBFf8WAhcAAAAAGAAFWD8aAFAcDOe6W192o8P1edn9AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA1VK7VvMI7tH9EVIBYxAgAAAAAkqnN42hSJ1QWVQAABOlWAFcAAAFucTcUMlm6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTYhozC0tiKWAV-0XEABg7RcQAIBN3QAA3gLggi4AVmcQk81oN5kdAAAAwN3___-_HsiMVo6Nw-MaDkaejcmzWjmMw5Fn4ls5TIvZyGXynt21hWn3nbN034iwzH7fQUE5PT1ml0HGcpkMaoGsaXL5DeKDhmE5GQTzm7DFaDWZbJbD2XIxGQxHw9FofwI3GuAEDYeDxW6w2C0Ww8liMhosBwsUiMEEJ2Q42kxWo91qN1kOJ6PRbDPZIEWrVrPRZjBczSaz3W41HAyXoxFStGYxm0wWs9FytxksJ6PBcDIcIkzuhpuZZeVc63Yj11o0G47cEodpsNaMLJOZy7McrSzDtej1MZ02xoXLs9yiYMDRXgQX6URzuvxdLstb87a4dU6fwyKWaE4W6UR22XdGK8fG4XENByPPxuRZrRzG4cgz8a0cpsVs5DL5m7vhZmZZOde63ci1Fs2GI7fEYRqsNSPLZObyLEcry3Aten1Mp41x4fIs943VbjNc7Uaz1b6x2m2Gq91ottp36Azf1edsVN60Co_MY3uWdLuZ06BwGSzen8S0mHZnB8_vd3SqVBeNsSH7JhRmg8dgUMQSwekinYhextNFLJE8LdKJZDJbrRarlXFiW65ctt1gsFgONy6XybAwbhyT4UQsUZou0ole97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtF_ceGGI3mutlcMVjONYNVAgAAAAAAAABYwpx5EwAAAIDTQBaLwWSxXAAIMdZdf-VRDm_uueTixo8h5nT5u1yWt-ZtceucPocB!&excid=22&docw=0&cijs=1
Frame ID: F2CA814C379E604BE294116E2B28E3DA
Requests: 1 HTTP requests in this frame

Frame: https://uss.xplosion.de/usersync?sid=65966&fpid=4209665556643396968
Frame ID: C331CE51CAC213BE3BCBFC1E696458F3
Requests: 1 HTTP requests in this frame

Frame: https://adstax-match.adrtx.net/activation?receiverId=adaud
Frame ID: DF15F19B7775A1D7BB97649A388BB9A6
Requests: 1 HTTP requests in this frame

Frame: https://ads.pubmatic.com/AdServer/js/showad.js
Frame ID: 1438CC2B182D48297558BBA75FEA2D98
Requests: 1 HTTP requests in this frame

Frame: https://cdn.districtm.io/ids/index.html
Frame ID: 4D6FCC7C5D3D582A852C18FD1E6443EF
Requests: 1 HTTP requests in this frame

Frame: https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Frame ID: C18F58E1C12CEFFD7DD86A28554928B8
Requests: 1 HTTP requests in this frame

Screenshot


Detected technologies

Overall confidence: 100%
Detected patterns
  • headers server /nginx(?:\/([\d.]+))?/i

Overall confidence: 100%
Detected patterns
  • script /googlesyndication\.com\//i

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

Overall confidence: 100%
Detected patterns
  • html /<iframe[^>]* (?:id="comscore"|scr=[^>]+comscore)|\.scorecardresearch\.com\/beacon\.js|COMSCORE\.beacon/i
  • script /\.scorecardresearch\.com\/beacon\.js|COMSCORE\.beacon/i

Page Statistics

220
Requests

99 %
HTTPS

20 %
IPv6

67
Domains

105
Subdomains

80
IPs

9
Countries

2395 kB
Transfer

7637 kB
Size

36
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 12
  • https://ssl-econa.met.vgwort.de/na/c50e6523a40d4ebda6d075c30346eeff HTTP 302
  • https://ssl-econa.met.vgwort.de/blank.gif
Request Chain 16
  • https://cdn.m6r.eu/sync/api HTTP 302
  • https://tracking.m6r.eu/sync/api?checkcookies=true
Request Chain 18
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0015&i2=0015969c7bbd76f9a5dcf28b8&ep=1596200571&vr=415&id=sxnjyl&i3=0015969c7bbd76f9a5dcf28b8%3A1600641464610%3A1573857464610%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1573857464610&n1=3&dntt=0&lt=1573857464612&ev=&cs=uqs7p5&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0015&i2=0015969c7bbd76f9a5dcf28b8&ep=1596200571&vr=415&id=sxnjyl&i3=0015969c7bbd76f9a5dcf28b8%3A1600641464610%3A1573857464610%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1573857464610&n1=3&dntt=0&lt=1573857464612&ev=&cs=uqs7p5&mo=1&sr=71
Request Chain 26
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software HTTP 302
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Request Chain 31
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F HTTP 302
  • https://nugmw.userreport.com/rc-ap/54e5aab1-0de9-44e6-a69b-97ed84e8d58a/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F
Request Chain 76
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=831c33358ecbd0f2ccffa910b98a4397&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D831c33358ecbd0f2ccffa910b98a4397%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=831c33358ecbd0f2ccffa910b98a4397&userId=adscale-user:6898c7d418424225bf66be962d28c288
Request Chain 77
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=gxwzNY7L0PLM_6kQuYpDlw HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 100
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox HTTP 302
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Request Chain 101
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1573857465188&ns_c=UTF-8&cv=3.1&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&c9= HTTP 302
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1573857465188&ns_c=UTF-8&cv=3.1&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&c9=
Request Chain 110
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjst_D1ShoprrZuLPkLMF9VD9b2Go9jPujog8sGpGccTXL0Ge1oXmWWBzsVrVrNZXBX8rcUdT3AjLs0qETR4rL5Ai-Y3k-fHBCcC_Rxn2yrS5JkAvbhz3vDNxZzDPbA1UWA8KOsOlDkdRPKyrLHfflJC0NFPQJXaqcoiabt-S10sH4SkIadTF7fx8AEP3XjfxNT2UrDL32QR6Y43q3H-Oqa8xQR_0PURrP6ynEA4X9XjX0MzBiinLKa8RibukcI6Td5gA93IE9y7Lq4JiFtobfA&sig=Cg0ArKJSzJ4_Ag8T0JU2EAE&urlfix=1&adurl=//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif HTTP 302
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Request Chain 123
  • https://rtb.mfadsrvr.com/sync?ssp=taboola HTTP 302
  • https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola HTTP 302
  • https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=b6c551e1-ae71-4801-9a76-1505f1bcd460
Request Chain 125
  • https://px.powerlinks.com/user/identify?sourceId=d4a7a706-ab0f-11e8-a038-127202fb7690&rurl=https%3A%2F%2Ftrc.taboola.com%2Fsg%2Fpowerlinksdsp-network%2F1%2Frtb-h%2F%3Ftaboola_hm%3D%24%7BUSER%7D HTTP 302
  • https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=JdgPUsHj8biOgJWQBf_QO1GabB1zY_ZjWl3C0zswM3c%3D
Request Chain 126
  • https://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID] HTTP 302
  • https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=c5875dcf-22df-4f00-9d88-34defa549765 HTTP 302
  • https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=c5875dcf-22df-4f00-9d88-34defa549765&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3Dc5875dcf-22df-4f00-9d88-34defa549765
Request Chain 127
  • https://bh.contextweb.com/bh/rtset?pid=562107&ev=1&rurl=https%3A%2F%2Ftrc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=%%VGUID%% HTTP 302
  • https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=0Hi759cFn7ac&ev=1&pid=562107
Request Chain 129
  • https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm&google_sc HTTP 302
  • https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEO1JYeLatDVBZVz-S52NC6A&google_cver=1 HTTP 302
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEO1JYeLatDVBZVz-S52NC6A&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3DCAESEO1JYeLatDVBZVz-S52NC6A%26google_cver%3D1
Request Chain 131
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1 HTTP 302
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=054f32o&ttd_tpi=1 HTTP 302
  • https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=00416bb9-6233-4344-a5c6-65a0787c7a34 HTTP 302
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=00416bb9-6233-4344-a5c6-65a0787c7a34&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D00416bb9-6233-4344-a5c6-65a0787c7a34
Request Chain 132
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39 HTTP 302
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=1f5b313a-f830-4a37-af11-964dc6e7f647 HTTP 302
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=1f5b313a-f830-4a37-af11-964dc6e7f647&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D1f5b313a-f830-4a37-af11-964dc6e7f647
Request Chain 135
  • https://x.bidswitch.net/sync?ssp=taboola HTTP 302
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola HTTP 302
  • https://u.ipw.metadsp.co.uk/sync?ssp=bidswitch&bidswitch_ssp_id=taboola&bsw_user_id=7cfeeee4-2fe5-4a95-9544-7953fda7eed5&bsw_param=7cfeeee4-2fe5-4a95-9544-7953fda7eed5&gdpr=&gdpr_consent= HTTP 302
  • https://x.bidswitch.net/sync?dsp_id=339&expires=14&user_group=0&user_id=&ssp=taboola&bsw_param=7cfeeee4-2fe5-4a95-9544-7953fda7eed5 HTTP 302
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=7cfeeee4-2fe5-4a95-9544-7953fda7eed5 HTTP 302
  • https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=7cfeeee4-2fe5-4a95-9544-7953fda7eed5&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D7cfeeee4-2fe5-4a95-9544-7953fda7eed5
Request Chain 141
  • https://track.adform.net/adfserve/?bn=33683028;1x1inv=1;srctype=3;ord=1573857465 HTTP 302
  • https://track.adform.net/adfserve/?CC=1&bn=33683028;1x1inv=1;srctype=3;ord=1573857465 HTTP 302
  • https://m.exactag.com/ai.aspx?tc=8d94023d893b6f61389437d4033a9fa0&rnd=44033
Request Chain 154
  • https://fw.adsafeprotected.com/rfw/www.googletagservices.com/346702/39754022/dcm/dcmads.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&adsafe_type=abdfq&adsafe_jsinfo=,id:4ab0d7a7-cb9b-4c17-f3b6-646d458a0632,c:u5a468,sl:inView,em:true,fr:true,mn:app27ami,pt:1-5-15,wc:0.0.1600.1200,ac:1318.121.160.600,am:i,cc:1318.121.160.600,piv:100,obst:0,th:0,reas:,br:u,abv:na,an:n,scm:forwrd1,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754022,idMap:1g*,pl:,rend:0,renddet:WINDOW,rmeas:0,es:0,sc:1,ha:1,gm:0,tt:rjss,thd:1,et:18,oid:8b262d07-07f8-11ea-abd7-382c4ac63055,v:19.8.27,sp:0,wr:1600.1200,sr:1600.1200,ov:0 HTTP 302
  • https://static.adsafeprotected.com/skeleton.js
Request Chain 166
  • https://fw.adsafeprotected.com/rfw/www.googletagservices.com/346702/39754020/dcm/dcmads.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&adsafe_type=abdfq&adsafe_jsinfo=,id:301f1fa4-5802-8636-9560-d9f5832ac8bf,c:u5a48t,sl:inView,em:true,fr:true,mn:app27ami,pt:1-5-15,wc:0.0.1600.1200,ac:968.438.300.250,am:i,cc:968.438.300.250,piv:100,obst:0,th:0,reas:,br:u,abv:na,an:n,scm:forwrd1,fm:rHW1x9y+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g1|1h*.346702-39754020,idMap:1h*,pl:,rend:0,renddet:WINDOW,rmeas:0,es:0,sc:1,ha:1,gm:0,tt:rjss,thd:1,et:17,oid:8b3ce923-07f8-11ea-ab37-382c4ac63055,v:19.8.27,sp:0,wr:1600.1200,sr:1600.1200,ov:0 HTTP 302
  • https://static.adsafeprotected.com/skeleton.js
Request Chain 185
  • https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent HTTP 302
  • https://cx.atdmt.com/?c=11802502823519460259&f=AYyr4j2mdI5Ao6QbLsA8cYFTS9wl806bKsjTLwpn0NhllUOT0IAEbTg0MESGF8vLQKrPYvFgyUvHJZu9M4JonFO_&id=1773162896260346&l=3&v=0
Request Chain 204
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBsJ0Ws_CWD_ABiUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D HTTP 307
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4209665556643396968
Request Chain 219
  • https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1 HTTP 302
  • https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1

220 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
141 KB
55 KB
Document
General
Full URL
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
7ba19669fe546fea2ebab0aa2d803bb851d9530ecc45996aa08d1e2960079ac8

Request headers

:method
GET
:authority
www.giga.de
:scheme
https
:path
/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
sec-fetch-mode
navigate
sec-fetch-user
?1
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
none
accept-encoding
gzip, deflate, br
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
Sec-Fetch-Mode
navigate
Sec-Fetch-User
?1

Response headers

status
200
server
nginx
content-type
text/html;charset=UTF-8
vary
Accept-Encoding
date
Fri, 15 Nov 2019 22:37:44 GMT
x-page-speed
1.13.35.2-0
cache-control
max-age=0, no-cache
content-encoding
gzip
source-sans-pro-v11-latin-700.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
15 KB
15 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-700.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
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
Fri, 15 Nov 2019 22:37:44 GMT
last-modified
Fri, 15 Nov 2019 11:56:36 GMT
server
nginx
accept-language
bytes
etag
"5dce9274-3c78"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15480
expires
Sat, 14 Nov 2020 22:37:44 GMT
source-sans-pro-v11-latin-600.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
15 KB
16 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-600.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
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
Fri, 15 Nov 2019 22:37:44 GMT
last-modified
Fri, 15 Nov 2019 11:56:36 GMT
server
nginx
accept-language
bytes
etag
"5dce9274-3da8"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15784
expires
Sat, 14 Nov 2020 22:37:44 GMT
source-sans-pro-v11-latin-regular.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
16 KB
16 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-regular.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
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
Fri, 15 Nov 2019 22:37:44 GMT
last-modified
Fri, 15 Nov 2019 11:56:36 GMT
server
nginx
accept-language
bytes
etag
"5dce9274-3e24"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15908
expires
Sat, 14 Nov 2020 22:37:44 GMT
metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
js.stroeermediabrands.de/
239 KB
58 KB
Script
General
Full URL
https://js.stroeermediabrands.de/metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
46.253.113.178 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
c2c8bfa63d2daf183b2fd7d4a8e9959fdf5162caa2559ab12a587e809225d9e5

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
content-encoding
gzip
last-modified
Fri, 15 Nov 2019 15:45:39 GMT
server
nginx/1.14.1
vary
Accept-Encoding
content-type
application/javascript
status
200
cache-control
max-age=31536000, public immutable max-age=31536000
expires
Sat, 14 Nov 2020 22:37:44 GMT
lux.js
cdn.speedcurve.com/js/
19 KB
7 KB
Script
General
Full URL
https://cdn.speedcurve.com/js/lux.js?id=131387135
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.217 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
Apache /
Resource Hash
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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=15768000
content-encoding
gzip
age
12747
x-cache
HIT
status
200
content-length
6462
x-served-by
cache-hhn4034-HHN
access-control-allow-origin
*
last-modified
Fri, 15 Nov 2019 19:05:17 GMT
server
Apache
x-timer
S1573857465.586686,VS0,VE0
date
Fri, 15 Nov 2019 22:37:44 GMT
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
via
1.1 varnish
expires
Sat, 16 Nov 2019 19:05:17 GMT
cache-control
max-age=86400
accept-ranges
bytes
timing-allow-origin
*
x-cache-hits
3663
pre-a4c7814ded.js
www.giga.de/static-local/dist/assets/js/
33 KB
10 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/pre-a4c7814ded.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
44d7369fc09a46365cbcb93654cf3c7bc4c9acb4a7f89e9ea398896656f427aa

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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, 14 Nov 2019 15:56:44 GMT
content-encoding
gzip
x-original-content-length
33338
server
nginx
status
200
etag
W/"5dcd78ff-823a"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
10404
expires
Fri, 13 Nov 2020 15:56:43 GMT
main-desktop-82026d3d61.css
www.giga.de/static-local/dist/assets/css/
400 KB
53 KB
Stylesheet
General
Full URL
https://www.giga.de/static-local/dist/assets/css/main-desktop-82026d3d61.css
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
5ed3ceb54a7225735cdd39256fa3566dfc0827732a4c7f12089d6fcc7a71dd82

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Tue, 12 Nov 2019 08:59:45 GMT
content-encoding
gzip
x-original-content-length
409395
server
nginx
status
200
etag
W/"5dca7444-63f33"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/css
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
53826
expires
Wed, 11 Nov 2020 08:59:45 GMT
iam.js
script.ioam.de/
34 KB
11 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.64 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script3.ioam.de
Software
nginx / BLACKBIRD-SRC v0.10 0015
Resource Hash
c76adeb0e2c9b27a1089106e5b66f2e8da525d22255020a39095c870a682f102

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
Content-Encoding
gzip
Last-Modified
Fri, 15 Nov 2019 22:37:44 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 0015
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
private, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Sat, 16 Nov 2019 00:37:44 GMT
trackcp.js
gocp.stroeermediabrands.de/
28 KB
11 KB
Script
General
Full URL
https://gocp.stroeermediabrands.de/trackcp.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.16.106 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.106.16.40.188.clients.your-server.de
Software
/
Resource Hash
9cc497bc619324d17e01cd772c713cb796aeb0cd31a200a674dee1a96aab9d8d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
Content-Encoding
gzip
Last-Modified
Tue, 12 Nov 2019 08:27:24 GMT
ETag
"5dca6cec-6fa7"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=86400, max-age=31536000, public
X-Machine
hn86 gocp env
Accept-Ranges
bytes
Expires
Sat, 16 Nov 2019 22:37:44 GMT
martin-maciej-rcm40x40.jpg
static.giga.de/wp-content/uploads/2013/04/
1 KB
2 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2013/04/martin-maciej-rcm40x40.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
505b170e929bca71e7fec8a2bff588459b60e1e9bc99e6f68443d29b3cd73335
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Sat, 19 Oct 2019 14:40:48 GMT
x-content-type-options
nosniff
age
2361416
filer-source
006b20bf795e02b1f61b38f96553d06c747714f668d1b32549e4adaaaf107b9d
x-cache
HIT
status
200
accept-language
bytes
content-length
1215
x-xss-protection
1; mode=block
last-modified
Sat, 19 Oct 2019 14:40:48 GMT
server
nginx/1.10.3
filer-attr
W1s0MCw0MF0sInNodXR0bGUtdjEiLFsiRlJBLTEiXSxbIkZSQi0xIl1d
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 18 Nov 2019 14:40:48 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
104 KB
38 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
797d081d5d1cf52578e5286bb19c0d62adc09b0556171dcec2003b1e80bee59d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
37760
x-xss-protection
0
server
cafe
etag
13760168803934058634
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Fri, 15 Nov 2019 22:37:44 GMT
1.gif
www.gstatic.com/psa/static/
53 B
174 B
Image
General
Full URL
https://www.gstatic.com/psa/static/1.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:818::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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, 31 Oct 2019 10:17:38 GMT
x-content-type-options
nosniff
last-modified
Tue, 22 Oct 2019 18:15:00 GMT
server
sffe
age
1340406
content-type
image/gif
status
200
cache-control
public, max-age=31536000
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
53
x-xss-protection
0
expires
Fri, 30 Oct 2020 10:17:38 GMT
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
  • https://ssl-econa.met.vgwort.de/na/c50e6523a40d4ebda6d075c30346eeff
  • https://ssl-econa.met.vgwort.de/blank.gif
43 B
310 B
Image
General
Full URL
https://ssl-econa.met.vgwort.de/blank.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
161.156.66.178 , United States, ASN36351 (SOFTLAYER - SoftLayer Technologies Inc., US),
Reverse DNS
b2.42.9ca1.ip4.static.sl-reverse.com
Software
s2.50.19 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

Access-Control-Allow-Origin
*
Date
Fri, 15 Nov 2019 22:37:44 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
s2.50.19
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

Date
Fri, 15 Nov 2019 22:37:44 GMT
Last-Modified
Fri, 15 Nov 2019 22:37:44 GMT
Server
s2.50.19
Access-Control-Allow-Origin
*
Transfer-Encoding
chunked
Content-Type
text/html
Location
/blank.gif
Cache-Control
max-age=0, no-cache, must-revalidate, proxy-revalidate
Connection
keep-alive
Expires
Tue, 22 Aug 2000 15:05:01 GMT
tr
www.facebook.com/
44 B
350 B
Image
General
Full URL
https://www.facebook.com/tr?id=1773162896260346&ev=PageView&noscript=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 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-23=":443"; ma=3600
content-length
44
expires
Fri, 15 Nov 2019 22:37:44 GMT
analytics.js
www.google-analytics.com/
43 KB
17 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-a4c7814ded.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Mon, 19 Aug 2019 17:22:41 GMT
server
Golfe2
age
247
date
Fri, 15 Nov 2019 22:33:37 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
17803
expires
Sat, 16 Nov 2019 00:33:37 GMT
apstag.js
c.amazon-adsystem.com/aax2/
86 KB
25 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/apstag.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-a4c7814ded.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.86.250 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-86-250.fra2.r.cloudfront.net
Software
Server /
Resource Hash
f623e1d423f85d8c36affb7faf68d0b804e0389e2621de2ea9eb97bb0df21c76

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 21:29:42 GMT
content-encoding
gzip
server
Server
age
4082
etag
be7f8341d4f7676793a79e413ef9eafd
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
x-amz-cf-pop
FRA2-C2
accept-ranges
bytes
x-amz-cf-id
iP2RAmI-mT-zqvbk4C61s-JzPsYwbbz2KTibscH6v1lh615REzxS2g==
via
1.1 f8fe53d5464b299529d281799da8de30.cloudfront.net (CloudFront)
api
tracking.m6r.eu/sync/
Redirect Chain
  • https://cdn.m6r.eu/sync/api
  • https://tracking.m6r.eu/sync/api?checkcookies=true
1 KB
1 KB
Script
General
Full URL
https://tracking.m6r.eu/sync/api?checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
Content-Encoding
gzip
Last-Modified
Mon, 28 Oct 2019 15:44:15 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
654

Redirect headers

Pragma
no-cache
Date
Fri, 15 Nov 2019 22:37:44 GMT
Server
nginx
Vary
Accept
Content-Type
text/plain; charset=utf-8
Location
https://tracking.m6r.eu/sync/api?checkcookies=true
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
72
Expires
Fri, 15 Nov 2019 22:37:44 GMT
identitystatus
irqs.ioam.de/
25 B
203 B
XHR
General
Full URL
https://irqs.ioam.de/identitystatus?offerIdentifier=giga&siteIdentifier=software_content&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.551837739733505
Requested by
Host: script.ioam.de
URL: https://script.ioam.de/iam.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
193.46.63.75 Alfter, Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
irqs.ioam.de
Software
nginx /
Resource Hash
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
server
nginx
status
200
vary
Origin
content-type
application/vnd.api+json
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
strict-transport-security
max-age=15768000
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0015&i2=0015969c7bbd76f9a5dcf28b8&ep=1596200571&vr=415&i...
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0015&i2=0015969c7bbd76f9a5dcf28b8&ep=1596200571&vr=415&i...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0015&i2=0015969c7bbd76f9a5dcf28b8&ep=1596200571&vr=415&id=sxnjyl&i3=0015969c7bbd76f9a5dcf28b8%3A1600641464610%3A1573857464610%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1573857464610&n1=3&dntt=0&lt=1573857464612&ev=&cs=uqs7p5&mo=1&sr=71
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.65 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de3.ioam.de
Software
nginx / BLACKBIRD-RCV v1.05.0 0029
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.05.0 0029
Transfer-Encoding
chunked
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/x-javascript
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies

Redirect headers

Date
Fri, 15 Nov 2019 22:37:44 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.05.0 0029
Transfer-Encoding
chunked
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Connection
keep-alive
Pragma
no-cache
Last-Modified
Fri, 15 Nov 2019 22:37:44 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/tx.io?st=giga&cp=software_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0015&i2=0015969c7bbd76f9a5dcf28b8&ep=1596200571&vr=415&id=sxnjyl&i3=0015969c7bbd76f9a5dcf28b8%3A1600641464610%3A1573857464610%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1573857464610&n1=3&dntt=0&lt=1573857464612&ev=&cs=uqs7p5&mo=1&sr=71
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Thu, 15 Nov 2018 22:37:44 GMT
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
10 KB
10 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/fontello/fontello.woff2?53628368
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
1c3b2ef5bd8dd65a075f5e2e01b69421c16206237d55d600be9011b1cb29442f

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/static-local/dist/assets/css/main-desktop-82026d3d61.css
Origin
https://www.giga.de
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
Fri, 15 Nov 2019 22:37:44 GMT
last-modified
Fri, 15 Nov 2019 11:56:36 GMT
server
nginx
accept-language
bytes
etag
"5dce9274-265c"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
9820
expires
Sat, 14 Nov 2020 22:37:44 GMT
lazyload-65c07b80e0.min.js
www.giga.de/static-local/dist/assets/js/vendor/lazyload/
5 KB
2 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/lazyload/lazyload-65c07b80e0.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
69e942532f5c4b64fd68a98c15a62eb5d6fd6cb864282fa9a0c11ead2cdc9268

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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 May 2019 08:30:16 GMT
content-encoding
gzip
x-original-content-length
5207
server
nginx
status
200
etag
W/"5cee42b6-1457"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2015
expires
Thu, 28 May 2020 08:30:15 GMT
2006343101
videos.giga.de/embed/ Frame A0DF
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/2006343101
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
ad1f6634283eb148dcac35d61100f05ee75811bf5983816785185976c8cb26b5

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/2006343101
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
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
same-site
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
cookie
ioam2018=0015969c7bbd76f9a5dcf28b8:1600641464610:1573857464610:.giga.de:2:giga:software_content:noevent:1573857464610:tz47c7
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
server
nginx/1.14.1
date
Fri, 15 Nov 2019 22:37:44 GMT
content-type
text/html;charset=UTF-8
content-encoding
gzip
js
www.google-analytics.com/gtm/
58 KB
22 KB
Script
General
Full URL
https://www.google-analytics.com/gtm/js?id=GTM-KRW4T6J&t=gt1&cid=958900569.1573857465&aip=true
Requested by
Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
f6b9ce87b489624061f59fc26b2a1e7ef25238fac783c04df7c5e7e36cdbaf27
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
content-encoding
br
last-modified
Fri, 15 Nov 2019 21:00:00 GMT
server
Google Tag Manager
access-control-allow-headers
Cache-Control
status
200
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
http://www.googletagmanager.com
cache-control
private, max-age=900
access-control-allow-credentials
true
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
21957
x-xss-protection
0
expires
Fri, 15 Nov 2019 22:37:44 GMT
init
d.nativendo.de/cds/delivery/
991 B
918 B
Script
General
Full URL
https://d.nativendo.de/cds/delivery/init
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
b71ee50d2aefd4b9241ffd0a8a229552e4269cdb8ad05a4a097c8c72c3cdd05b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 15 Nov 2019 22:37:44 GMT
content-encoding
gzip
last-modified
Fri, 15 Nov 2019 22:37:44 GMT
server
Apache
vary
Accept-Encoding
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
516
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
3 KB
XHR
General
Full URL
https://c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.86.250 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-86-250.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 13:47:26 GMT
content-encoding
gzip
vary
Origin
age
31881
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
*
last-modified
Fri, 01 Nov 2019 13:46:13 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
via
1.1 58b222ebbb6cc6c8c8c9a46127ae3a3e.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA2-C2
x-amz-cf-id
pvip5iSVKrZX4goROgFSvrqXxywvIHrEQnkLSo3z3FbKsRco-QzWWw==
z.js
go.giga-abs.de/
1 KB
1 KB
Script
General
Full URL
https://go.giga-abs.de/z.js?0.3455261104973595
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
X-Content-Type-Options
nosniff
Last-Modified
Fri, 15 Nov 2019 22:37:44 GMT
Server
X/1.0
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Content-Length
1040
Expires
Sat, 16 Nov 2019 22:37:36 GMT
Cookie set iframe
tracking.m6r.eu/pixel/ Frame FDA4
Redirect Chain
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
0
0
Document
General
Full URL
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash

Request headers

Host
tracking.m6r.eu
Connection
keep-alive
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
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Accept-Encoding
gzip, deflate, br
Cookie
test=true
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

Server
nginx
Content-Type
text/html; charset=utf-8
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Content-Encoding
gzip
Date
Fri, 15 Nov 2019 22:37:44 GMT
Content-Length
1532
Connection
keep-alive
Vary
Accept-Encoding
Set-Cookie
id=2d26769b6bb55c322caa1c33051aad1e; Max-Age=7776000; Domain=m6r.eu; Path=/; Expires=Thu, 13 Feb 2020 22:37:44 GMT

Redirect headers

Server
nginx
Content-Type
text/html; charset=utf-8
Content-Length
302
Location
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Date
Fri, 15 Nov 2019 22:37:44 GMT
Connection
keep-alive
Set-Cookie
test=true; Max-Age=3600; Domain=m6r.eu; Path=/; Expires=Fri, 15 Nov 2019 23:37:44 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
51 KB
16 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
8fcfc1b11efe36a9e89116d2a5e49bd86f2426bfc61032c3019ea790021f7e68
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"338 / 925 of 1000 / last-modified: 1573848417"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
15660
x-xss-protection
0
expires
Fri, 15 Nov 2019 22:37:44 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
297 KB
92 KB
Script
General
Full URL
https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.8 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-8.fra2.r.cloudfront.net
Software
/ Express
Resource Hash
9f505e31c5589a466c4344fb5e4ade4c7c8ca3291dc1fc30f004df27bd38c4b0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 19:40:16 GMT
content-encoding
gzip
age
10648
status
200
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=10800
x-amz-cf-pop
FRA2-C1
x-amz-cf-id
b4veCTpUExab0M_01nXtFmpbYxcEjvADygodvsM5505b1t_vZVMdAg==
via
1.1 d8eef512ab23f23f549b4cd25ac5328d.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
124 KB
48 KB
Script
General
Full URL
https://s400.mxcdn.net/bb-mx/serve/mtrcs_679600.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.67 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-67.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Cache-Control
public, max-age=7200
Connection
keep-alive
Content-Type
text/javascript
Content-Length
49094
Expires
Sat, 16 Nov 2019 00:37:44 GMT
dmp
tracking.m6r.eu/sync/
97 B
599 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
ba8a31dbe8e6a1c838c63c0ce99fa7e147570b5674f08d65b5dcfc5d979ef2b4

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
108
nuggad
nugmw.userreport.com/rc-ap/54e5aab1-0de9-44e6-a69b-97ed84e8d58a/si.nuggad.net/
Redirect Chain
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F
  • https://nugmw.userreport.com/rc-ap/54e5aab1-0de9-44e6-a69b-97ed84e8d58a/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecial...
2 KB
2 KB
Script
General
Full URL
https://nugmw.userreport.com/rc-ap/54e5aab1-0de9-44e6-a69b-97ed84e8d58a/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2156:e800:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
99129e2ded9b089496faf07cd01db4f88b131f81ddde8641bbd035a089bc6d0e

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
via
1.1 cdb2dba3874dd4d7b53213b8c63a0997.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA50-C1
access-control-allow-methods
get, post, options
content-type
text/javascript
status
200
cache-control
s-maxage=0, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
1822
x-amz-cf-id
OMuWv5mrCYV2NTTlLg1IqKlSTH_NGZ6tC3gzNRldon7qQ4NJ-fyZ6g==

Redirect headers

date
Fri, 15 Nov 2019 22:37:44 GMT
via
1.1 ba77f90aac0ddbc2c4c2c02062fac762.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA50-C1
status
302
access-control-allow-methods
get, post, options
location
https://nugmw.userreport.com/rc-ap/54e5aab1-0de9-44e6-a69b-97ed84e8d58a/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F
cache-control
s-maxage=0, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
0
x-amz-cf-id
n_SLOVlDgb3TQGAoJEvU3DET-ImSJuIPr3R2WooXFVwrlPRw95mdEA==
ad-loading.gif
www.dunkirkinception.com/detect/
130 B
441 B
Image
General
Full URL
https://www.dunkirkinception.com/detect/ad-loading.gif?p=images/
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.29.62 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-29-62.eu-central-1.compute.amazonaws.com
Software
/ TSAdServer
Resource Hash
d25de6a4ccc6e0327d210390aa123ca3cfb05665c52e6ed1d76e7410d7c05938

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Origin
https://www.giga.de
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
Fri, 15 Nov 2019 22:37:44 GMT
X-Powered-By
TSAdServer
ETag
W/"82-tzBuJ0mAW2N+C0KmA6GTxMh0ZnM"
Content-Type
image/png
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
X-Robots-Tag
noindex, nofollow
Content-Length
130
tag.js
js.agkn.com/prod/v0/
3 KB
3 KB
Script
General
Full URL
https://js.agkn.com/prod/v0/tag.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:21f3:5c00:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 20:23:32 GMT
via
1.1 e1e056e45a0f8d6bc22b223900511170.cloudfront.net (CloudFront)
last-modified
Tue, 22 Oct 2019 20:22:52 GMT
server
AmazonS3
age
26051
etag
"f53f55cbab099be3a970b446a66c496a"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA2-C2
accept-ranges
bytes
content-length
3167
x-amz-cf-id
1-oC_-sgVPzE08VxhmOJvUt0f5st-MxeTzPN2tXd3eezkLfReVZgMg==
config.json
gocp.stroeermediabrands.de/absconf/www.giga.de/
18 KB
18 KB
Fetch
General
Full URL
https://gocp.stroeermediabrands.de/absconf/www.giga.de/config.json?c=1573857464
Requested by
Host: gocp.stroeermediabrands.de
URL: https://gocp.stroeermediabrands.de/trackcp.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.16.106 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.106.16.40.188.clients.your-server.de
Software
/
Resource Hash
eca210371fbe17ddbfcfb8d878dabbf4b5904f334abdf1aecd5f593b94cb7bbb

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

Access-Control-Allow-Origin
*
Date
Fri, 15 Nov 2019 22:37:44 GMT
Cache-Control
max-age=31536000, public
X-Machine
hn87 gocp env
Transfer-Encoding
chunked
Content-Type
application/json; charset=UTF-8
integrator.js
adservice.google.de/adsid/
109 B
778 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.giga.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

timing-allow-origin
*
date
Fri, 15 Nov 2019 22:37:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
integrator.js
adservice.google.com/adsid/
109 B
778 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.giga.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

timing-allow-origin
*
date
Fri, 15 Nov 2019 22:37:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20191112/r20190131/
242 KB
89 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20191112/r20190131/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
d7c3238b2195fb180a902a65cbe1fbb8f174f042f9df4a0f31dc60ebadef26f3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
90810
x-xss-protection
0
server
cafe
etag
587599329212413762
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Fri, 15 Nov 2019 22:37:44 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20191112/r20190131/ Frame 5AF0
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20191112/r20190131/zrt_lookup.html
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/html/r20191112/r20190131/zrt_lookup.html
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
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
vary
Accept-Encoding
date
Tue, 12 Nov 2019 15:12:21 GMT
expires
Tue, 26 Nov 2019 15:12:21 GMT
content-type
text/html; charset=UTF-8
etag
17893446177683960593
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
7725
x-xss-protection
0
cache-control
public, max-age=1209600
age
285923
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
post-33dedcb970.js
www.giga.de/static-local/dist/assets/js/bundle/
7 KB
3 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/bundle/post-33dedcb970.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
546390dabb77f8ffa37721249a74cd4ac7e117b65a2860d797821c14c16e3cab

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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, 14 Nov 2019 14:48:07 GMT
content-encoding
gzip
x-original-content-length
7105
server
nginx
status
200
etag
W/"5dcd68dc-1bc1"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2689
expires
Fri, 13 Nov 2020 14:48:07 GMT
giga-772cc0e021.js
www.giga.de/static-local/dist/assets/js/bundle/
31 KB
12 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/bundle/giga-772cc0e021.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
89b7e20cf73c5d61af4ae659c63f2eab235dd32a1dce673b5e6c3d47be59d6ef

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Tue, 05 Nov 2019 09:50:15 GMT
content-encoding
gzip
x-original-content-length
31296
server
nginx
status
200
etag
W/"5dc14599-7a40"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
11732
expires
Wed, 04 Nov 2020 09:50:15 GMT
smb-phone-plan-ef34ebe4f8.js
www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/
53 KB
18 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/smb-phone-plan-ef34ebe4f8.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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, 11 Sep 2019 09:34:16 GMT
content-encoding
gzip
x-original-content-length
54000
server
nginx
status
200
etag
W/"5d78bf3c-d2f0"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
18237
expires
Thu, 10 Sep 2020 09:34:16 GMT
article-rating-7143c629e5.js
www.giga.de/static-local/dist/assets/js/components/
306 B
534 B
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/components/article-rating-7143c629e5.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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, 28 Mar 2019 00:02:44 GMT
content-encoding
gzip
x-original-content-length
306
server
nginx
accept-language
bytes
status
200
etag
"5c9a4313-132"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
234
expires
Fri, 27 Mar 2020 00:02:44 GMT
loader.js
c.nativendo.de/cdn/asset/js/
54 KB
17 KB
Script
General
Full URL
https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Requested by
Host: d.nativendo.de
URL: https://d.nativendo.de/cds/delivery/init
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:ac0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
af9e05e18a2be5ae5a15505e259ae486da5030111e991c9d1bc5060fcd938221

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
via
1.1 google
cf-cache-status
HIT
age
1519058
cf-polished
origSize=55238
status
200
content-encoding
br
alt-svc
clear
cf-bgj
minify
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=31536000
cf-ray
5364b6230ac65982-VIE
expires
Wed, 28 Oct 2020 08:40:03 GMT
collect
www.google-analytics.com/r/
35 B
111 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=1076815648&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=6GBAAEADQ~&jid=1407346342&gjid=1547931220&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&_r=1&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&z=1573103794
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 15 Nov 2019 22:37:44 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
109 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1076815648&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEADQ~&jid=&gjid=&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd21=auto&cm17=1&cd18=4282584&z=849548494
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 01 Nov 2019 09:12:57 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1257887
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
videojs-ff0ddd6c.min.js
videos.giga.de/dist/js/embed/bundle/ Frame A0DF
618 KB
206 KB
Script
General
Full URL
https://videos.giga.de/dist/js/embed/bundle/videojs-ff0ddd6c.min.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/2006343101
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
56a110fa4752f768e35dbf197411e19faebf4c8eb59ee8545cc019dc61a1f0be

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/2006343101
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
Fri, 15 Nov 2019 22:37:44 GMT
content-encoding
gzip
last-modified
Thu, 24 Oct 2019 09:14:02 GMT
server
nginx/1.14.1
etag
W/"5db16b5a-9a933"
content-type
application/javascript
status
200
cache-control
max-age=315360000
expires
Thu, 31 Dec 2037 23:55:55 GMT
ima3.js
imasdk.googleapis.com/js/sdkloader/ Frame A0DF
272 KB
93 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/2006343101
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
4d588963907bf497aa95ee590a91e2a00970801b85b4347994230099d86e62d9
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/2006343101
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
Fri, 15 Nov 2019 22:37:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
94757
x-xss-protection
0
expires
Fri, 15 Nov 2019 22:37:44 GMT
ad.ytn.Xe0_BSUrLx6.gif
www.giga.de/images/
71 B
474 B
Image
General
Full URL
https://www.giga.de/images/ad.ytn.Xe0_BSUrLx6.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx / TSAdServer
Resource Hash
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
server
nginx
x-powered-by
TSAdServer
etag
W/"47-ZTbJFDBdJipLHHeF7Zqsus3A1Hc"
content-type
image/png
status
200
cache-control
no-cache, no-store, must-revalidate, no-cache="set-cookie"
x-robots-tag
noindex, nofollow
content-length
71
container
tracking.m6r.eu/pixel/
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=89ceb345-90db-4a47-a654-84bb00b8ca2c&smb_sp=&smb_ch=software
Requested by
Host: tracking.m6r.eu
URL: https://tracking.m6r.eu/sync/api?checkcookies=true
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
3e4d1be0844caaeb371a4ca51bf7c4d887ecc91eebbb5a2e51d00ba8767b8d95

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
1474
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__ir=&__is=1600_1200_24&__iu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&__id=1573857464780&__it=-60&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:44 GMT
Last-Modified
Sat, 07 Nov 2009 22:36:48 GMT
Server
X/1.0
Content-Type
image/gif
Cache-Control
private, no-cache, no-store, proxy-revalidate, no-transform
Connection
keep-alive
Content-Length
35
Expires
Fri, 09 Nov 2012 22:36:48 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame B45E
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1459277723&w=468&lmt=1573857464&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&flash=0&wgl=1&dt=1573857464711&bpp=7&bdt=149&fdt=83&idt=83&shv=r20191112&cbv=r20190131&saldr=aa&abxe=1&correlator=453027684172&frm=20&pv=2&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&ga_fc=0&iag=0&icsg=206393356280&dssz=63&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=486&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065125&oid=3&pvsid=3992682346307461&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=6YV9SgWTZA&p=https%3A//www.giga.de&dtd=95
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191112/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1459277723&w=468&lmt=1573857464&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&flash=0&wgl=1&dt=1573857464711&bpp=7&bdt=149&fdt=83&idt=83&shv=r20191112&cbv=r20190131&saldr=aa&abxe=1&correlator=453027684172&frm=20&pv=2&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&ga_fc=0&iag=0&icsg=206393356280&dssz=63&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=486&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065125&oid=3&pvsid=3992682346307461&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=6YV9SgWTZA&p=https%3A//www.giga.de&dtd=95
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
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
cookie
IDE=AHWqTUn5aUinAIgzKORhBAXkmdDdgRyD2W8B4cjbyIa7IPwzKS3FNXtrSs-zKO5l
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
content-encoding
br
date
Fri, 15 Nov 2019 22:37:44 GMT
server
cafe
content-length
20440
x-xss-protection
0
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
osd.js
www.googletagservices.com/activeview/js/current/
78 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191112/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
8b2aa8c4b8f427191eea2b79bc69896ef382a2c45ea01abe3efaf4d9b340242b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573648928056700"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29412
x-xss-protection
0
expires
Fri, 15 Nov 2019 22:37:44 GMT
dkuim.js
dkuim.de/api/js/2/
465 KB
151 KB
Script
General
Full URL
https://dkuim.de/api/js/2/dkuim.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.65.130 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
Content-Encoding
gzip
Last-Modified
Tue, 11 Dec 2018 15:40:09 GMT
Server
nginx
ETag
W/"5c0fda59-74548"
Transfer-Encoding
chunked
Content-Type
application/javascript
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame A0DF
53 KB
15 KB
Stylesheet
General
Full URL
https://videos.giga.de/dist/css/videojs-f50f7a8d.css
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/2006343101
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/2006343101
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
Fri, 15 Nov 2019 22:37:44 GMT
content-encoding
gzip
last-modified
Thu, 24 Oct 2019 09:14:02 GMT
server
nginx/1.14.1
etag
W/"5db16b5a-d280"
content-type
text/css
status
200
cache-control
max-age=315360000
expires
Thu, 31 Dec 2037 23:55:55 GMT
play_button.svg
videos.giga.de/image/ Frame A0DF
1015 B
1 KB
Image
General
Full URL
https://videos.giga.de/image/play_button.svg
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/2006343101
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/2006343101
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
Fri, 15 Nov 2019 22:37:44 GMT
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
"5d1db79a-3f7"
content-type
image/svg+xml
status
200
cache-control
max-age=7776000
accept-ranges
bytes
content-length
1015
expires
Thu, 13 Feb 2020 22:37:44 GMT
pubads_impl_2019111201.js
securepubads.g.doubleclick.net/gpt/
160 KB
59 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111201.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
6d5783f621f26ce9d9f954568ff21d24e8f6986910c05388a1f0098a939b38d4
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 12 Nov 2019 18:33:31 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
59852
x-xss-protection
0
expires
Fri, 15 Nov 2019 22:37:44 GMT
loader.js
cdn.taboola.com/libtrc/stroeer-smb-giga/
117 KB
22 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/bundle/post-33dedcb970.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
dcfcc4bb74ea82e2469d755b15ea7ec0277d7e4a4db7b8aaeafc3d3afc9a4260

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

x-amz-version-id
oTn.3Y9V6BdWhwggbO6FbZKwPcDq66kY
content-encoding
gzip
etag
"75805a6ecff321bed9b94e3b7705b7e2"
age
41
x-cache
HIT
status
200
content-length
22344
x-amz-id-2
BLV7v2Whe5VgzUuuGXXXmG2Gql4T8Fo8xLSHkfCMKyNWlQbZWDwAoEBsm5+ne/bTZszH/U6nOPI=
x-served-by
cache-fra19151-FRA
last-modified
Thu, 14 Nov 2019 16:30:25 GMT
server
AmazonS3
x-timer
S1573857465.850878,VS0,VE0
date
Fri, 15 Nov 2019 22:37:44 GMT
vary
Accept-Encoding
x-amz-request-id
03A908AA03C7AFD1
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
55
x-cache-hits
9
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1076815648&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=direkt%20bei%20PayPal&_u=6GBAAEADQ~&jid=&gjid=&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fwebapps%2Fmpp%2Fpaypal-fees&cd41=Content%201&cd45=all&cm75=1&z=331981304
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 01 Nov 2019 09:12:57 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1257887
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1076815648&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Zum%20Geb%C3%BChrenrechner*&_u=6GBAAEADQ~&jid=&gjid=&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fib5j&cd41=Content%202&cd45=all&cm75=1&z=148073493
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 01 Nov 2019 09:12:57 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1257887
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1076815648&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=OlegDoroshin&_u=6GBAAEADQ~&jid=&gjid=&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Text-link&cd40=http%3A%2F%2Fwww.shutterstock.com%2Fgallery-363469p1.html%3Fcr%3D00%26pl%3Dedit-00&cd41=Content%203&cd45=all&cm75=1&z=863061306
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 01 Nov 2019 09:12:57 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1257887
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1076815648&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Shutterstock.com&_u=6GBAAEADQ~&jid=&gjid=&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd39=Text-link&cd40=http%3A%2F%2Fwww.shutterstock.com%2Feditorial%3Fcr%3D00%26pl%3Dedit-00&cd41=Content%204&cd45=all&cm75=1&z=770108297
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 01 Nov 2019 09:12:57 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1257887
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame E8D5
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1573857464&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1573857464718&bpp=4&bdt=156&fdt=115&idt=115&shv=r20191112&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=453027684172&frm=20&pv=1&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&ga_fc=0&iag=0&icsg=3302293700392&dssz=67&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065125&oid=3&pvsid=3992682346307461&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&dtd=119
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191112/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1573857464&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1573857464718&bpp=4&bdt=156&fdt=115&idt=115&shv=r20191112&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=453027684172&frm=20&pv=1&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&ga_fc=0&iag=0&icsg=3302293700392&dssz=67&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065125&oid=3&pvsid=3992682346307461&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&dtd=119
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
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
cookie
IDE=AHWqTUn5aUinAIgzKORhBAXkmdDdgRyD2W8B4cjbyIa7IPwzKS3FNXtrSs-zKO5l
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
date
Fri, 15 Nov 2019 22:37:44 GMT
server
cafe
content-length
0
x-xss-protection
0
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
session
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/session
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.122.213.19 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-122-213-19.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
text/plain

Response headers

date
Fri, 15 Nov 2019 22:37:44 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
bid
c.amazon-adsystem.com/e/dtb/
98 B
486 B
XHR
General
Full URL
https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&pid=oGnqZVI4F6N3i&cb=0&ws=1600x1200&v=7.43.01&t=1000&slots=%5B%7B%22sd%22%3A%22banner%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%7D%2C%7B%22sd%22%3A%22sky%22%2C%22s%22%3A%5B%22300x600%22%2C%22160x600%22%2C%22200x600%22%2C%22120x600%22%2C%22301x601%22%5D%7D%2C%7B%22sd%22%3A%22rectangle%22%2C%22s%22%3A%5B%22300x250%22%5D%7D%5D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.86.250 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-86-250.fra2.r.cloudfront.net
Software
Server /
Resource Hash
e48f08b200b1d8a4054305847126d87a19219dfb882be603e9c3b30f4062a6bc

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA2-C2
status
200
vary
Accept-Encoding,User-Agent
x-cache
Miss from cloudfront
content-type
text/javascript;charset=UTF-8
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
timing-allow-origin
*
content-length
113
via
1.1 f8fe53d5464b299529d281799da8de30.cloudfront.net (CloudFront)
x-amz-cf-id
SCRsvda9jT_5VOe6ILU0siHqBE0xJNu61aGxR7-kxxsIqOxzbziqOg==
v1
dmx.districtm.io/b/
0
428 B
XHR
General
Full URL
https://dmx.districtm.io/b/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.16.68.69 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
application/json

Response headers

date
Fri, 15 Nov 2019 22:37:44 GMT
cf-cache-status
DYNAMIC
server
cloudflare
status
204
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
origin, Accept-Encoding
access-control-allow-methods
OPTIONS, POST
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
strict-transport-security
max-age=31536000; includeSubDomains; preload
cf-ray
5364b623ed4d978a-FRA
access-control-allow-headers
origin, content-type
arj
yieldlove-d.openx.net/w/1.0/
4 KB
5 KB
XHR
General
Full URL
https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-60&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=7c2af6fa-3dc1-490a-9a3a-0347a20dde99%2C4a5a38c3-368d-4f3b-b030-ff0730c67295%2C88f4c4e8-8ded-4d93-9c0f-4f60248c2241&nocache=1573857464893&aus=300x250%7C300x600%2C160x600%2C200x600%2C120x600%2C301x601%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle%2Csky%2Cbanner&auid=539390940%2C540714782%2C540847469&
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.167.1 /
Resource Hash
8c832c688b6e9f37d0065e3ca18adebf2787d3791be4bd3fa2e71bcf4c4ce819

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
text/plain

Response headers

pragma
no-cache
date
Fri, 15 Nov 2019 22:37:44 GMT
via
1.1 google
server
OXGW/16.167.1
status
200
vary
Accept
p3p
CP="CUR ADM OUR NOR STA NID"
access-control-allow-origin
https://www.giga.de
cache-control
private, max-age=0, no-cache
access-control-allow-credentials
true
content-type
application/json
alt-svc
clear
content-length
4397
expires
Mon, 26 Jul 1997 05:00:00 GMT
translator
hbopenbid.pubmatic.com/
0
113 B
XHR
General
Full URL
https://hbopenbid.pubmatic.com/translator?source=prebid-client
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
185.64.189.112 , United Kingdom, ASN62713 (AS-PUBMATIC - PubMatic, Inc., US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
text/plain

Response headers

status
204
date
Fri, 15 Nov 2019 22:37:44 GMT
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
access-control-allow-origin
https://www.giga.de
cygnus
as-sec.casalemedia.com/
25 B
901 B
XHR
General
Full URL
https://as-sec.casalemedia.com/cygnus?s=254711&v=7.2&r=%7B%22id%22%3A%2213c8fc0b0789768%22%2C%22imp%22%3A%5B%7B%22id%22%3A%221477d4711e41244%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22254711%22%2C%22sid%22%3A%221%22%7D%7D%2C%7B%22id%22%3A%2215d12426dc18069%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2216fa2832b9b06c6%22%2C%22banner%22%3A%7B%22w%22%3A160%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%2217f79d85b92308c%22%2C%22banner%22%3A%7B%22w%22%3A200%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%221879becae816f61%22%2C%22banner%22%3A%7B%22w%22%3A120%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%221961dcf9dfffe3%22%2C%22banner%22%3A%7B%22w%22%3A301%2C%22h%22%3A601%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22412366%22%2C%22sid%22%3A%2265%22%7D%7D%2C%7B%22id%22%3A%22209da46d0b8ca42%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%22216c86b721fcbbd%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%22222eee13bf99623%22%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%2C%7B%22id%22%3A%2223e24bc340468dc%22%2C%22banner%22%3A%7B%22w%22%3A728%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22413747%22%2C%22sid%22%3A%2266%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F%22%7D%2C%22ext%22%3A%7B%22source%22%3A%22prebid%22%7D%7D&ac=j&sd=1&
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.21 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-21.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
7ef74b1ad1f804099bed8427568f0f8df0364509a4cb024d4cfdb12a85af0929

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Fri, 15 Nov 2019 22:37:45 GMT
Content-Encoding
gzip
Server
Apache
Vary
Accept-Encoding
P3p
policyref="/w3c/p3p.xml", CP="NOI DSP COR DEVa TAIa OUR BUS UNI"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
max-age=0, no-cache, no-store
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json
Content-Length
45
Expires
Fri, 15 Nov 2019 22:37:45 GMT
bid
orbidder.otto.de/
0
145 B
XHR
General
Full URL
https://orbidder.otto.de/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
text/plain

Response headers

status
204
date
Fri, 15 Nov 2019 22:37:44 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.giga.de
strict-transport-security
max-age=15724800; includeSubDomains
bid
orbidder.otto.de/
0
144 B
XHR
General
Full URL
https://orbidder.otto.de/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
text/plain

Response headers

status
204
date
Fri, 15 Nov 2019 22:37:44 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.giga.de
strict-transport-security
max-age=15724800; includeSubDomains
bid
orbidder.otto.de/
0
144 B
XHR
General
Full URL
https://orbidder.otto.de/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
35.206.134.202 Mountain View, United States, ASN19527 (GOOGLE-2 - Google LLC, US),
Reverse DNS
202.134.206.35.bc.googleusercontent.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=15724800; includeSubDomains

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
text/plain

Response headers

status
204
date
Fri, 15 Nov 2019 22:37:44 GMT
access-control-allow-credentials
true
access-control-allow-origin
https://www.giga.de
strict-transport-security
max-age=15724800; includeSubDomains
cdb
bidder.criteo.com/
0
141 B
XHR
General
Full URL
https://bidder.criteo.com/cdb?profileId=207&av=16&wv=2.24.0&cb=23941187649
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
178.250.2.152 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
Finatra /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
text/plain

Response headers

status
204
date
Fri, 15 Nov 2019 22:37:44 GMT
access-control-allow-credentials
true
server
Finatra
access-control-allow-origin
https://www.giga.de
timing-allow-origin
*
vary
Origin
auction
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/auction
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.122.213.19 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-122-213-19.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
text/plain

Response headers

date
Fri, 15 Nov 2019 22:37:44 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
jquery.min.js
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
85 KB
30 KB
Script
General
Full URL
https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Tue, 12 Nov 2019 11:08:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
300532
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
30306
x-xss-protection
0
last-modified
Fri, 24 Mar 2017 20:55:54 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
public, max-age=31536000, stale-while-revalidate=2592000
accept-ranges
bytes
timing-allow-origin
*
expires
Wed, 11 Nov 2020 11:08:52 GMT
smb-article-rating-f9506c2d61.min.js
www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/
18 KB
6 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/smb-article-rating-f9506c2d61.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Mon, 20 May 2019 10:18:52 GMT
content-encoding
gzip
x-original-content-length
17937
server
nginx
status
200
etag
W/"5ce27eb5-4611"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
6108
expires
Tue, 19 May 2020 10:18:52 GMT
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=831c33358ecbd0f2ccffa910b98a4397&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D831c33358ecbd0f2ccffa910b98a4397%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=831c33358ecbd0f2ccffa910b98a4397&userId=adscale-user:6898c7d418424225bf66be962d28c288
44 B
528 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=831c33358ecbd0f2ccffa910b98a4397&userId=adscale-user:6898c7d418424225bf66be962d28c288
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
image/gif
Content-Length
44
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"

Redirect headers

Pragma
no-cache
Date
Fri, 15 Nov 2019 22:37:45 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=831c33358ecbd0f2ccffa910b98a4397&userId=adscale-user:6898c7d418424225bf66be962d28c288
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
0
Expires
Fri, 15 Nov 2019 22:37:45 GMT
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=gxwzNY7L0PLM_6kQuYpDlw
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
44 B
523 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
image/gif
Content-Length
44
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"

Redirect headers

pragma
no-cache
date
Fri, 15 Nov 2019 22:37:44 GMT
server
HTTP server (unknown)
status
302
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
260
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
impl.20191112-12-RELEASE.js
cdn.taboola.com/libtrc/
416 KB
117 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/impl.20191112-12-RELEASE.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
d1beb3953a4a78ab8ffc151a9ad4dc397f704a67bafba60dcc1126cdc2b6c6d5

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

x-amz-version-id
8QkyxR2HUVQ8xOtd0zhaU.3KZBwqTiip
content-encoding
gzip
etag
"ec434f226a531972c5c86391965364d9"
age
98
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
119801
x-amz-id-2
3ZcEn4qc95NV4jucLqQCega3sU2meP4mwnunRSPb/Hw7DAuiIn413lwW5l+N+vmpwnf1Z/TDOH8=
x-served-by
cache-fra19151-FRA
last-modified
Tue, 12 Nov 2019 11:55:25 GMT
server
AmazonS3
x-timer
S1573857465.962634,VS0,VE0
date
Fri, 15 Nov 2019 22:37:44 GMT
vary
Accept-Encoding
x-amz-request-id
A44F8D4F58A5C67E
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
67
x-cache-hits
337
beacon.js
sb.scorecardresearch.com/
1 KB
1 KB
Script
General
Full URL
https://sb.scorecardresearch.com/beacon.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.16.31.65 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-16-31-65.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
d0fd74148f4cbe78bd0e6328dc5ce5955f0a0ecdb1eb2919da4a7e596ac65912

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:44 GMT
Content-Encoding
gzip
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
private, no-transform, max-age=86400
Connection
keep-alive
Content-Length
901
Expires
Sat, 16 Nov 2019 22:37:44 GMT
ads
securepubads.g.doubleclick.net/gampad/
12 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3992682346307461&correlator=3722306851540671&output=ldjh&impl=fif&adsid=NT&eid=21064169&vrg=2019111201&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191115&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C1000x150%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cfullb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D1%26smb-hour%3D23%26yt%3D0%26adset%3Dbrsl%26mbrid%3D831c33358ecbd0f2ccffa910b98a4397%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1573857464&dt=1573857464981&dlt=1573857464563&idt=399&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2257154448&uci=1&ifi=2&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=71&icsg=52836699206200&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111201.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
f16ba37c4eacfc7f38a1a0de664a9e7e3b9e15b1215a20198f9161acaff3adc7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
4398
x-xss-protection
0
google-lineitem-id
5210699470
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138292609971
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2019111201.js
securepubads.g.doubleclick.net/gpt/
64 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111201.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111201.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
sffe /
Resource Hash
1f6ba59e0e4b96cbb3e07c3c5d908a62dae632d96714e50c6671cd1df32d1829
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 12 Nov 2019 18:33:31 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
25120
x-xss-protection
0
expires
Fri, 15 Nov 2019 22:37:45 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111201.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:819::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

ads
securepubads.g.doubleclick.net/gampad/
8 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3992682346307461&correlator=3722306851540671&output=ldjh&impl=fif&adsid=NT&eid=21064169&vrg=2019111201&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191115&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D1%26smb-hour%3D23%26yt%3D0%26adset%3Dbrsl%26mbrid%3D831c33358ecbd0f2ccffa910b98a4397%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1573857464&dt=1573857464992&dlt=1573857464563&idt=399&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2778923653&uci=2&ifi=3&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=72&icsg=52836699206200&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111201.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
f2b586b6c1b604fceca3874a4af24cfd8eeaddb80ceba2aa183d0896e618c141
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
3695
x-xss-protection
0
google-lineitem-id
5198271552
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138291204244
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
8 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3992682346307461&correlator=3722306851540671&output=ldjh&impl=fif&adsid=NT&eid=21064169&vrg=2019111201&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191115&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D1%26smb-hour%3D23%26yt%3D0%26adset%3Dbrsl%26mbrid%3D831c33358ecbd0f2ccffa910b98a4397%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1573857464&dt=1573857464997&dlt=1573857464563&idt=399&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1428895410&uci=3&ifi=4&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=72&icsg=52836699206200&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111201.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
82b0ce1e4e065950cc38896e1ca39abec1fdaea46823fd88394c24f0c987be11
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
3654
x-xss-protection
0
google-lineitem-id
5198271552
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138290833185
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
3 KB
2 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3992682346307461&correlator=3722306851540671&output=ldjh&impl=fif&adsid=NT&eid=21064169&vrg=2019111201&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191115&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=1x1&ists=1&scp=as%3Dout_of_page%26adslot%3Dout_of_page%26pc%3D1%26af%3Dtickerad&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D1%26smb-hour%3D23%26yt%3D0%26adset%3Dbrsl%26mbrid%3D831c33358ecbd0f2ccffa910b98a4397%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1573857465&dt=1573857465002&dlt=1573857464563&idt=399&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2540211652&uci=4&ifi=5&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&dssz=72&icsg=52836699206200&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x0&msz=1x1&ga_vid=958900569.1573857465&ga_sid=1573857465&ga_hid=1076815648&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111201.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
22628e59246bc809fbe231771381a62905ea6c689cf15d95125a5a75906a11ef
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
1871
x-xss-protection
0
google-lineitem-id
4482388292
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138216245372
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.giga.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
bootstrap.min.js
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
36 KB
10 KB
Script
General
Full URL
https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2001:4de0:ac19::1:b:2a , Netherlands, ASN20446 (HIGHWINDS3 - Highwinds Network Group, Inc., US),
Reverse DNS
Software
/
Resource Hash
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
gzip
last-modified
Wed, 12 Dec 2018 18:33:51 GMT
status
200
etag
"1544639631"
vary
Accept-Encoding
x-cache
HIT
content-type
text/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=31536000
x-hello-human
Say hello back! @getBootstrapCDN on Twitter
accept-ranges
bytes
timing-allow-origin
*
content-length
9832
submit
lb67.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb67.s400.meetrics.net/bb-mx/submit?/cgK2BIAAA/whFcBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFvzEwlFjpFhsFzvBwhF5wFhsFtnEliF1lFoyFluFylFjoFulFytBrvFz0FluFtvEusFpuFltBlyFtpF00FlsFuvBfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSS2APAAAAAAAAAOAAAAGAAAAAAAZwSS2ABRksFAQtjF+NM8SA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:45 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Fri, 15 Nov 2019 22:37:44 GMT
data
lb67.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb67.s400.meetrics.net/data?/cgK2CIAAATkzFARksFAQtjFApJNSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:45 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 15-Nov-19 22:37:44 GMT
nuggad
ih.adscale.de/
49 B
487 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d7=2&d10=1&d2=3&d4=1&d11=3&d8=2&d9=1&d12=2&d1=1&d3=3
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:45 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
49
Expires
Fri, 15 Nov 2019 22:37:45 GMT
container
tracking.m6r.eu/pixel/
0
376 B
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n29=1&n121=1&n116=0&n104=1&n15=1&n155=1&n133=1&n106=1&n153=0&n11=2&n120=3&n154=1&n125=0&n8=1&n2=3&n137=0&n101=0&n108=1&n54=0&n110=0&n87=0&n149=0&n76=1&n66=0&n139=0&n160=0&n28=2&n107=0&n117=3&n86=0&n147=4&n64=0&n119=6&n22=1&n18=1&n161=1&n126=1&n92=2&n77=0&n83=0&n102=0&n105=0&n159=1&n20=1&n80=1&n12=1&n141=0&n157=0&n99=0&n128=1&n118=4&n85=0&n9=3&n6=2&n63=0&n138=0&n140=0&n94=2&n111=0&n136=0&n79=1&n93=4&n90=1&n43=1&n55=1&n142=0&n7=1&n103=0&n158=1&n124=1&n75=0&n91=0&n114=1&n69=0&n47=1&n10=2&n3=1&n82=1&n33=1&n84=1&n5=3&n48=1&n109=0&n122=1&n132=3&n67=1&n115=1&n89=1&n123=2&n17=1&n78=0&n41=1&n81=0&n88=1&n39=1&n156=1&n148=0
Requested by
Host: tracking.m6r.eu
URL: https://tracking.m6r.eu/sync/api?checkcookies=true
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
0
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
nativendo.css
c.nativendo.de/cdn/asset/css/
5 KB
1 KB
Stylesheet
General
Full URL
https://c.nativendo.de/cdn/asset/css/nativendo.css?v=1175
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:ac0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 google
cf-cache-status
HIT
age
1519058
cf-polished
origSize=5959
status
200
content-encoding
br
alt-svc
clear
cf-bgj
minify
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
text/css;charset=UTF-8
cache-control
public, max-age=31536000
cf-ray
5364b624ec9e5982-VIE
expires
Wed, 28 Oct 2020 08:40:03 GMT
bid
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/bid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
3.122.213.19 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-3-122-213-19.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
text/plain

Response headers

date
Fri, 15 Nov 2019 22:37:45 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
config.js
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
55 KB
13 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
ddd5327bf80f2bf8d386cc77c9f71499c795640f8e046909effa581712c8ed4c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
Content-Encoding
gzip
Age
3440
X-Cache
HIT
Connection
keep-alive
Content-Length
13049
x-amz-id-2
sodowG3h8a643UusmTVrXFgIiUAezR4BLCTadNoX6Nkp3agRuzWnwhudknDt4g16csRocfqcWv4=
X-Served-By
cache-fra19160-FRA
Last-Modified
Fri, 15 Nov 2019 21:34:44 GMT
Server
AmazonS3
X-Timer
S1573857465.140108,VS0,VE0
ETag
"a267a9d678ec224e9fa443035ceccc9e"
x-amz-request-id
7AC31ECA6255BD77
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
6305
2f569144df7e0c84ae662ad76a_ciA2NTADZGMyNjRmMDQ2YTY=.png
files.giga-video.de/da/5c/dc/ Frame A0DF
15 KB
15 KB
Image
General
Full URL
https://files.giga-video.de/da/5c/dc/2f569144df7e0c84ae662ad76a_ciA2NTADZGMyNjRmMDQ2YTY=.png
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
69f049c8296fa63b9a344f13a405b4f6e58432556da4b3e202af9788dae100ea
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/2006343101
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
Fri, 25 Oct 2019 04:59:19 GMT
x-content-type-options
nosniff
age
1877906
filer-source
5d49872525e25fa08a218d05803618e85dbbffacfec14597f6cf6333e144ba71
x-cache
HIT
status
200
accept-language
bytes
content-length
15022
x-xss-protection
1; mode=block
last-modified
Fri, 25 Oct 2019 04:59:19 GMT
server
nginx/1.10.3
filer-attr
W1s2NTAsMzY2XSwic3RpLXYzIixbIkZSQS0xIl0sWyJGUkItMSJdXQ==
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sun, 24 Nov 2019 04:59:19 GMT
json
trc.taboola.com/stroeer-smb-giga/trc/3/
12 KB
5 KB
Script
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=23%3A37%3A45.143&lti=deflated&data=%7B%22id%22%3A511%2C%22ii%22%3A%22%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1573857465137%2C%22cv%22%3A%2220191112-12-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%22cmps%22%3A3%2C%22btv%22%3A%220%22%2C%22cos%22%3A%224g%22%2C%22bad%22%3A-1%2C%22sw%22%3A1600%2C%22sh%22%3A1200%2C%22bw%22%3A1600%2C%22sde%22%3A%221.000%22%2C%22bh%22%3A1200%2C%22dw%22%3A1585%2C%22dh%22%3A3474%2C%22r%22%3A%5B%7B%22li%22%3A%22rbox-t2m%22%2C%22s%22%3A9%2C%22uim%22%3A%22alternating-thumbnails-a%3Aabp%3D0%22%2C%22uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22orig_uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22cd%22%3A2791.3125%2C%22mw%22%3A625%7D%5D%2C%22cb%22%3A%22TRC.callbacks.recommendations_1%22%2C%22lt%22%3A%22deflated%22%7D
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191112-12-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
04a2ed057d9eeaf1414748f8ba8dedc4f83438cefb37081a334f70b0be931071

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

x-vcl-time-ms
152
date
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
gzip
access-control-allow-origin
*
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
status
200
x-served-by
cache-fra19151-FRA
server
nginx
x-timer
S1573857465.149514,VS0,VE152
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
via
1.1 varnish
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
collect
www.google-analytics.com/
35 B
109 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1076815648&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=2006343101%20--%20Das%20solltest%20du%20%C3%BCber%20PayPal%20wissen%5Bvideojs%2F7.6.5%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cd9=20160501&cd11=2006343101&cd12=SELF&cd13=70&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.5&cd44=1&cm1=1&z=175522394
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 01 Nov 2019 09:12:57 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1257888
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
bf90bb80-9a6f-436c-927d-b77c01e7c709
https://videos.giga.de/ Frame A0DF
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/bf90bb80-9a6f-436c-927d-b77c01e7c709
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-ff0ddd6c.min.js
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d

Request headers

Sec-Fetch-Mode
same-origin
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
31
Content-Type
application/javascript
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame A0DF
53 B
642 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-ff0ddd6c.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.73.163 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101
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
Fri, 15 Nov 2019 22:37:46 GMT
Last-Modified
Fri, 15 Nov 2019 16:32:57 GMT
Server
AmazonS3
x-amz-request-id
9B6A8BB8B8934A84
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
0htcyY2uxUPbOquIFS6wxbQtNB0qwzCcEwskB6si5yuCLmDrzpDvKNUAdx3Q4sHKnogBB5rQDKw=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame A0DF
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-ff0ddd6c.min.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101
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
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
gzip
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
W/"5d1db79a-109"
status
200
access-control-allow-methods
GET
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=900
access-control-allow-headers
accept, content-type
expires
Fri, 15 Nov 2019 22:52:45 GMT
Cookie set iu3
aax-eu.amazon-adsystem.com/s/ Frame F641
Redirect Chain
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
0
0
Document
General
Full URL
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.94.218.7 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash

Request headers

Host
aax-eu.amazon-adsystem.com
Connection
keep-alive
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
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Accept-Encoding
gzip, deflate, br
Cookie
ad-id=A5jrvLFunk7jtSvKqSqa8lI|t
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

Server
Server
Date
Fri, 15 Nov 2019 22:37:45 GMT
Content-Type
text/html;charset=ISO-8859-1
Content-Length
181
Connection
keep-alive
Cache-Control
max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0
Pragma
no-cache
Expires
Thu, 01 Jan 1970 00:00:00 GMT
p3p
policyref="https://www.amazon.com/w3c/p3p.xml", CP="PSAo PSDo OUR SAM OTR DSP COR"
Set-Cookie
ad-id=A5jrvLFunk7jtSvKqSqa8lI; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jul-2020 22:37:45 GMT; Path=/; HttpOnly ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jan-2025 22:37:45 GMT; Path=/; HttpOnly
Vary
Accept-Encoding,User-Agent
Content-Encoding
gzip

Redirect headers

Server
Server
Date
Fri, 15 Nov 2019 22:37:45 GMT
Content-Length
0
Connection
keep-alive
Cache-Control
max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0
Pragma
no-cache
Expires
Thu, 01 Jan 1970 00:00:00 GMT
p3p
policyref="https://www.amazon.com/w3c/p3p.xml", CP="PSAo PSDo OUR SAM OTR DSP COR"
Location
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Set-Cookie
ad-id=A5jrvLFunk7jtSvKqSqa8lI|t; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jul-2020 22:37:45 GMT; Path=/; HttpOnly
Vary
User-Agent
b2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1573857465188&ns_c=UTF-8&cv=3.1&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga....
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1573857465188&ns_c=UTF-8&cv=3.1&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga...
0
248 B
Image
General
Full URL
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1573857465188&ns_c=UTF-8&cv=3.1&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&c9=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.16.31.65 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-16-31-65.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:45 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT

Redirect headers

Location
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1573857465188&ns_c=UTF-8&cv=3.1&c8=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&c9=
Pragma
no-cache
Date
Fri, 15 Nov 2019 22:37:45 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame A0DF
653 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-ff0ddd6c.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.120 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-120.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101
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
Fri, 15 Nov 2019 22:36:50 GMT
Via
1.1 cb33a7a4640adbb55df3e0d143601559.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
78
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:47 GMT
Server
AmazonS3
ETag
"063da71572f57793ea4125f50b418f84"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
X-Amz-Cf-Pop
FRA2-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
DyHNM-NkNP12QRw5gAZ09EsBhXMxu5oL3H2DEtUs_jOJEeg3fQKcag==
Expires
0
t.png
gocp.stroeermediabrands.de/
98 B
355 B
Image
General
Full URL
https://gocp.stroeermediabrands.de/t.png?title=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&contentPieceId=2762322&publishDate=2016-05-25T18%3A29%3A51%2B02%3A00&_=1573857465202.-1238619670
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.16.106 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.106.16.40.188.clients.your-server.de
Software
/
Resource Hash
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
Last-Modified
Tue, 12 Nov 2019 08:26:10 GMT
ETag
"5dca6ca2-62"
Content-Type
image/png
Cache-Control
max-age=31536000, public
X-Machine
hn86 gocp env
Accept-Ranges
bytes
Content-Length
98
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201911121507/
29 KB
11 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201911121507/wrap.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/config.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
a0166fe46c8c973fc2b03e65ebe5b1cc43cadffa32c64388dbb0c99a0eb26def

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
Content-Encoding
gzip
Age
157
X-Cache
HIT
Connection
keep-alive
Content-Length
11064
x-amz-id-2
Si7oxJweNbEfpNdTY1Uxbvfhdg16/gL0rF1iPpGgyPGcRtc0e0IqT5nOSE/P9oUpZXqOtJsecBk=
X-Served-By
cache-fra19160-FRA
Last-Modified
Tue, 12 Nov 2019 20:09:08 GMT
Server
AmazonS3
X-Timer
S1573857465.209308,VS0,VE0
ETag
"75dc5f5ddf96babbd6b101c2f462efd9"
x-amz-request-id
498FFEA55B0F9B82
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
35860
/
d.agkn.com/iframe/8613/ Frame 5850
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=413231862&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Requested by
Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:21f3:3800:19:fc2c:a140:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

:method
GET
:authority
d.agkn.com
:scheme
https
:path
/iframe/8613/?che=413231862&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
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
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
content-type
text/html;charset=UTF-8
content-length
482
cache-control
no-cache, must-revalidate
date
Fri, 15 Nov 2019 22:37:44 GMT
expires
Sat, 01 Jan 2000 00:00:00 GMT
p3p
CP="NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
pragma
no-cache
server
Apache-Coyote/1.1
set-cookie
ab=0001%3AK%2BoIohEGFU3TV1Dg9j4Ba65kdDqGGDSm;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAlYeU5JWHlOQAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
x-cache
Miss from cloudfront
via
1.1 f0dda47e8f83bee88cb60d3d2e3fa5e5.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA2-C2
x-amz-cf-id
FJdEhumhEyUyd1LQHrDyIrGWSt_wvWBGthaxOsCFSBSeoRx0iBY-oA==
pixel
tracking.m6r.eu/consent/
44 B
209 B
Image
General
Full URL
https://tracking.m6r.eu/consent/pixel?nocookie=true&nosync=true&consent=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
/
d.nativendo.de/cds/delivery/get/
9 KB
2 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/get/?url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
62da83e0a6ff7bc7dd1c14ae65cdcbeedba860a3f9c9520064cc305a2bf0d626

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
gzip
last-modified
Fri, 15 Nov 2019 22:37:45 GMT
server
Apache
vary
Accept-Encoding
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
1732
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
native
native.adscale.de/
157 B
603 B
XHR
General
Full URL
https://native.adscale.de/native
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.100.66.110 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a95-100-66-110.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
6e8c25dacf0fdbe211487fce3530604424fa784604e8a7264a349ce1b57a7319

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
text/plain;charset=UTF-8

Response headers

Date
Fri, 15 Nov 2019 22:37:45 GMT
P3P
CP=NOI PSA OUR
Content-Type
application/json
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Robots-Tag
none
Content-Length
157
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame A0DF
195 KB
57 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=yyuLyQzLKo
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-ff0ddd6c.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.120 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-120.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
d725da6d0df682f9aafcd9904bb6dd43b9f60a3f05e55fb90aefa5b9775941c2

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101
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
Fri, 15 Nov 2019 22:37:10 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
36
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Thu, 14 Nov 2019 13:53:49 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 cb33a7a4640adbb55df3e0d143601559.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Pop
FRA2-C1
X-Amz-Cf-Id
8V-2jxbaI5yaePeZm_u7X43g6X_S9EUo7kgq1srooemx2LFACAvN1w==
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/ Frame 90C3
Redirect Chain
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjst_D1ShoprrZuLPkLMF9VD9b2Go9jPujog8sGpGccTXL0Ge1oXmWWBzsVrVrNZXBX8rcUdT3AjLs0qETR4rL5Ai-Y3k-fHBCcC_Rxn2yrS5JkAvbhz3vDNxZzDPbA1UWA8KOsOlDkdRP...
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
49 B
343 B
Image
General
Full URL
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:2bc::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
last-modified
Wed, 29 Nov 2006 13:15:04 GMT
server
Apache
status
200
etag
"3260aadd174a1ebd50d0bd967c8fadea:1494950026"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
image/gif
access-control-allow-origin
*
cache-control
max-age=252311
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
49
expires
Mon, 18 Nov 2019 20:42:56 GMT

Redirect headers

timing-allow-origin
*
date
Fri, 15 Nov 2019 22:37:45 GMT
x-content-type-options
nosniff
server
cafe
status
302
location
//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
text/html; charset=UTF-8
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
0
x-xss-protection
0
view
securepubads.g.doubleclick.net/pcs/ Frame 1D34
0
65 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstw9wry5MD1fOLngaB8FhbjXjHc8oraHQaVNPYzg-OKthgPVPdjxQxjTPychOfAEYabefHDXtr4VXkvxRe-Z5V5s16DU_wVmXvWejIkCKhoUL1MUspOYCRD576Oc6NIeu9YuYph1ROoImdnOOsWXWYwJFnc05eIq8oC7YkRDPrCh_F09tjpO38e4oZ2H2iAefHMgM2O8btaqtqhi_i-VH-u3CAkrZkHhA-o6uzmGVjsNMYQNdAbuIL_L2GjOVU2Gop_4vwai9rDZwsI2mD9TaR0YQ&sig=Cg0ArKJSzFqMXPyZNrhIEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

timing-allow-origin
*
date
Fri, 15 Nov 2019 22:37:45 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
0
x-xss-protection
0
[PROD]_BillboardExt.min.js
templates.stroeerdigital.de/
2 KB
1 KB
Script
General
Full URL
https://templates.stroeerdigital.de/[PROD]_BillboardExt.min.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.78.37 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-78-37.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
79ce82d4c778ade37fe234dacef1da7f0b510c5140bab394ed9faf6495c64c91

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
content-encoding
gzip
last-modified
Tue, 12 Nov 2019 10:29:20 GMT
server
AmazonS3
x-amz-cf-pop
FRA2-C2
etag
"4d4ffe0edbd07b34f9bfb11e6696b713"
x-cache
RefreshHit from cloudfront
content-type
application/javascript; charset=UTF-8
status
200
cache-control
no-cache
accept-ranges
bytes
content-length
872
via
1.1 58b222ebbb6cc6c8c8c9a46127ae3a3e.cloudfront.net (CloudFront)
x-amz-cf-id
0pUv4jmJgDSdEFJ55Uyzp09neWZhTorgX7w3GMYJ5_vbefXxkYV2KQ==
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 1D34
77 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111201.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
e55d4c6befec7b38f6bbbfbf4a6d821e1894b125814cb2b86eae646f98076e12
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573648928056700"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29301
x-xss-protection
0
expires
Fri, 15 Nov 2019 22:37:45 GMT
truncated
/ Frame A0DF
195 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d725da6d0df682f9aafcd9904bb6dd43b9f60a3f05e55fb90aefa5b9775941c2

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

Response headers

Content-Type
text/javascript
userconnect.js
js.adscale.de/
13 KB
5 KB
Script
General
Full URL
https://js.adscale.de/userconnect.js
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

x-amz-version-id
uCC6CzbG4eeBE1xtCmZfElydHe8jGhl9
Content-Encoding
gzip
Last-Modified
Sun, 06 Oct 2019 22:55:04 GMT
Server
AmazonS3
x-amz-request-id
DA58C8E6E607B595
ETag
"5378ec64224df70177fba5bf02e1eb95"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Fri, 15 Nov 2019 22:37:45 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4106
x-amz-id-2
B0ifqy7kTSRMisP8EQOLSQIlEgQOBuwlngT88E/RewsSP5wLKrSgyb4K1VeM7/4XxSFw9SyUpVU=
0
d.nativendo.de/cds/delivery/render/553cq96o/182yo/60y68/8nyf4/
3 KB
1 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/render/553cq96o/182yo/60y68/8nyf4/0
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
a20b0dacacf786af5049ad45a52b917b98ab70f55fad958975e4497fcf85a5a2

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
gzip
last-modified
Fri, 15 Nov 2019 22:37:45 GMT
server
Apache
vary
Accept-Encoding
content-type
text/javascript; charset=utf8
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
alt-svc
clear
content-length
1452
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
632d8c58-880e-4873-9f41-bad525386b77
t.nativendo.de/cds/tracking/event/
0
172 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/632d8c58-880e-4873-9f41-bad525386b77?aid=182yo&floor=NjMyZDhjNTgtODgwZS00OGQrF8WPHic2U7YqEQ&cpm=&dsp=1&t[0]=rtb%2Fauction&t[1]=rtb%2Frequest&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ts=1573857465
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 google
last-modified
Fri, 15 Nov 2019 22:37:45 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
truncated
/ Frame 1D34
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
e372b2913edcfa11e893b9e136525533f328b8bb8f32556d280b80441e0d006d

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

Response headers

Content-Type
image/png
tb
15.taboola.com/
30 KB
31 KB
Script
General
Full URL
https://15.taboola.com/tb?oid=15&pubnm=stroeer-smb-giga&unitType=244&tbloc=&pageType=text&pstn=Below%20Article%20Feed%20-%20Video&uuip=Feed%20-%20Below%20Article%20Feed%20-%20Video&cisrf=&cirf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&encoded=1&uid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&variant=0|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1573857465371&tagid=&cntry=DE&platform=1&sesid=34e1cac580d3cd35ea88d3b7ea416ded&itemid=/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln&viewid=1573857465137&geolat=&geoing=&deviceifa=&appid=&sd=v2_34e1cac580d3cd35ea88d3b7ea416ded_9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39_1573857465_1573857465_CNawjgYQrMVBGLGm3InnLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA&ri=2265515e8b69ee6700198ceed0a8c128&appname=&cdb=&gdprApplies=&rid=&sii=-87077898386902071
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191112-12-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
eec9db5e24b3f9371bc50d3958500569c26db8f3a36d3c8bf5e0fb505cb80248

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857465.389410,VS0,VE14
machineid
1416
x-cache
MISS
content-type
text/html;charset=ISO-8859-1
status
200
expires
Sat, 26 Jul 1997 05:00:00 GMT
cache-control
no-cache,must-revalidate,no-store,max-age=0,s-maxage=0
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-hhn4036-HHN
feed-card-placeholder.20191112-12-RELEASE.es6.js
cdn.taboola.com/libtrc/
5 KB
2 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/feed-card-placeholder.20191112-12-RELEASE.es6.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
5b79f4faaf170a17eac256896c9b21be3d49ab4c9015fbd4e05ff5dd781eb158

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

x-amz-version-id
8ecaZFQb5onwRM0EKoBKurnTZg1NgE4y
content-encoding
gzip
etag
"5b75d19f8301f2029c56d0138797c33e"
age
92
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
1267
x-amz-id-2
x0+fOXKm66l3GSLyRqwbaGPLeFXka+JE14D8HNH1cKYfqtPqDwPqCWzXON4ufXuAXqmTZiiL7q0=
x-served-by
cache-fra19151-FRA
last-modified
Tue, 12 Nov 2019 11:55:42 GMT
server
AmazonS3
x-timer
S1573857465.378769,VS0,VE0
date
Fri, 15 Nov 2019 22:37:45 GMT
vary
Accept-Encoding
x-amz-request-id
0A3AF3D3503D5272
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
86
x-cache-hits
246
f89e1763-220d-4e09-ba69-9e040548fb7a.svg
cdn.taboola.com/static/f8/
4 KB
2 KB
Image
General
Full URL
https://cdn.taboola.com/static/f8/f89e1763-220d-4e09-ba69-9e040548fb7a.svg
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191112-12-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

x-amz-version-id
cMrDKn.emLmm9kiiOOF64ulDT4DRy6LK
content-encoding
gzip
etag
"b8b410e4b18d45aa2f3d9bc09cd335fb"
age
84
via
1.1 varnish
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
1758
x-amz-id-2
AWcIhzzomFpHe8si5YbJiVnnNX5t8zaqWT6iUnl1jrs0orHCeA8qFpBimZz6F0EbOu64vJC5TJQ=
x-served-by
cache-fra19151-FRA
last-modified
Wed, 07 Feb 2018 11:15:52 GMT
server
AmazonS3
x-timer
S1573857465.379844,VS0,VE0
date
Fri, 15 Nov 2019 22:37:45 GMT
vary
Accept-Encoding
access-control-allow-methods
GET
x-amz-request-id
581ABC3EA067DAB9
access-control-allow-origin
*
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/svg+xml
access-control-allow-headers
*
abp
86
x-cache-hits
131
userx.20191112-12-RELEASE.es6.js
cdn.taboola.com/libtrc/
22 KB
8 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/userx.20191112-12-RELEASE.es6.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
da0b712ca2d9c1d56c96a96c3a2aabf1882a65c278834bb8d036a4c560f6979b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

x-amz-version-id
fSz91vmc5w0TsTK03BWbJocDS.YUqziR
content-encoding
gzip
etag
"e8e9c2c70275e9e1a65a1442e7e6b927"
age
100
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
7710
x-amz-id-2
8NepC4OTXT6GAbVKuBq0P1Bo1ttC6gVCCXY31ViV5R3koFWO+B2w47gCMQ3kbt7Isz/J6PRSGGc=
x-served-by
cache-fra19151-FRA
last-modified
Tue, 12 Nov 2019 11:55:34 GMT
server
AmazonS3
x-timer
S1573857465.387491,VS0,VE0
date
Fri, 15 Nov 2019 22:37:45 GMT
vary
Accept-Encoding
x-amz-request-id
9658031E63010138
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
86
x-cache-hits
82
rtb-h
trc.taboola.com/sg/mediaforcebidder-network/1/ Frame 7E68
Redirect Chain
  • https://rtb.mfadsrvr.com/sync?ssp=taboola
  • https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
  • https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=b6c551e1-ae71-4801-9a76-1505f1bcd460
0
51 B
Image
General
Full URL
https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=b6c551e1-ae71-4801-9a76-1505f1bcd460
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

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

Response headers

x-vcl-time-ms
9
date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857465.438653,VS0,VE9
x-cache
MISS
status
204
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-fra19151-FRA

Redirect headers

Location
//trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=b6c551e1-ae71-4801-9a76-1505f1bcd460
Date
Fri, 15 Nov 2019 22:37:45 GMT
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
P3P
CP="NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA"
sync.php
pixel.rubiconproject.com/exchange/ Frame 7E68
0
239 B
Image
General
Full URL
https://pixel.rubiconproject.com/exchange/sync.php?p=16698
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_GCM
Server
69.173.144.165 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
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
Expires
0
Cache-Control
no-cache,no-store,must-revalidate
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
X-RPHost
a66cbf3142c6ef39e3614b84a34262cf
Content-Type
image/gif
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/ Frame 7E68
Redirect Chain
  • https://px.powerlinks.com/user/identify?sourceId=d4a7a706-ab0f-11e8-a038-127202fb7690&rurl=https%3A%2F%2Ftrc.taboola.com%2Fsg%2Fpowerlinksdsp-network%2F1%2Frtb-h%2F%3Ftaboola_hm%3D%24%7BUSER%7D
  • https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=JdgPUsHj8biOgJWQBf_QO1GabB1zY_ZjWl3C0zswM3c%3D
45 B
271 B
Image
General
Full URL
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=JdgPUsHj8biOgJWQBf_QO1GabB1zY_ZjWl3C0zswM3c%3D
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4

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

Response headers

x-vcl-time-ms
9
date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857465.437098,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-fra19151-FRA

Redirect headers

Location
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=JdgPUsHj8biOgJWQBf_QO1GabB1zY_ZjWl3C0zswM3c%3D
Date
Fri, 15 Nov 2019 22:37:45 GMT
Server
nginx
Connection
close
Etag
"JdgPUsHj8biOgJWQBf_QO1GabB1zY_ZjWl3C0zswM3c="
Content-Length
0
rtb-h
match.taboola.com/sg/mediamath-ssp-network/1/ Frame 7E68
Redirect Chain
  • https://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID]
  • https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=c5875dcf-22df-4f00-9d88-34defa549765
  • https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=c5875dcf-22df-4f00-9d88-34defa549765&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3Dc5875dcf-22df-4f0...
0
53 B
Image
General
Full URL
https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=c5875dcf-22df-4f00-9d88-34defa549765&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3Dc5875dcf-22df-4f00-9d88-34defa549765
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

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

Response headers

date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857465.459061,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4036-HHN

Redirect headers

x-vcl-time-ms
8
date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857465.437141,VS0,VE8
x-served-by
cache-fra19151-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=c5875dcf-22df-4f00-9d88-34defa549765&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3Dc5875dcf-22df-4f00-9d88-34defa549765
accept-ranges
bytes
content-length
0
x-cache-hits
0
/
trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/ Frame 7E68
Redirect Chain
  • https://bh.contextweb.com/bh/rtset?pid=562107&ev=1&rurl=https%3A%2F%2Ftrc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=%%VGUID%%
  • https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=0Hi759cFn7ac&ev=1&pid=562107
0
57 B
Image
General
Full URL
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=0Hi759cFn7ac&ev=1&pid=562107
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

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

Response headers

x-vcl-time-ms
9
date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857465.428845,VS0,VE9
x-cache
MISS
status
204
x-cache-hits
0
accept-ranges
bytes
x-served-by
cache-fra19151-FRA

Redirect headers

Date
Fri, 15 Nov 2019 22:37:45 GMT
Via
1.1 varnish
X-Cache
MISS
P3p
policyref="/bh/w3c/p3p.xml", CP="NOI DSP COR NID CURa DEVa PSAa OUR BUS COM NAV INT"
X-Cache-Hits
0
Connection
keep-alive
Content-Length
0
X-Served-By
cache-fra19153-FRA
Server
Jetty(9.4.7.v20170914)
Vary
Accept-Encoding
Content-Language
en
Location
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=0Hi759cFn7ac&ev=1&pid=562107
Cache-Control
private, max-age=0, no-cache, no-store
Accept-Ranges
bytes
Content-Type
text/plain; charset=utf-8
Cw-Server
bh-deployment-stage-0
Expires
-1
getuidnb
ib.adnxs.com/ Frame 7E68
43 B
691 B
Image
General
Full URL
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/appnexus-network/1/rtb-h/?taboola_hm=$UID
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.172.250 , Ascension Island, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
538.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Date
Fri, 15 Nov 2019 22:37:47 GMT
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 538.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.165:80
AN-X-Request-Uuid
e31d24b3-cef7-4559-a150-087dec49961e
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
rtb-h
match.taboola.com/sg/google-network/1/ Frame 7E68
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm&google_sc
  • https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEO1JYeLatDVBZVz-S52NC6A&google_cver=1
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEO1JYeLatDVBZVz-S52NC6A&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3DCAESEO1JYeLatDVBZVz-S52NC6A%26goo...
0
53 B
Image
General
Full URL
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEO1JYeLatDVBZVz-S52NC6A&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3DCAESEO1JYeLatDVBZVz-S52NC6A%26google_cver%3D1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

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

Response headers

date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857465.437963,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4036-HHN

Redirect headers

x-vcl-time-ms
9
date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857465.424046,VS0,VE9
x-served-by
cache-fra19151-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEO1JYeLatDVBZVz-S52NC6A&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3DCAESEO1JYeLatDVBZVz-S52NC6A%26google_cver%3D1
accept-ranges
bytes
content-length
0
x-cache-hits
0
getuidnb
ib.adnxs.com/ Frame 7E68
43 B
691 B
Image
General
Full URL
https://ib.adnxs.com/getuidnb?https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=$UID
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.172.250 , Ascension Island, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
538.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
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
Date
Fri, 15 Nov 2019 22:37:47 GMT
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 538.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.254:80
AN-X-Request-Uuid
cd63f3e1-24f0-4a99-9659-26dbd05d2b27
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
rtb-h
match.taboola.com/sg/thetradedesk-network/1/ Frame 7E68
Redirect Chain
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=054f32o&ttd_tpi=1
  • https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=00416bb9-6233-4344-a5c6-65a0787c7a34
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=00416bb9-6233-4344-a5c6-65a0787c7a34&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D00416bb9-6233-4344...
0
53 B
Image
General
Full URL
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=00416bb9-6233-4344-a5c6-65a0787c7a34&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D00416bb9-6233-4344-a5c6-65a0787c7a34
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

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

Response headers

date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857465.475649,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4036-HHN

Redirect headers

x-vcl-time-ms
9
date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857465.461183,VS0,VE9
x-served-by
cache-fra19151-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=00416bb9-6233-4344-a5c6-65a0787c7a34&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D00416bb9-6233-4344-a5c6-65a0787c7a34
accept-ranges
bytes
content-length
0
x-cache-hits
0
rtb-h
match.taboola.com/sg/storygize-network/1/ Frame 7E68
Redirect Chain
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=1f5b313a-f830-4a37-af11-964dc6e7f647
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=1f5b313a-f830-4a37-af11-964dc6e7f647&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D1f5b313a-f830-4a37-af...
0
76 B
Image
General
Full URL
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=1f5b313a-f830-4a37-af11-964dc6e7f647&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D1f5b313a-f830-4a37-af11-964dc6e7f647
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

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

Response headers

date
Fri, 15 Nov 2019 22:37:46 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857466.124692,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4036-HHN

Redirect headers

x-vcl-time-ms
9
date
Fri, 15 Nov 2019 22:37:46 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857466.111406,VS0,VE9
x-served-by
cache-fra19151-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=1f5b313a-f830-4a37-af11-964dc6e7f647&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D1f5b313a-f830-4a37-af11-964dc6e7f647
accept-ranges
bytes
content-length
0
x-cache-hits
0
cookiesync
bttrack.com/pixel/ Frame 7E68
35 B
380 B
Image
General
Full URL
https://bttrack.com/pixel/cookiesync?source=14b8c562-d12b-418b-b680-ad517d5839ec
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_GCM
Server
192.132.33.46 , United States, ASN18568 (BIDTELLECT - Bidtellect Inc., US),
Reverse DNS
46.bidtellect.com
Software
Microsoft-IIS/8.5 /
Resource Hash
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992

Request headers

Sec-Fetch-Mode
no-cors
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

X-ServerName
Track004-dc3
Pragma
no-cache
Date
Fri, 15 Nov 2019 22:37:45 GMT
X-AspNetMvc-Version
5.2
Server
Microsoft-IIS/8.5
X-AspNet-Version
4.0.30319
P3P
CP="CAO DSP COR ADMo DEVo PSAo PSDo HISo IVAo IVDo OUR IND OTC"
Cache-Control
private,no-cache
Content-Type
image/gif
Content-Length
35
Expires
-1
/
cds.taboola.com/ Frame 7E68
0
293 B
Image
General
Full URL
https://cds.taboola.com/?uid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&_r=115451
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
130.211.13.252 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
252.13.211.130.bc.googleusercontent.com
Software
nginx/1.16.1 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
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
Fri, 15 Nov 2019 22:37:45 GMT
Via
1.1 varnish
Server
nginx/1.16.1
X-Timer
S1573857466.633263,VS0,VE17
X-Served-By
cache-dca17766-DCA
X-Cache
MISS
x-envoy-upstream-service-time
0
Connection
close
Accept-Ranges
bytes
Content-Length
0
X-Cache-Hits
0
rtb-h
match.taboola.com/sg/bidswitch-network/1/ Frame 7E68
Redirect Chain
  • https://x.bidswitch.net/sync?ssp=taboola
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola
  • https://u.ipw.metadsp.co.uk/sync?ssp=bidswitch&bidswitch_ssp_id=taboola&bsw_user_id=7cfeeee4-2fe5-4a95-9544-7953fda7eed5&bsw_param=7cfeeee4-2fe5-4a95-9544-7953fda7eed5&gdpr=&gdpr_consent=
  • https://x.bidswitch.net/sync?dsp_id=339&expires=14&user_group=0&user_id=&ssp=taboola&bsw_param=7cfeeee4-2fe5-4a95-9544-7953fda7eed5
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=7cfeeee4-2fe5-4a95-9544-7953fda7eed5
  • https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=7cfeeee4-2fe5-4a95-9544-7953fda7eed5&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D7cfeeee4-2fe5-4a95-95...
0
53 B
Image
General
Full URL
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=7cfeeee4-2fe5-4a95-9544-7953fda7eed5&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D7cfeeee4-2fe5-4a95-9544-7953fda7eed5
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

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

Response headers

date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857466.595810,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4036-HHN

Redirect headers

x-vcl-time-ms
10
date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857466.581188,VS0,VE10
x-served-by
cache-fra19151-FRA
status
302
x-cache
MISS
location
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=7cfeeee4-2fe5-4a95-9544-7953fda7eed5&tbid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39&query=taboola_hm%3D7cfeeee4-2fe5-4a95-9544-7953fda7eed5
accept-ranges
bytes
content-length
0
x-cache-hits
0
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1076815648&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ul=en-us&de=UTF-8&dt=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEADQ~&jid=&gjid=&cid=958900569.1573857465&tid=UA-204785-4&_gid=1765026230.1573857465&cd1=Martin%20Maciej&cd5=2015-03-26T11%3A56%3A29%2B01%3A00&cg1=Themenspecials&cg2=2762322&cg3=05-2016&cd2=software&cd6=Artikelseite&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=bob&cd10=Original%20%22sticky%20header%22&cm73=1&cm13=1&z=839075839
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 01 Nov 2019 09:12:57 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1257888
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
61 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191112-12-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
9
date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
status
204
x-served-by
cache-fra19151-FRA
pragma
no-cache
server
nginx
x-timer
S1573857465.416385,VS0,VE9
content-type
image/gif
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
423 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191112-12-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
10
date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
x-cache
MISS
p3p
policyref="http://trc.taboola.com/p3p.xml", CP="NOI DSP COR LAW NID CURa ADMa DEVa PSAa PSDa OUR BUS IND UNI COM NAV INT DEM"
status
204
x-served-by
cache-fra19151-FRA
pragma
no-cache
server
nginx
x-timer
S1573857465.413929,VS0,VE10
content-type
image/gif
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
data
lb67.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb67.s400.meetrics.net/data?/cgK2D3EAAKktFLkqFFlqwF23A52AwwA/k0FCEmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA4xAwwAw5A1mAjwFpkF9kElzFr0FvwFmhEwhF91AyxAw2A55A03AwmAjpFk9BxzA4yA5yA2wA55A3xAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1yAxwA25A50A3wAmhEwkF91AyxAw2A55A03AwmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Az4A13A02A1zA2yALlnFB/k0FOImvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA4xAwwAw5A1mAjwFpkF9kElzFr0FvwFmhEwhF91AyxAw2A55A03AwmAjpFk9BxzA4yA5yA2wA55A3xAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1yAxwA25A50A3wAmhEwkF91AyxAw2A55A03AwmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Az4A13A02A1zA2yAmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Az4A13A02A10AwwAUkzFYBPQEAAAAAAABvn8APBAAFAAvn8TYeNAPAAAYGA5BABYeNAZAAAOA55A55A85B55A58E55A55AGAy0A4zAwzArYeNASksFJFjAAAAAAAAAAAAEAAAvn8AAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHA33Aw4Ey1AwBEMAxzA4yA5yA2wA55A3xAGAkpFylFj0FAAAAIAy4AxwAwwA51AKA1yAxwA25A50A3wAGAihFuuFlyFKA1yAxwA25A50A3wAKA1yAxwA25A50A3wAwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFdYGA5BACMA6DAFAAAYeNAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFzmB8YA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:45 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 15-Nov-19 22:37:44 GMT
d401ee82-93fd-4c56-b9c7-05f319e5cb25.png
c.nativendo.de/cdn/asset/media/crt/52014/2/3/
47 KB
47 KB
Image
General
Full URL
https://c.nativendo.de/cdn/asset/media/crt/52014/2/3/d401ee82-93fd-4c56-b9c7-05f319e5cb25.png?v=1572350302&width=350
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:ac0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
1cf2630bd915650cc9de60acc3dd011ea56516e07f68ac5cac7837b45821e932

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 google
cf-cache-status
HIT
age
631504
cf-polished
origSize=52081, status=webp_bigger
status
200
alt-svc
clear
content-length
47845
cf-bgj
imgq:100
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
image/jpeg
cache-control
public, max-age=31536000
accept-ranges
bytes
cf-ray
5364b626ddc75982-VIE
expires
Sat, 07 Nov 2020 11:26:34 GMT
ai.aspx
m.exactag.com/
Redirect Chain
  • https://track.adform.net/adfserve/?bn=33683028;1x1inv=1;srctype=3;ord=1573857465
  • https://track.adform.net/adfserve/?CC=1&bn=33683028;1x1inv=1;srctype=3;ord=1573857465
  • https://m.exactag.com/ai.aspx?tc=8d94023d893b6f61389437d4033a9fa0&rnd=44033
43 B
654 B
Image
General
Full URL
https://m.exactag.com/ai.aspx?tc=8d94023d893b6f61389437d4033a9fa0&rnd=44033
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
85.14.248.71 Meerbusch, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
Microsoft-IIS/8.5 / ASP.NET
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:44 GMT
X-ET-Code
0
Server
Microsoft-IIS/8.5
X-AspNet-Version
4.0.30319
X-Powered-By
ASP.NET
P3P
policyref="https://m.exactag.com/w3c/p3p.xml", CP="NOI NID STP STA CUR OUR"
Cache-Control
private
Last-Modified
Fr, 15 Nov 2019 10:37:45 GMT
X-ET-Camp
723
Connection
close
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

pragma
no-cache
date
Fri, 15 Nov 2019 22:37:45 GMT
server
nginx
status
302
location
https://m.exactag.com/ai.aspx?tc=8d94023d893b6f61389437d4033a9fa0&rnd=44033
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate, no-transform
content-type
text/html; charset=utf-8
expires
-1
userconnect
ih.adscale.de/
95 B
364 B
Script
General
Full URL
https://ih.adscale.de/userconnect?ssl=1&sid=192243&cbfn=stroeerCoreConnect&ts=1573857465411&umd=false
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
70072788613bde80533a3cb95d5a16c924011004b1d861093610379370beb859

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:45 GMT
Server
Apache-Coyote/1.1
Content-Type
application/javascript
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
95
Expires
Fri, 15 Nov 2019 22:37:45 GMT
632d8c58-880e-4873-9f41-bad525386b77
t.nativendo.de/cds/tracking/event/
0
170 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/632d8c58-880e-4873-9f41-bad525386b77?noc=553cq96o&aid=182yo&cid=60y68&cti=8nyf4&imp=13&t=ad%2Fview&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ts=1573857465
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 google
last-modified
Fri, 15 Nov 2019 22:37:45 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
254 B
671 B
Image
General
Full URL
https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

x-amz-version-id
hL.cyLD7Q4TL5ceY.7JQwF9m5IYI8mkC
via
1.1 varnish
etag
"dfa7b52c86e56bd67fa4002f6ed19854"
age
9920
x-cache
HIT
status
200
x-amz-replication-status
COMPLETED
content-length
254
x-amz-id-2
Vjnfq2okxpLEG/cBVxSfv3DOOCGN7KTpixt29L7DwUhoZL6eRlgDSODZqhfatrYL58q01gaLKf4=
x-served-by
cache-fra19151-FRA
last-modified
Wed, 24 Jun 2015 07:14:11 GMT
server
AmazonS3
x-amz-meta-s3cmd-attrs
uid:0/gname:root/uname:root/gid:0/mode:33188/mtime:1377415166/atime:1435052450/md5:dfa7b52c86e56bd67fa4002f6ed19854/ctime:1422381567
x-timer
S1573857465.425449,VS0,VE0
date
Fri, 15 Nov 2019 22:37:45 GMT
x-amz-request-id
F6D91014AAA6CDC4
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/png
abp
86
x-cache-hits
8047
creative_js.js
vidstat.taboola.com/vpaid/units/14_12_0/creatives/
4 KB
2 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191112-12-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 a436b6df4b0d1bd189edf722b5d2a523.cloudfront.net (CloudFront), 1.1 varnish
age
146486
x-amz-meta-mtime
1499351521
x-cache
Hit from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
1827
x-served-by
cache-fra19151-FRA
last-modified
Wed, 06 Sep 2017 08:46:00 GMT
server
AmazonS3
x-timer
S1573857465.453064,VS0,VE0
etag
"0df6cb700db4e2c8b3b7dcb734e91cb0"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
Bz1oMGf3im0GdaDR1lpP366TMdyCBt5NXOq1IlamWrJqJW2zqe6XsA==
x-cache-hits
392637
Cookie set map
ih.adscale.de/ Frame FE9D
0
0
Document
General
Full URL
https://ih.adscale.de/map?format=display&ssl=1
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
ih.adscale.de
Connection
keep-alive
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
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Accept-Encoding
gzip, deflate, br
Cookie
uu=6898c7d418424225bf66be962d28c288; tu=4#471048492#48~831c33358ecbd0f2ccffa910b98a4397~437182~0~0; ng=2#1188863686#26230957#0#d7~2&d10~1&d2~3&d4~1&d11~3&d8~2&d9~1&d12~2&d1~1&d3~3
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Fri, 15 Nov 2019 22:37:45 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Fri, 15 Nov 2019 22:37:45 GMT
Content-Length
655
Connection
keep-alive
Set-Cookie
tu=4#2788578243#48~831c33358ecbd0f2ccffa910b98a4397~437182~0~0#101~~437182~437182~1#38~~437182~437182~1#39~~437182~437182~1#40~~437182~437182~1#42~~437182~437182~1#75~~437182~437182~1#108~~437182~437182~1#63~~437182~437182~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None
st
imprammp.taboola.com/ Frame AD32
0
0
Document
General
Full URL
https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=1D26B4B21450068731176809945&cicmp=1657475&cijs=1&dast=V7DfcCFgMauEugUItsDAQauEugUItsDAUAAAAGBvQHGzGizCakCWUxWg0Gs-FushgsN4vVcrcaTCHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3AhabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtfDgAAAAAPAEqF_RA_gAAAEQAAAAASAAAAABQBFf8WAhcAAAAAGAAFWD8aAFAcDOe6W192o8P1edn9AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA1VK7VvMI7tH9EVIBYxAgAAAAAkqnN42hSJ1QWVQAABOlWAFcAAAFucTcUMlm6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTYhozC0tiKWAV-0XEABg7RcQAIBN3QAA3gLggi4AVmcQk81oN5kdAAAAwN3___-_HsiMVo6Nw-MaDkaejcmzWjmMw5Fn4ls5TIvZyGXynt21hWn3nbN034iwzH7fQUE5PT1ml0HGcpkMaoGsaXL5DeKDhmE5GQTzm7DFaDWZbJbD2XIxGQxHw9FofwI3GuAEDYeDxW6w2C0Ww8liMhosBwsUiMEEJ2Q42kxWo91qN1kOJ6PRbDPZIEWrVrPRZjBczSaz3W41HAyXoxFStGYxm0wWs9FytxksJ6PBcDIcIkzuhpuZZeVc63Yj11o0G47cEodpsNaMLJOZy7McrSzDtej1MZ02xoXLs9yiYMDRXgQX6URzuvxdLstb87a4dU6fwyKWaE4W6UR22XdGK8fG4XENByPPxuRZrRzG4cgz8a0cpsVs5DL5m7vhZmZZOde63ci1Fs2GI7fEYRqsNSPLZObyLEcry3Aten1Mp41x4fIs943VbjNc7Uaz1b6x2m2Gq91ottp36Azf1edsVN60Co_MY3uWdLuZ06BwGSzen8S0mHZnB8_vd3SqVBeNsSH7JhRmg8dgUMQSwekinYhextNFLJE8LdKJZDJbrRarlXFiW65ctt1gsFgONy6XybAwbhyT4UQsUZou0ole97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtF_ceGGI3mutlcMVjONYNVAgAAAAAAAABYwpx5EwAAAIDTQBaLwWSxXAAIMdZdf-VRDm_uueTixo8h5nT5u1yWt-ZtceucPocB!&excid=22&tst=1&docw=0&cs=false
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
imprammp.taboola.com
:scheme
https
:path
/st?cipid=8045671&ttype=0&cirid=1D26B4B21450068731176809945&cicmp=1657475&cijs=1&dast=V7DfcCFgMauEugUItsDAQauEugUItsDAUAAAAGBvQHGzGizCakCWUxWg0Gs-FushgsN4vVcrcaTCHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3AhabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtfDgAAAAAPAEqF_RA_gAAAEQAAAAASAAAAABQBFf8WAhcAAAAAGAAFWD8aAFAcDOe6W192o8P1edn9AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA1VK7VvMI7tH9EVIBYxAgAAAAAkqnN42hSJ1QWVQAABOlWAFcAAAFucTcUMlm6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTYhozC0tiKWAV-0XEABg7RcQAIBN3QAA3gLggi4AVmcQk81oN5kdAAAAwN3___-_HsiMVo6Nw-MaDkaejcmzWjmMw5Fn4ls5TIvZyGXynt21hWn3nbN034iwzH7fQUE5PT1ml0HGcpkMaoGsaXL5DeKDhmE5GQTzm7DFaDWZbJbD2XIxGQxHw9FofwI3GuAEDYeDxW6w2C0Ww8liMhosBwsUiMEEJ2Q42kxWo91qN1kOJ6PRbDPZIEWrVrPRZjBczSaz3W41HAyXoxFStGYxm0wWs9FytxksJ6PBcDIcIkzuhpuZZeVc63Yj11o0G47cEodpsNaMLJOZy7McrSzDtej1MZ02xoXLs9yiYMDRXgQX6URzuvxdLstb87a4dU6fwyKWaE4W6UR22XdGK8fG4XENByPPxuRZrRzG4cgz8a0cpsVs5DL5m7vhZmZZOde63ci1Fs2GI7fEYRqsNSPLZObyLEcry3Aten1Mp41x4fIs943VbjNc7Uaz1b6x2m2Gq91ottp36Azf1edsVN60Co_MY3uWdLuZ06BwGSzen8S0mHZnB8_vd3SqVBeNsSH7JhRmg8dgUMQSwekinYhextNFLJE8LdKJZDJbrRarlXFiW65ctt1gsFgONy6XybAwbhyT4UQsUZou0ole97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtF_ceGGI3mutlcMVjONYNVAgAAAAAAAABYwpx5EwAAAIDTQBaLwWSxXAAIMdZdf-VRDm_uueTixo8h5nT5u1yWt-ZtceucPocB!&excid=22&tst=1&docw=0&cs=false
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
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
cookie
t_gid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
server
nginx
accept-ranges
bytes
date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 varnish
x-served-by
cache-hhn4036-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1573857465.463927,VS0,VE8
content-length
0
cmTagFEED_MANAGER.js
vidstat.taboola.com/vpaid/units/26_2_3/infra/
669 KB
149 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/units/26_2_3/infra/cmTagFEED_MANAGER.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
4479c9f0355574da9f9abd671579d7c0682862393faf87ff207545752d30a322

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 c6702f5f3b6e77da6f394e67ef1a6aab.cloudfront.net (CloudFront), 1.1 varnish
age
460690
x-amz-meta-mtime
1573396557
x-cache
Miss from cloudfront, HIT
x-amz-meta-ctime
1573396591
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
152117
x-served-by
cache-fra19151-FRA
last-modified
Sun, 10 Nov 2019 14:36:33 GMT
server
AmazonS3
x-timer
S1573857465.465182,VS0,VE0
etag
"3e9437b87f1351fb4f049ead9b56b608"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50-C1
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
Spq3PYBWYK_E_ZyKJqnQK3cp16GmgvVNBC2xD6K6eYquDdrbXfhXdw==
x-cache-hits
687947
cmOsUnit.css
vidstat.taboola.com/vpaid/units/26_2_3/assets/css/
34 KB
6 KB
Stylesheet
General
Full URL
https://vidstat.taboola.com/vpaid/units/26_2_3/assets/css/cmOsUnit.css
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
3dba93f65c632536a0fcba4dff71f82f7d6ae88b3a2814d82a1b1876558d79c1

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 fb8c0300277bd0137c1693d3d64ab550.cloudfront.net (CloudFront), 1.1 varnish
age
460690
x-amz-meta-mtime
1573396555
x-cache
Miss from cloudfront, HIT
x-amz-meta-ctime
1573396568
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
6240
x-served-by
cache-fra19151-FRA
last-modified
Sun, 10 Nov 2019 14:36:11 GMT
server
AmazonS3
x-timer
S1573857465.465150,VS0,VE0
etag
"1112e8ccb1e3ed0d2e59d31564a5dfae"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50-C1
accept-ranges
bytes
content-type
text/css
x-amz-cf-id
3ihH-fUaSZ7jDJtOj0uvD781tdpGsZFq0kqOpBDV7pR0A_CxEyT67g==
x-cache-hits
922460
view
securepubads.g.doubleclick.net/pcs/ Frame 1CA2
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuGKrcVxutBQLJAxtD78sjkKmlSv3j--HwEsvauSi7JpyzY0Ht2UjYQ5wL22erPot-pQdhHn8vWx_67d9Pm-iDm0vAiB_UxIfoTBYCvN8T6LzYbY930JEwmbWWZ5a4b09VQxpKrmLdMex6lve5rMNeHvgykh9mSZQuqT2rqLFWKbtQGCKD7wDpFSiB8n3S_o9lA7bQ4W0FYBVuFILo1P6TrOrHjMR5tro_9CMERaFe-NT9v3q5OOP2rG2A-pAszgJusKtV5xHb2RPsoV1MllUH1MBBBGylop8mAEjxFeMyzzAVazFQ7-FrZKAc&sig=Cg0ArKJSzBsoDSHIqPJBEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

timing-allow-origin
*
date
Fri, 15 Nov 2019 22:37:45 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
0
x-xss-protection
0
dcmads.js
fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754022/dcm/ Frame 1CA2
197 KB
67 KB
Script
General
Full URL
https://fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754022/dcm/dcmads.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111201.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
199.166.0.24 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.fw.adsafeprotected.com
Software
nginx /
Resource Hash
2487d1d9da384f4f793fb112f36af86a85293670abbb7b1d3b50d0dc8c4722ac

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:45 GMT
Content-Encoding
gzip
X-Server-Name
app27ami.ami.303net.pvt
Transfer-Encoding
chunked
Content-Type
application/javascript;charset=utf-8
Access-Control-Allow-Origin
fw.adsafeprotected.com
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
Server
nginx
Expires
Wed, 31 Dec 1969 23:59:59 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 1CA2
77 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111201.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
e55d4c6befec7b38f6bbbfbf4a6d821e1894b125814cb2b86eae646f98076e12
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573648928056700"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29301
x-xss-protection
0
expires
Fri, 15 Nov 2019 22:37:45 GMT
632d8c58-880e-4873-9f41-bad525386b77
t.nativendo.de/cds/tracking/event/
0
170 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/632d8c58-880e-4873-9f41-bad525386b77?aid=182yo&t=data%2Finventory&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&ts=1573857466
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1175
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 15 Nov 2019 22:37:45 GMT
via
1.1 google
last-modified
Fri, 15 Nov 2019 22:37:45 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
skeleton.js
static.adsafeprotected.com/ Frame 1CA2
Redirect Chain
  • https://fw.adsafeprotected.com/rfw/www.googletagservices.com/346702/39754022/dcm/dcmads.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online...
  • https://static.adsafeprotected.com/skeleton.js
17 B
299 B
Script
General
Full URL
https://static.adsafeprotected.com/skeleton.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
199.166.0.32 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.static.adsafeprotected.com
Software
nginx /
Resource Hash
bdeed1e1c0751610c8f3dc2a5c78c93f841c366b36a7f7a54f5e6752c2656c05

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
Last-Modified
Thu, 19 Dec 2013 18:10:33 GMT
X-Server-Name
app36ami.ami.303net.pvt
ETag
"52b33699-11"
Content-Type
application/javascript
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
17
Server
nginx

Redirect headers

Pragma
no-cache
Date
Fri, 15 Nov 2019 22:37:45 GMT
X-Server-Name
app27ami.ami.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Location
https://static.adsafeprotected.com/skeleton.js
Cache-Control
no-cache
Connection
keep-alive
Content-Length
0
Server
nginx
sca.17.4.95.js
static.adsafeprotected.com/ Frame A016
81 KB
20 KB
Script
General
Full URL
https://static.adsafeprotected.com/sca.17.4.95.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
199.166.0.32 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.static.adsafeprotected.com
Software
nginx /
Resource Hash
149c8d10677f2f6979fa28c078cf832f575ee53c397d791b739e7c4c687fe7bc

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
Content-Encoding
gzip
Last-Modified
Tue, 19 Jun 2018 17:20:43 GMT
X-Server-Name
app36ami.ami.303net.pvt
ETag
"5b293b6b-4fda"
Content-Type
application/javascript
Cache-Control
max-age=315360000
Connection
keep-alive
Content-Length
20442
Server
nginx
Expires
Thu, 31 Dec 2037 23:55:55 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame A60D
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuThGaecvm-iyVBxO-20HDJAZIozAyRsoc6xY1N3xM7Pp-sr930p2RCUpbm94hme6QZOwqrq0o1UT9Jg4nwkEGwkFZoqQbeBfqDBhiI_bbboOApaSNBe1IS3PkvM2NJXE3-lyX91EiRJHTX_3kZpGVK6RRl_URl8jxbUe0YLcL_UZxzjpyEbiZd3DMkWe60HySoDYkxr89LUdI7qud9lIyRK1bOv8SDCKjhOkERC6ujAqqx7n880WNyJZOl-6o-UzY8oINN5sXljY0ulfwkSF-orU60oWfBlSeSShChoDmsZR_s2Nlqfjyqz8c&sig=Cg0ArKJSzMIEJEOfUYXvEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.98 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s45-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

timing-allow-origin
*
date
Fri, 15 Nov 2019 22:37:45 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",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
content-length
0
x-xss-protection
0
dcmads.js
fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754020/dcm/ Frame A60D
197 KB
67 KB
Script
General
Full URL
https://fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754020/dcm/dcmads.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111201.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
199.166.0.24 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.fw.adsafeprotected.com
Software
nginx /
Resource Hash
fbf38b1ee6fddd08f1aad56056b0a8950a6f72f593e5ff1a8220513cc35e8112

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:45 GMT
Content-Encoding
gzip
X-Server-Name
app27ami.ami.303net.pvt
Transfer-Encoding
chunked
Content-Type
application/javascript;charset=utf-8
Access-Control-Allow-Origin
fw.adsafeprotected.com
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
Server
nginx
Expires
Wed, 31 Dec 1969 23:59:59 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame A60D
77 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111201.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
e55d4c6befec7b38f6bbbfbf4a6d821e1894b125814cb2b86eae646f98076e12
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573648928056700"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29301
x-xss-protection
0
expires
Fri, 15 Nov 2019 22:37:45 GMT
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame A0DF
53 B
642 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=3340776473
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFNhZWdvb3BoSXNvVGhvb0Q9U2FlZ29vcGhJc29UaG9vRHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5OayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5CbihtKTtiLkFuKGwpO2IucG4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Kbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5wbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTms9ITE7dGhpcy5GYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmFuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYmo9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLiRuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxFazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYW46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuJG0oYi5kYXRhKX0sJG06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxDazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHVtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxMbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuZ2woYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTG4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUGs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGdsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5QayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxLYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0RpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEtpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAplbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxEajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxXajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuRGkoKXx8Yi5LaSgpfHxiLmVtKCl8fGIuRGooKXx8Yi5saygpfHxiLnJqKCl8fGIuV2ooKX19O3JldHVybiBudWxsIT1iLktrKCl9LEVsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sc2E6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxnYzpmdW5jdGlvbihiKXtiPXRoaXMuc2EoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFNsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuc2EoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxrbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxTbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuRmI7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxjbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlNsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVG46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmZjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5jbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVWsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy51bShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5DayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxDbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQ20oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkpuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYmp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmFqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVm09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuT209e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLiRvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Dbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTm09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5abz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmRsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eud2s9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnZrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlFtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuVm89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EueW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlBtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5hanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLnZqfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxPbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5PbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmNqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhtfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTWk9YX0pKGMpO3ZhciBLPWMuTWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Zanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTGI9MDt0aGlzLlRhPTE1MDt0aGlzLlJiPTA7dGhpcy5DbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGE/KHRoaXMuTGIrKyx0aGlzLlJiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTGI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLkxiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxDbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuWm4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxvbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkpqfHx0OyhmdW5jdGlvbihjKXtjLkxqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5MYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRWI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTm46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRm46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGEmJih0aGlzLkxiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ibSgpfHx0aGlzLnlrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHlrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkViPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5FYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRWImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLkxqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucms9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLldiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5EbihiKX0sZjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGdtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmZjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5mYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV09MX0sbG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZmMoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmdtKCk7aWYoIXRoaXMubG0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5XYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5XYiYmMDx0aGlzLldiLmxlbmd0aCYmKHRoaXMuV2I9ZS51bmlxdWUodGhpcy5XYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuV2Iuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LEtuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ya30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxNbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEZtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5vb3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubWE/Yi5tYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5UaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLk9qfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5jbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5ranx8cmE7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmNsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5uYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5qanx8c2E7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5JbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLm9tKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSWw6ZnVuY3Rpb24oKXt2YXIgYT1lLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmxqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5mbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuZm18fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5na3x8d2E7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuS2IoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuTW0oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5RaygpLAp0aGlzLnNiKCkpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubWE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubWE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubWE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LG1tOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMua20oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0sa206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5sbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGxuOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUWs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLm1tKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sUms6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuY20oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxjbTpmdW5jdGlvbigpe2lmKDA8PWUuZ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkVsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMubmEoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFprOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSW8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5JbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnRuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlprKCl9LmJpbmQodGhpcyksNTApKSl9LHRuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Kbyl7dGhpcy5Kbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmZrfHx4YTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmhrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5Ja3x8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFhtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Ganx8QmE7KGZ1bmN0aW9uKGMpe2MuRWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkdifHwodGhpcy5HYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkdiKyssMTU8dGhpcy5HYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlhtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkdqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnpqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy56anx8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuWm09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy5abSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxyYTpmdW5jdGlvbigpe3JldHVybiEwfSxZazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5oanx8R2E7KGZ1bmN0aW9uKGMpe2MuZ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZ2p8fEhhOyhmdW5jdGlvbihjKXtjLmlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaWp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5CaXx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmRqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEVuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sems6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5kanx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkVuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZWo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmVqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLk5pPWE7YS5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSG46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnJuKCk7dGhpcy5EYSYmdGhpcy5xbigpfX19KShjKTt2YXIgTWE9Yy5OaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLlpiPSIiO3RoaXMuZ2Q9dGhpcy5ZYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMub2E9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk5iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuVmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuT2I9IiI7dGhpcy5QYj1bXTt0aGlzLlFiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlViPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5maj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMub2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5OYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlZiLHRlc3RIaWRlOnRoaXMuT2IsdGVzdFRhZ3M6dGhpcy5QYix0ZXN0VGFnc0pTOnRoaXMuUWIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5VYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHpuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLlpiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLm9hPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5OYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlZiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuT2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5RYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVWI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sJGw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSmw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy5zYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuWmJ8fHRoaXMuamJ8fHRoaXMuWWJ8fHRoaXMuZ2QpJiYoaD10aGlzLkptKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCkxsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxJbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuc2EoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEptOmZ1bmN0aW9uKGIpe3RoaXMuWmImJgooYis9dGhpcy5aYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5ZYiYmKGI9dGhpcy5JbShiLHRoaXMuWWIpKTtyZXR1cm4gYn0sWGs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuU2sodGhpcy56YS5jbGllbnRBUElzKX0sU2s6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkluKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5IbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5vYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5YaygpO3RoaXMuQm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMub2EpdGhpcy56bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMub2EpdHJ5e3RoaXMub2E9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLm9hKXRyeXt0aGlzLm9hPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQm06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWWwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sem06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMub2ErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMub2EuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLktiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5nYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlNiKCk7ZS5GYyhrLlZtKTsoYT1lLmdjKHRoaXMueGQoKSkpfHwoYT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxZbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMub2F8fHRoaXMuTmJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5TYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLm9hfWVsc2UgZD10aGlzLm9hO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fAplLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8ZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLk5iPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5KZT1kLmFkcGF0aHx8IiI7dGhpcy5zZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5nYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLk5iJiZ0aGlzLkFhJiZ0aGlzLmdhLmxlbmd0aD90aGlzLk1jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlNiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy5zYSh0aGlzLk5iKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLk5iK3RoaXMub2UoImN1c3RvbWVyIikpO3RoaXMuSWEoYSx0aGlzLmJvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnVmKCJjdXN0b21lciIpO2I/dGhpcy5Waj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlZqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0sYm86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0KITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5WYz10aGlzLmZiKGQuc3RyaWN0KTt0aGlzLlRkPXRoaXMuZmIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuR2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLiRhPXRoaXMuZmIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5PYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlFiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLlpiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWWI9CmQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5nZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT1kLmpzcG9wdXBzfHwhMTt0aGlzLnRiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLlViPWQudnBhaWR8fCExO3RoaXMuemEudnBhaWQ9dGhpcy5VYjt0aGlzLkFmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMua2Q9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLk9mPWQudm1hcHN8fCIiO3RoaXMuemM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLk9hPWQuYml0cmF0ZXx8MUUzO3RoaXMuaWU9ZC5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuUGQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaWM9ITAsdGhpcy5NYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5wbygpJiYodGhpcy5PYnx8dGhpcy5RYnx8dGhpcy5QYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9CiEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuU2IoKSk6dGhpcy5mbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkdmKCkpfX0sZm86ZnVuY3Rpb24oKXt0aGlzLmVvKCk7dGhpcy5obygpfSxobzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xOwpmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRj1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEYsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihGKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrCmUuemIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy56YSYmdGhpcy56YS5wbGF5ZXImJnRoaXMuemEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZGEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEdmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5TYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz0KdGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIoYSkpLHRoaXMuU2IoKSx0aGlzLnRlKCkpfSxlbzpmdW5jdGlvbigpe2lmKHRoaXMuT2Ipe3ZhciBhPWUucmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLnJtKCkpdGhpcy5PZCh0aGlzLlZiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5PYik7Zy5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLk9iKTtnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7CmE9ZH1jYXRjaChmKXt9YT90aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmRpKCl9fWVsc2UgdGhpcy5kaSgpfSxjaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigpKTt0aGlzLmtvKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy4kaC5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5WYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlBiPXRoaXMuVWMpJiZ0aGlzLlBiLmxlbmd0aCl7dmFyIGQ9dGhpcy5QYi5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLiRoKCl9LGtvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuS2IoKSk7dGhpcy5sbyhmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuY2kuYmluZCh0aGlzKSxnLmJpbmQodGhpcykpfWZ1bmN0aW9uIGcoKXt0aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuUWImJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuY2koKX0sbG86ZnVuY3Rpb24oYSxnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLAohMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZyl7Zz09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSwkaDpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuemQodGhpcy5vYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5BYj0hdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LAphaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuU2IoKTt0aGlzLnRlKCl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sU2I6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpO3RoaXMuVmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5WZCYmdGhpcy5WZCh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5BYn0pfSwKV2s6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLiRsKCkpe3ZhciBhPXRoaXMuSmwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9ITApO2MmJmUucG0oKSYmKGEuUWc9ITApO2gmJihhLlpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFRrOmZ1bmN0aW9uKCl7ZS5TYSgpfHwKZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5MYygpfHwoYT10aGlzLnNhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxVazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Cby5iaW5kKHRoaXMpLHRoaXMuQW8uYmluZCh0aGlzKSl9LEJvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxBbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LEtiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sc2E6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmZqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5sbHx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5kYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucWE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Naz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkZrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5mbD1lLlgoMTApO3RoaXMuSmI9ZS5YKDEwKTt0aGlzLkhiPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlRiPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSWI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVG09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuJGk9YTthLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlZuKCk7ZS5vKGsud2ssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5XaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLnpuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVWIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5VYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVGI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlBuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy4kaygpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlVsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkRsKGIpKSk7cmV0dXJuIGd9LERsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxVbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTm0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlduKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuQ28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLlpvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLiRvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5PbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay55byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5lYyhhKTt0aGlzLlBhKCl9LGVjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxQbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5GayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuQWsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkRrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYWwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZyksdGhpcy5NbigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxNbjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLnRhJiZlLkVrKHRoaXMuYi5vcmlnaW4udGEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucWE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5YbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuS28oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5MbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5QbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVG8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuYmMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk1vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5ObygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5NYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk1iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxQbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxSbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sU286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFFvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxLbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuVm8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sQWs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIuc2EoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLkhvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxEazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5JYiYmIXRoaXMuZGMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLklifHwodGhpcy5JYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5FbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5EbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5JYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnVrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx4azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVG4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLnhrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLlFtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmRjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnFhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApIbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmRjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5UaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlRiKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmRjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5xYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5JYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLklifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sVm46ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxXbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE1iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSWIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5WbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUubm0oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5qbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnprKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQmsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEJrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSwkazpmdW5jdGlvbigpe3RoaXMubGM9e319LFluOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFZsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Gby5iaW5kKHRoaXMpKX0sRm86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmJjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5iY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuYmMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxEbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0sQ2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkRiKCk7dGhpcy5DYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuSmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5EYigpO3RoaXMuQ2IoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkhiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkRiKCl9fSxEYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTWIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMudWI/KGUuaWEodGhpcy5DLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx2bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5NYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLndtKCkmJnRoaXMudm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkZiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHdtOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpO3JldHVybiB0aGlzLkIuVWImJiFlLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHZtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxLbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpO3RoaXMuZmY9dGhpcy5XYz10aGlzLlJmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuS2woKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWW4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlRtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEudm4oKSx0aGlzLmpjPSExLGUubyhrLmRsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5SaCgpOnRoaXMuQ2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuYmMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuWWcoKSk7cmV0dXJuIGF9LEZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy4kaXx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Zbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuWW98fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMudGE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5FbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLmVrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnJkKCksYjtiPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCkpe3ZhciBoPWUuQ2codGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy5EbS5iaW5kKHRoaXMpLHRoaXMuQW0uYmluZCh0aGlzKSl9LFRnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuRmIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkZifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5GYnx8dGhpcy50bShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5jbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx0bTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERtOmZ1bmN0aW9uKGEpe3RoaXMuZG4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuaWg9YS51cmxDYWxsZWQ7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5wYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZToKRC5VZn0pKX0sRW06ZnVuY3Rpb24oYSl7dHJ5e3RoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5RYSh3LmZlKSl9dGhpcy5WPXRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLlYubGVuZ3RoP3RoaXMuT2MoKTp0aGlzLnBhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5QZj9ELmVlOkQuVWZ9KSl9LEFtOmZ1bmN0aW9uKCl7dGhpcy5wYSh0aGlzLlFhKHcuVGYse2RlcHRoOmJ9KSl9LE9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMueG0oKT90aGlzLm1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucGEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLndvKCkmJnRoaXMuamYodGhpcy5obCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8KKHRoaXMud2M9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuYmYoKX0sQWg6ZnVuY3Rpb24oKXt0aGlzLnVjPyh0aGlzLnVjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LkFoKCl9LHdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam8oKT90aGlzLmlvKCk/ITA6KC0xIT10aGlzLkdjKCk/dGhpcy5wYSh0aGlzLlFhKHcuWWQpKTp0aGlzLnBhKHRoaXMuUWEody5TZikpLCExKToodGhpcy5wYSh0aGlzLlFhKHcuWWMsRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy50YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLlBnO3RoaXMucGFyZW50LmpmKGEpfSxobDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5kdXJhdGlvbj10aGlzLkdjKCk7YS5NPXRoaXMuJGcoKTthLmJjPXRoaXMuRmwoKTthLmtxPVtdO2Eub3JpZ2luPXRoaXM7YS52PXRoaXMuQmwoKTthLkJmPXRoaXMuVGwoYS5kdXJhdGlvbik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO3JldHVybiBhfSxwYTpmdW5jdGlvbihhKXt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5KJiYoYS5NYT1hLmVycm9yLmNvZGUhPXcuWWQuY29kZT9hLk1hLmNvbmNhdCh0aGlzLkdsKCkpOmEuTWEuY29uY2F0KHRoaXMuUGwoKSkpO3RoaXMuVi5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5lYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmVjJiZ0aGlzLnBhcmVudC5lYyhhKSxiPTAsdGhpcy5PYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnBhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucGEmJnRoaXMucGFyZW50LnBhKGEpLGI9MCl9LGVjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmVjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucGEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxtbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxqbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJGcoKS5sZW5ndGh9LGlvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5HYygpfSxGZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVi5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5WJiYyPD10aGlzLlYubGVuZ3RoJiYhdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGRuOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx4bTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmRoKCkubGVuZ3RofSxkaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiVkFTVEFkVGFnVVJJIil9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJBZFN5c3RlbSIpfSxZZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMucGgoYS5wYXJlbnROb2RlKTohMX0sUGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sR2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxFcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy52ZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sR2M6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFRsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuU24oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sRGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxHZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy52ZChhKToiIn0sdmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuZWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5DaXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTWE9W107dGhpcy5NPVtdO3RoaXMuYmM9IiI7dGhpcy52PXRoaXMudGM9dGhpcy53Yj0hMTt0aGlzLktlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5MZT0iIn1jLklqPWE7YS5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LE5sOmZ1bmN0aW9uKCl7aWYoIXRoaXMuS2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5sYSl7dmFyIGE9dGhpcy5vcmlnaW4ubGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sCllnOmZ1bmN0aW9uKCl7aWYodGhpcy5MZSlyZXR1cm4gdGhpcy5MZTt2YXIgYT0iIjsoYT10aGlzLk5sKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5MZT1hfSxYbDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuSWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5uaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMubmp8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixMYToiRFVSQVRJT05fRVJST1IifSxZYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTGE6IkVNUFRZX1ZBU1QifSxXZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCkxhOiJMT0FEX0VSUk9SIn0sYWU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLExhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixMYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLlNtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5MbXx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlFoPWE7dGhpcy52aWRlbz1jO3RoaXMuVWQ9W107dGhpcy5OaD1bXTt0aGlzLmRmPVtdO3RoaXMuR289ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5acD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5zbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5qbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlVkLnB1c2goe3NyYzpkLGZyYW1lOmgsVW06ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5kZltjXTtkLnR5cGU9PT1hJiZkLk9rKHRoaXMuSGwoYSkpfX0sSGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxXbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uVW07cmV0dXJuIiJ9LHNuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5XbChjKSx2ZW5kb3I6Y30pO3RoaXMuVW4oKX0sam46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkdvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSwKT2s6YyxmcTohMX0pfSxVbjpmdW5jdGlvbigpe3RoaXMuTmgubWFwKGZ1bmN0aW9uKGEpe2EucW18fChhLllwKHthZFNlc3Npb25JZDplLlgoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmpxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5xbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLkxpfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlgoMTApO3RoaXMuQT1CLnBvcCgpO3RoaXMuQXx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk5hPXt9O3RoaXMubWc9ITE7dGhpcy4kYj1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmRtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxhbzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sRmg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5CYyx0aGlzLmMubCgpKX0sdm46ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkEuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMua2IpO3RoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sZG06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSx3bDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLiRiLmxlbmd0aDthKyspdGhpcy4kYlthXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuJGJ8fCh0aGlzLiRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy4kYi5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkEmJnRoaXMuQS5wYXVzZSYmdGhpcy5BLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5PaXx8WWEsQj1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMubmx8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0seGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLkJqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Y2EoKTt0aGlzLlhiPXRoaXMuWGJ8fCExO3RoaXMuZGc9dGhpcy5mZz10aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRWI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMubWg9ITA7dGhpcy52ZygpfS5iaW5kKHRoaXMpKTt0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0scWc6ZnVuY3Rpb24oKXtpZih0aGlzLmxkKCkpe3ZhciBhPXRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LHVsOmZ1bmN0aW9uKGEsYil7dGhpcy5YYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlhifHwzMDI9PXRoaXMuWGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm5hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5RbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Banx8YmI7KGZ1bmN0aW9uKGMpe2MuQ2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxzbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5Oai5zay5xaz93aW5kb3cuT08uTmouc2sucWsuQXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMuSGt8fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLklpfHxmYjsoZnVuY3Rpb24oYyl7Yy5IaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxzZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5uYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm5hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuTGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlVqfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy4kaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSy5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuJGp8fFQ7KGZ1bmN0aW9uKGMpe2MuWmo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guZGQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUm0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWmwoKX0sUm06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlpqfHxVOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5CZCYmKGE9ZS5rbChhLHRoaXMuQmQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVChkKTtpZighdGhpcy5MKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwKKHRoaXMuYWFbYV09e30pO3RoaXMuYWFbYV1bYl18fCh0aGlzLmFhW2FdW2JdPVtdKTt0aGlzLmFhW2FdW2JdLnB1c2goYyl9LG5vOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2JdKXRoaXMuTmN8fCh0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy51bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxabDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmFhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ubyhhKX19KX0pKGMpO3ZhciBqYj1jLmFrfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuTWp8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxyYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuRWl8fGxiOyhmdW5jdGlvbihjKXtjLkZpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLkZpfHxtYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRykpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGI9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt2YXIgYj10aGlzLktnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5FYz1iKTtpZighdGhpcy54ZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmhuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sCldnOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylyZXR1cm4gdGhpcy5FYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5LZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGhuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnJlc3VtZSYmdGhpcy5lYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueGp8fHFiOyhmdW5jdGlvbihjKXtjLndqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0KITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMudWkmJih0aGlzLmcoKSx0aGlzLnVpPSEwLHRoaXMua2EoKSk7Yi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMud2p8fHJiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsCiIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnlqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLmNwfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5qa3x8dWI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGZuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm5hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZm4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm5hKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5pa3x8dmI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1qPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5tanx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5ZbSgpfS5iaW5kKHRoaXMpLDUwMCl9LFltOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LFhuOmZ1bmN0aW9uKCl7dGhpcy5rZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5IbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5IbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLldtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmJsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMudWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxibDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubWEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLnMoKSx0aGlzLm5hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVnKCl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oKXtpZighdGhpcy5EaClmb3IodmFyIGE9Yy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVms6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlZrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ta3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5hcHx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx4bjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5BbHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGduOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMub2t8fFJiOyhmdW5jdGlvbihjKXtjLm5rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTWguYmluZCh0aGlzKSwxMCl9LGFjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy50az0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMudGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmFjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5NaCgpO3RoaXMuWmYoKTt0aGlzLmtuKCl9LGtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5lbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmFjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm5rfHxTYjsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5nbigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMucGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm9sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5vbHx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuY2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5LbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seG46ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkttfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLkdoJiYodGhpcy5HaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuY2t8fE47KGZ1bmN0aW9uKGMpe2MuYms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkJlKWlmKHRoaXMuR2J8fCh0aGlzLkdiPTApLHRoaXMuR2IrKywxNTx0aGlzLkdiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLktuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmJrfHxPOyhmdW5jdGlvbihjKXtjLmRrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLmRrfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5LaD1lLktiKDEwKTt0aGlzLnJoKCl9LHJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5pbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuaWx8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLlhvfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnhpfHxnYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy53aXx8aGM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxSYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuUGl8fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLktqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUmwoYSk6W10sYzt0aGlzLnVoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLnRoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sWm46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uUmIpfX19KShjKTt2YXIgbGM9Yy5Lanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5Ianx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueG8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuUG0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTsKdmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuT2cod2luZG93LEcuaW0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5Yanx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy55ZD0wO3RoaXMuYmI9IiI7dGhpcy5FZD0KW107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtHbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQm46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxBbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmptKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5vYSx0aGlzLm5iLm9mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5hbSgpKXRoaXMud24oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuYW8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wueW4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkdtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5UaChsKX19LGptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueWQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy55ZC5nZXRUaW1lKCksdGhpcy55ZD1hLDNFNTxjPyEwOiExO3RoaXMueWQ9YTtyZXR1cm4hMX0sUm46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS52ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxRbjpmdW5jdGlvbihhKXtpZighdGhpcy5IaCl7ZS52ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuR24oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuTm4odGhpcy5Rbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxKZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS52ZigibWlkcm9sbCIpO2lmKCF0aGlzLnhoKXt0aGlzLnhoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuRm4odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5SbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm1uKCk7dGhpcy5ubigpfSxwbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkVkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5icChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRmQ9dGhpcy5FZC5sZW5ndGh9LGFtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkZkJiYoYT0hMCk7cmV0dXJuIGF9LAp3bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYm4uYmluZCh0aGlzKSl9LGJuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxHbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9dGhpcy5tZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy56aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnhsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoU2FlZ29vcGhJc29UaG9vRCxTYWVnb29waElzb1Rob29EKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.73.163 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101
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
Fri, 15 Nov 2019 22:37:46 GMT
Last-Modified
Fri, 15 Nov 2019 16:32:57 GMT
Server
AmazonS3
x-amz-request-id
DF4E3E96EF0E401C
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
7cL+P5u/hYQZnAsfMxhXUbIRE64I3OKvmAfvWf33qbErZrfU9X7ZJBgjXOtU/MSNr1fld68rw4E=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame A0DF
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=4072952720
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFNhZWdvb3BoSXNvVGhvb0Q9U2FlZ29vcGhJc29UaG9vRHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5OayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5CbihtKTtiLkFuKGwpO2IucG4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Kbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5wbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTms9ITE7dGhpcy5GYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmFuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYmo9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLiRuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxFazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYW46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuJG0oYi5kYXRhKX0sJG06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxDazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHVtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxMbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuZ2woYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTG4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUGs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGdsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5QayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxLYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0RpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEtpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAplbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxEajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxXajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuRGkoKXx8Yi5LaSgpfHxiLmVtKCl8fGIuRGooKXx8Yi5saygpfHxiLnJqKCl8fGIuV2ooKX19O3JldHVybiBudWxsIT1iLktrKCl9LEVsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sc2E6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxnYzpmdW5jdGlvbihiKXtiPXRoaXMuc2EoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFNsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuc2EoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxrbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxTbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuRmI7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxjbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlNsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVG46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmZjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5jbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVWsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy51bShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5DayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxDbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQ20oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkpuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYmp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmFqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVm09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuT209e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLiRvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Dbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTm09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5abz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmRsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eud2s9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnZrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlFtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuVm89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EueW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlBtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5hanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLnZqfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxPbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5PbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmNqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhtfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTWk9YX0pKGMpO3ZhciBLPWMuTWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Zanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTGI9MDt0aGlzLlRhPTE1MDt0aGlzLlJiPTA7dGhpcy5DbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGE/KHRoaXMuTGIrKyx0aGlzLlJiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTGI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLkxiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxDbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuWm4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxvbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkpqfHx0OyhmdW5jdGlvbihjKXtjLkxqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5MYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRWI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTm46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRm46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGEmJih0aGlzLkxiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ibSgpfHx0aGlzLnlrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHlrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkViPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5FYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRWImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLkxqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucms9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLldiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5EbihiKX0sZjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGdtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmZjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5mYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV09MX0sbG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZmMoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmdtKCk7aWYoIXRoaXMubG0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5XYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5XYiYmMDx0aGlzLldiLmxlbmd0aCYmKHRoaXMuV2I9ZS51bmlxdWUodGhpcy5XYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuV2Iuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LEtuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ya30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxNbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEZtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5vb3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubWE/Yi5tYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5UaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLk9qfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5jbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5ranx8cmE7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmNsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5uYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5qanx8c2E7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5JbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLm9tKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSWw6ZnVuY3Rpb24oKXt2YXIgYT1lLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmxqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5mbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuZm18fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5na3x8d2E7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuS2IoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuTW0oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5RaygpLAp0aGlzLnNiKCkpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubWE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubWE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubWE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LG1tOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMua20oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0sa206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5sbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGxuOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUWs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLm1tKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sUms6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuY20oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxjbTpmdW5jdGlvbigpe2lmKDA8PWUuZ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkVsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMubmEoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFprOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSW8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5JbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnRuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlprKCl9LmJpbmQodGhpcyksNTApKSl9LHRuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Kbyl7dGhpcy5Kbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmZrfHx4YTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmhrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5Ja3x8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFhtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Ganx8QmE7KGZ1bmN0aW9uKGMpe2MuRWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkdifHwodGhpcy5HYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkdiKyssMTU8dGhpcy5HYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlhtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkdqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnpqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy56anx8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuWm09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy5abSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxyYTpmdW5jdGlvbigpe3JldHVybiEwfSxZazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5oanx8R2E7KGZ1bmN0aW9uKGMpe2MuZ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZ2p8fEhhOyhmdW5jdGlvbihjKXtjLmlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaWp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5CaXx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmRqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEVuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sems6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5kanx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkVuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZWo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmVqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLk5pPWE7YS5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSG46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnJuKCk7dGhpcy5EYSYmdGhpcy5xbigpfX19KShjKTt2YXIgTWE9Yy5OaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLlpiPSIiO3RoaXMuZ2Q9dGhpcy5ZYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMub2E9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk5iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuVmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuT2I9IiI7dGhpcy5QYj1bXTt0aGlzLlFiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlViPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5maj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMub2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5OYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlZiLHRlc3RIaWRlOnRoaXMuT2IsdGVzdFRhZ3M6dGhpcy5QYix0ZXN0VGFnc0pTOnRoaXMuUWIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5VYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHpuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLlpiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLm9hPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5OYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlZiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuT2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5RYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVWI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sJGw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSmw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy5zYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuWmJ8fHRoaXMuamJ8fHRoaXMuWWJ8fHRoaXMuZ2QpJiYoaD10aGlzLkptKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCkxsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxJbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuc2EoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEptOmZ1bmN0aW9uKGIpe3RoaXMuWmImJgooYis9dGhpcy5aYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5ZYiYmKGI9dGhpcy5JbShiLHRoaXMuWWIpKTtyZXR1cm4gYn0sWGs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuU2sodGhpcy56YS5jbGllbnRBUElzKX0sU2s6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkluKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5IbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5vYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5YaygpO3RoaXMuQm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMub2EpdGhpcy56bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMub2EpdHJ5e3RoaXMub2E9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLm9hKXRyeXt0aGlzLm9hPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQm06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWWwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sem06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMub2ErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMub2EuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLktiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5nYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlNiKCk7ZS5GYyhrLlZtKTsoYT1lLmdjKHRoaXMueGQoKSkpfHwoYT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxZbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMub2F8fHRoaXMuTmJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5TYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLm9hfWVsc2UgZD10aGlzLm9hO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fAplLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8ZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLk5iPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5KZT1kLmFkcGF0aHx8IiI7dGhpcy5zZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5nYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLk5iJiZ0aGlzLkFhJiZ0aGlzLmdhLmxlbmd0aD90aGlzLk1jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlNiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy5zYSh0aGlzLk5iKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLk5iK3RoaXMub2UoImN1c3RvbWVyIikpO3RoaXMuSWEoYSx0aGlzLmJvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnVmKCJjdXN0b21lciIpO2I/dGhpcy5Waj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlZqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0sYm86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0KITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5WYz10aGlzLmZiKGQuc3RyaWN0KTt0aGlzLlRkPXRoaXMuZmIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuR2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLiRhPXRoaXMuZmIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5PYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlFiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLlpiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWWI9CmQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5nZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT1kLmpzcG9wdXBzfHwhMTt0aGlzLnRiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLlViPWQudnBhaWR8fCExO3RoaXMuemEudnBhaWQ9dGhpcy5VYjt0aGlzLkFmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMua2Q9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLk9mPWQudm1hcHN8fCIiO3RoaXMuemM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLk9hPWQuYml0cmF0ZXx8MUUzO3RoaXMuaWU9ZC5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuUGQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaWM9ITAsdGhpcy5NYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5wbygpJiYodGhpcy5PYnx8dGhpcy5RYnx8dGhpcy5QYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9CiEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuU2IoKSk6dGhpcy5mbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkdmKCkpfX0sZm86ZnVuY3Rpb24oKXt0aGlzLmVvKCk7dGhpcy5obygpfSxobzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xOwpmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRj1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEYsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihGKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrCmUuemIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy56YSYmdGhpcy56YS5wbGF5ZXImJnRoaXMuemEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZGEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEdmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5TYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz0KdGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIoYSkpLHRoaXMuU2IoKSx0aGlzLnRlKCkpfSxlbzpmdW5jdGlvbigpe2lmKHRoaXMuT2Ipe3ZhciBhPWUucmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLnJtKCkpdGhpcy5PZCh0aGlzLlZiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5PYik7Zy5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLk9iKTtnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7CmE9ZH1jYXRjaChmKXt9YT90aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmRpKCl9fWVsc2UgdGhpcy5kaSgpfSxjaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigpKTt0aGlzLmtvKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy4kaC5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5WYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlBiPXRoaXMuVWMpJiZ0aGlzLlBiLmxlbmd0aCl7dmFyIGQ9dGhpcy5QYi5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLiRoKCl9LGtvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuS2IoKSk7dGhpcy5sbyhmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuY2kuYmluZCh0aGlzKSxnLmJpbmQodGhpcykpfWZ1bmN0aW9uIGcoKXt0aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuUWImJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuY2koKX0sbG86ZnVuY3Rpb24oYSxnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLAohMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZyl7Zz09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSwkaDpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuemQodGhpcy5vYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5BYj0hdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LAphaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuU2IoKTt0aGlzLnRlKCl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sU2I6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpO3RoaXMuVmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5WZCYmdGhpcy5WZCh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5BYn0pfSwKV2s6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLiRsKCkpe3ZhciBhPXRoaXMuSmwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9ITApO2MmJmUucG0oKSYmKGEuUWc9ITApO2gmJihhLlpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFRrOmZ1bmN0aW9uKCl7ZS5TYSgpfHwKZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5MYygpfHwoYT10aGlzLnNhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxVazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Cby5iaW5kKHRoaXMpLHRoaXMuQW8uYmluZCh0aGlzKSl9LEJvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxBbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LEtiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sc2E6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmZqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5sbHx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5kYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucWE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Naz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkZrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5mbD1lLlgoMTApO3RoaXMuSmI9ZS5YKDEwKTt0aGlzLkhiPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlRiPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSWI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVG09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuJGk9YTthLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlZuKCk7ZS5vKGsud2ssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5XaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLnpuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVWIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5VYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVGI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlBuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy4kaygpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlVsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkRsKGIpKSk7cmV0dXJuIGd9LERsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxVbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTm0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlduKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuQ28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLlpvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLiRvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5PbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay55byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5lYyhhKTt0aGlzLlBhKCl9LGVjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxQbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5GayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuQWsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkRrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYWwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZyksdGhpcy5NbigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxNbjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLnRhJiZlLkVrKHRoaXMuYi5vcmlnaW4udGEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucWE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5YbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuS28oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5MbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5QbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVG8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuYmMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk1vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5ObygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5NYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk1iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxQbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxSbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sU286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFFvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxLbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuVm8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sQWs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIuc2EoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLkhvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxEazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5JYiYmIXRoaXMuZGMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLklifHwodGhpcy5JYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5FbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5EbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5JYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnVrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx4azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVG4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLnhrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLlFtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmRjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnFhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApIbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmRjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5UaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlRiKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmRjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5xYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5JYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLklifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sVm46ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxXbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE1iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSWIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5WbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUubm0oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5qbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnprKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQmsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEJrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSwkazpmdW5jdGlvbigpe3RoaXMubGM9e319LFluOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFZsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Gby5iaW5kKHRoaXMpKX0sRm86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmJjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5iY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuYmMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxEbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0sQ2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkRiKCk7dGhpcy5DYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuSmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5EYigpO3RoaXMuQ2IoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkhiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkRiKCl9fSxEYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTWIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMudWI/KGUuaWEodGhpcy5DLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx2bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5NYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLndtKCkmJnRoaXMudm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkZiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHdtOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpO3JldHVybiB0aGlzLkIuVWImJiFlLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHZtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxLbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpO3RoaXMuZmY9dGhpcy5XYz10aGlzLlJmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuS2woKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWW4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlRtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEudm4oKSx0aGlzLmpjPSExLGUubyhrLmRsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5SaCgpOnRoaXMuQ2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuYmMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuWWcoKSk7cmV0dXJuIGF9LEZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy4kaXx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Zbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuWW98fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMudGE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5FbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLmVrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnJkKCksYjtiPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCkpe3ZhciBoPWUuQ2codGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy5EbS5iaW5kKHRoaXMpLHRoaXMuQW0uYmluZCh0aGlzKSl9LFRnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuRmIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkZifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5GYnx8dGhpcy50bShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5jbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx0bTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERtOmZ1bmN0aW9uKGEpe3RoaXMuZG4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuaWg9YS51cmxDYWxsZWQ7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5wYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZToKRC5VZn0pKX0sRW06ZnVuY3Rpb24oYSl7dHJ5e3RoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5RYSh3LmZlKSl9dGhpcy5WPXRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLlYubGVuZ3RoP3RoaXMuT2MoKTp0aGlzLnBhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5QZj9ELmVlOkQuVWZ9KSl9LEFtOmZ1bmN0aW9uKCl7dGhpcy5wYSh0aGlzLlFhKHcuVGYse2RlcHRoOmJ9KSl9LE9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMueG0oKT90aGlzLm1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucGEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLndvKCkmJnRoaXMuamYodGhpcy5obCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8KKHRoaXMud2M9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuYmYoKX0sQWg6ZnVuY3Rpb24oKXt0aGlzLnVjPyh0aGlzLnVjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LkFoKCl9LHdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam8oKT90aGlzLmlvKCk/ITA6KC0xIT10aGlzLkdjKCk/dGhpcy5wYSh0aGlzLlFhKHcuWWQpKTp0aGlzLnBhKHRoaXMuUWEody5TZikpLCExKToodGhpcy5wYSh0aGlzLlFhKHcuWWMsRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy50YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLlBnO3RoaXMucGFyZW50LmpmKGEpfSxobDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5kdXJhdGlvbj10aGlzLkdjKCk7YS5NPXRoaXMuJGcoKTthLmJjPXRoaXMuRmwoKTthLmtxPVtdO2Eub3JpZ2luPXRoaXM7YS52PXRoaXMuQmwoKTthLkJmPXRoaXMuVGwoYS5kdXJhdGlvbik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO3JldHVybiBhfSxwYTpmdW5jdGlvbihhKXt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5KJiYoYS5NYT1hLmVycm9yLmNvZGUhPXcuWWQuY29kZT9hLk1hLmNvbmNhdCh0aGlzLkdsKCkpOmEuTWEuY29uY2F0KHRoaXMuUGwoKSkpO3RoaXMuVi5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5lYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmVjJiZ0aGlzLnBhcmVudC5lYyhhKSxiPTAsdGhpcy5PYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnBhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucGEmJnRoaXMucGFyZW50LnBhKGEpLGI9MCl9LGVjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmVjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucGEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxtbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxqbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJGcoKS5sZW5ndGh9LGlvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5HYygpfSxGZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVi5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5WJiYyPD10aGlzLlYubGVuZ3RoJiYhdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGRuOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx4bTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmRoKCkubGVuZ3RofSxkaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiVkFTVEFkVGFnVVJJIil9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJBZFN5c3RlbSIpfSxZZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMucGgoYS5wYXJlbnROb2RlKTohMX0sUGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sR2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxFcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy52ZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sR2M6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFRsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuU24oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sRGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxHZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy52ZChhKToiIn0sdmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuZWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5DaXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTWE9W107dGhpcy5NPVtdO3RoaXMuYmM9IiI7dGhpcy52PXRoaXMudGM9dGhpcy53Yj0hMTt0aGlzLktlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5MZT0iIn1jLklqPWE7YS5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LE5sOmZ1bmN0aW9uKCl7aWYoIXRoaXMuS2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5sYSl7dmFyIGE9dGhpcy5vcmlnaW4ubGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sCllnOmZ1bmN0aW9uKCl7aWYodGhpcy5MZSlyZXR1cm4gdGhpcy5MZTt2YXIgYT0iIjsoYT10aGlzLk5sKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5MZT1hfSxYbDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuSWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5uaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMubmp8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixMYToiRFVSQVRJT05fRVJST1IifSxZYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTGE6IkVNUFRZX1ZBU1QifSxXZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCkxhOiJMT0FEX0VSUk9SIn0sYWU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLExhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixMYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLlNtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5MbXx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlFoPWE7dGhpcy52aWRlbz1jO3RoaXMuVWQ9W107dGhpcy5OaD1bXTt0aGlzLmRmPVtdO3RoaXMuR289ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5acD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5zbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5qbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlVkLnB1c2goe3NyYzpkLGZyYW1lOmgsVW06ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5kZltjXTtkLnR5cGU9PT1hJiZkLk9rKHRoaXMuSGwoYSkpfX0sSGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxXbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uVW07cmV0dXJuIiJ9LHNuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5XbChjKSx2ZW5kb3I6Y30pO3RoaXMuVW4oKX0sam46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkdvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSwKT2s6YyxmcTohMX0pfSxVbjpmdW5jdGlvbigpe3RoaXMuTmgubWFwKGZ1bmN0aW9uKGEpe2EucW18fChhLllwKHthZFNlc3Npb25JZDplLlgoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmpxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5xbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLkxpfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlgoMTApO3RoaXMuQT1CLnBvcCgpO3RoaXMuQXx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk5hPXt9O3RoaXMubWc9ITE7dGhpcy4kYj1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmRtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxhbzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sRmg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5CYyx0aGlzLmMubCgpKX0sdm46ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkEuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMua2IpO3RoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sZG06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSx3bDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLiRiLmxlbmd0aDthKyspdGhpcy4kYlthXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuJGJ8fCh0aGlzLiRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy4kYi5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkEmJnRoaXMuQS5wYXVzZSYmdGhpcy5BLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5PaXx8WWEsQj1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMubmx8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0seGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLkJqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Y2EoKTt0aGlzLlhiPXRoaXMuWGJ8fCExO3RoaXMuZGc9dGhpcy5mZz10aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRWI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMubWg9ITA7dGhpcy52ZygpfS5iaW5kKHRoaXMpKTt0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0scWc6ZnVuY3Rpb24oKXtpZih0aGlzLmxkKCkpe3ZhciBhPXRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LHVsOmZ1bmN0aW9uKGEsYil7dGhpcy5YYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlhifHwzMDI9PXRoaXMuWGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm5hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5RbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Banx8YmI7KGZ1bmN0aW9uKGMpe2MuQ2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxzbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5Oai5zay5xaz93aW5kb3cuT08uTmouc2sucWsuQXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMuSGt8fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLklpfHxmYjsoZnVuY3Rpb24oYyl7Yy5IaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxzZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5uYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm5hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuTGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlVqfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy4kaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSy5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuJGp8fFQ7KGZ1bmN0aW9uKGMpe2MuWmo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guZGQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUm0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWmwoKX0sUm06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlpqfHxVOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5CZCYmKGE9ZS5rbChhLHRoaXMuQmQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVChkKTtpZighdGhpcy5MKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwKKHRoaXMuYWFbYV09e30pO3RoaXMuYWFbYV1bYl18fCh0aGlzLmFhW2FdW2JdPVtdKTt0aGlzLmFhW2FdW2JdLnB1c2goYyl9LG5vOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2JdKXRoaXMuTmN8fCh0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy51bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxabDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmFhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ubyhhKX19KX0pKGMpO3ZhciBqYj1jLmFrfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuTWp8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxyYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuRWl8fGxiOyhmdW5jdGlvbihjKXtjLkZpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLkZpfHxtYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRykpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGI9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt2YXIgYj10aGlzLktnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5FYz1iKTtpZighdGhpcy54ZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmhuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sCldnOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylyZXR1cm4gdGhpcy5FYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5LZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGhuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnJlc3VtZSYmdGhpcy5lYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueGp8fHFiOyhmdW5jdGlvbihjKXtjLndqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0KITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMudWkmJih0aGlzLmcoKSx0aGlzLnVpPSEwLHRoaXMua2EoKSk7Yi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMud2p8fHJiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsCiIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnlqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLmNwfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5qa3x8dWI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGZuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm5hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZm4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm5hKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5pa3x8dmI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1qPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5tanx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5ZbSgpfS5iaW5kKHRoaXMpLDUwMCl9LFltOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LFhuOmZ1bmN0aW9uKCl7dGhpcy5rZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5IbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5IbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLldtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmJsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMudWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxibDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubWEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLnMoKSx0aGlzLm5hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVnKCl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oKXtpZighdGhpcy5EaClmb3IodmFyIGE9Yy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVms6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlZrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ta3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5hcHx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx4bjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5BbHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGduOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMub2t8fFJiOyhmdW5jdGlvbihjKXtjLm5rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTWguYmluZCh0aGlzKSwxMCl9LGFjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy50az0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMudGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmFjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5NaCgpO3RoaXMuWmYoKTt0aGlzLmtuKCl9LGtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5lbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmFjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm5rfHxTYjsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5nbigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMucGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm9sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5vbHx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuY2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5LbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seG46ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkttfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLkdoJiYodGhpcy5HaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuY2t8fE47KGZ1bmN0aW9uKGMpe2MuYms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkJlKWlmKHRoaXMuR2J8fCh0aGlzLkdiPTApLHRoaXMuR2IrKywxNTx0aGlzLkdiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLktuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmJrfHxPOyhmdW5jdGlvbihjKXtjLmRrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLmRrfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5LaD1lLktiKDEwKTt0aGlzLnJoKCl9LHJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5pbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuaWx8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLlhvfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnhpfHxnYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy53aXx8aGM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxSYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuUGl8fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLktqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUmwoYSk6W10sYzt0aGlzLnVoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLnRoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sWm46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uUmIpfX19KShjKTt2YXIgbGM9Yy5Lanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5Ianx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueG8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuUG0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTsKdmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuT2cod2luZG93LEcuaW0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5Yanx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy55ZD0wO3RoaXMuYmI9IiI7dGhpcy5FZD0KW107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtHbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQm46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxBbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmptKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5vYSx0aGlzLm5iLm9mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5hbSgpKXRoaXMud24oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuYW8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wueW4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkdtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5UaChsKX19LGptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueWQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy55ZC5nZXRUaW1lKCksdGhpcy55ZD1hLDNFNTxjPyEwOiExO3RoaXMueWQ9YTtyZXR1cm4hMX0sUm46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS52ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxRbjpmdW5jdGlvbihhKXtpZighdGhpcy5IaCl7ZS52ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuR24oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuTm4odGhpcy5Rbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxKZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS52ZigibWlkcm9sbCIpO2lmKCF0aGlzLnhoKXt0aGlzLnhoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuRm4odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5SbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm1uKCk7dGhpcy5ubigpfSxwbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkVkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5icChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRmQ9dGhpcy5FZC5sZW5ndGh9LGFtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkZkJiYoYT0hMCk7cmV0dXJuIGF9LAp3bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYm4uYmluZCh0aGlzKSl9LGJuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxHbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9dGhpcy5tZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy56aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnhsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoU2FlZ29vcGhJc29UaG9vRCxTYWVnb29waElzb1Rob29EKTsK
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101
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
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
gzip
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
W/"5d1db79a-109"
status
200
access-control-allow-methods
GET
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=900
access-control-allow-headers
accept, content-type
expires
Fri, 15 Nov 2019 22:52:45 GMT
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=4ab0d7a7-cb9b-4c17-f3b6-646d458a0632&tv={c:u5a46O,pingTime:-2,time:60,type:a,im:{sf:0,pom:1,prf:{mdA:3,mdZ:100,beA:105,beZ:106,mfA:108,cmA:108,inA:108,inZ:113,prA:113,prZ:118,si:123,poA:124,poZ:129,cmZ:129,mfZ:129,loA:150,loZ:151,ltA:164,ltZ:164}},sca:{dfp:{df:4,sz:160.600,dom:ins}},env:{gca:0},clog:[{piv:100,vs:i,r:,w:160,h:600,t:18}],es:0,sc:1,ha:1,gm:0,slTimes:{i:60,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1318.121.160.600,am:i,cc:1318.121.160.600,piv:100,obst:0,th:0,reas:,bkn:{piv:[54~100],as:[54~160.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:0,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754022,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0,slid:[google_ads_iframe_4444/giga.de_sd/software_artikel_1,google_ads_iframe_4444/giga.de_sd/software_artikel_1__container__,sdgAdServerContainer-sky,sky-2],sinceFw:41,readyFired:true}&br=u
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:45 GMT
X-Server-Name
dt12.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame A0DF
653 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=2173410616
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFNhZWdvb3BoSXNvVGhvb0Q9U2FlZ29vcGhJc29UaG9vRHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5OayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5CbihtKTtiLkFuKGwpO2IucG4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Kbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5wbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTms9ITE7dGhpcy5GYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmFuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYmo9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLiRuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxFazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYW46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuJG0oYi5kYXRhKX0sJG06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxDazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHVtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxMbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuZ2woYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTG4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUGs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGdsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5QayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxLYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0RpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEtpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAplbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxEajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxXajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuRGkoKXx8Yi5LaSgpfHxiLmVtKCl8fGIuRGooKXx8Yi5saygpfHxiLnJqKCl8fGIuV2ooKX19O3JldHVybiBudWxsIT1iLktrKCl9LEVsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sc2E6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxnYzpmdW5jdGlvbihiKXtiPXRoaXMuc2EoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFNsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuc2EoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxrbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxTbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuRmI7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxjbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlNsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVG46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmZjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5jbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVWsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy51bShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5DayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxDbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQ20oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkpuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYmp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmFqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVm09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuT209e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLiRvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Dbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTm09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5abz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmRsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eud2s9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnZrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlFtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuVm89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EueW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlBtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5hanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLnZqfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxPbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5PbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmNqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhtfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTWk9YX0pKGMpO3ZhciBLPWMuTWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Zanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTGI9MDt0aGlzLlRhPTE1MDt0aGlzLlJiPTA7dGhpcy5DbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGE/KHRoaXMuTGIrKyx0aGlzLlJiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTGI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLkxiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxDbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuWm4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxvbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkpqfHx0OyhmdW5jdGlvbihjKXtjLkxqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5MYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRWI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTm46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRm46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGEmJih0aGlzLkxiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ibSgpfHx0aGlzLnlrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHlrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkViPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5FYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRWImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLkxqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucms9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLldiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5EbihiKX0sZjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGdtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmZjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5mYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV09MX0sbG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZmMoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmdtKCk7aWYoIXRoaXMubG0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5XYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5XYiYmMDx0aGlzLldiLmxlbmd0aCYmKHRoaXMuV2I9ZS51bmlxdWUodGhpcy5XYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuV2Iuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LEtuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ya30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxNbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEZtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5vb3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubWE/Yi5tYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5UaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLk9qfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5jbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5ranx8cmE7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmNsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5uYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5qanx8c2E7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5JbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLm9tKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSWw6ZnVuY3Rpb24oKXt2YXIgYT1lLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmxqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5mbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuZm18fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5na3x8d2E7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuS2IoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuTW0oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5RaygpLAp0aGlzLnNiKCkpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubWE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubWE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubWE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LG1tOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMua20oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0sa206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5sbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGxuOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUWs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLm1tKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sUms6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuY20oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxjbTpmdW5jdGlvbigpe2lmKDA8PWUuZ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkVsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMubmEoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFprOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSW8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5JbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnRuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlprKCl9LmJpbmQodGhpcyksNTApKSl9LHRuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Kbyl7dGhpcy5Kbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmZrfHx4YTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmhrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5Ja3x8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFhtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Ganx8QmE7KGZ1bmN0aW9uKGMpe2MuRWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkdifHwodGhpcy5HYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkdiKyssMTU8dGhpcy5HYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlhtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkdqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnpqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy56anx8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuWm09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy5abSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxyYTpmdW5jdGlvbigpe3JldHVybiEwfSxZazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5oanx8R2E7KGZ1bmN0aW9uKGMpe2MuZ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZ2p8fEhhOyhmdW5jdGlvbihjKXtjLmlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaWp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5CaXx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmRqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEVuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sems6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5kanx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkVuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZWo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmVqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLk5pPWE7YS5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSG46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnJuKCk7dGhpcy5EYSYmdGhpcy5xbigpfX19KShjKTt2YXIgTWE9Yy5OaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLlpiPSIiO3RoaXMuZ2Q9dGhpcy5ZYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMub2E9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk5iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuVmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuT2I9IiI7dGhpcy5QYj1bXTt0aGlzLlFiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlViPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5maj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMub2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5OYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlZiLHRlc3RIaWRlOnRoaXMuT2IsdGVzdFRhZ3M6dGhpcy5QYix0ZXN0VGFnc0pTOnRoaXMuUWIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5VYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHpuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLlpiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLm9hPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5OYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlZiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuT2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5RYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVWI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sJGw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSmw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy5zYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuWmJ8fHRoaXMuamJ8fHRoaXMuWWJ8fHRoaXMuZ2QpJiYoaD10aGlzLkptKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCkxsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxJbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuc2EoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEptOmZ1bmN0aW9uKGIpe3RoaXMuWmImJgooYis9dGhpcy5aYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5ZYiYmKGI9dGhpcy5JbShiLHRoaXMuWWIpKTtyZXR1cm4gYn0sWGs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuU2sodGhpcy56YS5jbGllbnRBUElzKX0sU2s6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkluKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5IbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5vYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5YaygpO3RoaXMuQm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMub2EpdGhpcy56bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMub2EpdHJ5e3RoaXMub2E9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLm9hKXRyeXt0aGlzLm9hPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQm06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWWwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sem06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMub2ErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMub2EuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLktiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5nYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlNiKCk7ZS5GYyhrLlZtKTsoYT1lLmdjKHRoaXMueGQoKSkpfHwoYT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxZbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMub2F8fHRoaXMuTmJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5TYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLm9hfWVsc2UgZD10aGlzLm9hO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fAplLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8ZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLk5iPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5KZT1kLmFkcGF0aHx8IiI7dGhpcy5zZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5nYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLk5iJiZ0aGlzLkFhJiZ0aGlzLmdhLmxlbmd0aD90aGlzLk1jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlNiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy5zYSh0aGlzLk5iKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLk5iK3RoaXMub2UoImN1c3RvbWVyIikpO3RoaXMuSWEoYSx0aGlzLmJvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnVmKCJjdXN0b21lciIpO2I/dGhpcy5Waj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlZqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0sYm86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0KITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5WYz10aGlzLmZiKGQuc3RyaWN0KTt0aGlzLlRkPXRoaXMuZmIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuR2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLiRhPXRoaXMuZmIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5PYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlFiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLlpiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWWI9CmQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5nZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT1kLmpzcG9wdXBzfHwhMTt0aGlzLnRiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLlViPWQudnBhaWR8fCExO3RoaXMuemEudnBhaWQ9dGhpcy5VYjt0aGlzLkFmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMua2Q9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLk9mPWQudm1hcHN8fCIiO3RoaXMuemM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLk9hPWQuYml0cmF0ZXx8MUUzO3RoaXMuaWU9ZC5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuUGQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaWM9ITAsdGhpcy5NYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5wbygpJiYodGhpcy5PYnx8dGhpcy5RYnx8dGhpcy5QYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9CiEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuU2IoKSk6dGhpcy5mbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkdmKCkpfX0sZm86ZnVuY3Rpb24oKXt0aGlzLmVvKCk7dGhpcy5obygpfSxobzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xOwpmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRj1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEYsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihGKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrCmUuemIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy56YSYmdGhpcy56YS5wbGF5ZXImJnRoaXMuemEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZGEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEdmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5TYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz0KdGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIoYSkpLHRoaXMuU2IoKSx0aGlzLnRlKCkpfSxlbzpmdW5jdGlvbigpe2lmKHRoaXMuT2Ipe3ZhciBhPWUucmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLnJtKCkpdGhpcy5PZCh0aGlzLlZiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5PYik7Zy5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLk9iKTtnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7CmE9ZH1jYXRjaChmKXt9YT90aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmRpKCl9fWVsc2UgdGhpcy5kaSgpfSxjaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigpKTt0aGlzLmtvKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy4kaC5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5WYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlBiPXRoaXMuVWMpJiZ0aGlzLlBiLmxlbmd0aCl7dmFyIGQ9dGhpcy5QYi5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLiRoKCl9LGtvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuS2IoKSk7dGhpcy5sbyhmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuY2kuYmluZCh0aGlzKSxnLmJpbmQodGhpcykpfWZ1bmN0aW9uIGcoKXt0aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuUWImJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuY2koKX0sbG86ZnVuY3Rpb24oYSxnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLAohMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZyl7Zz09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSwkaDpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuemQodGhpcy5vYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5BYj0hdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LAphaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuU2IoKTt0aGlzLnRlKCl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sU2I6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpO3RoaXMuVmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5WZCYmdGhpcy5WZCh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5BYn0pfSwKV2s6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLiRsKCkpe3ZhciBhPXRoaXMuSmwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9ITApO2MmJmUucG0oKSYmKGEuUWc9ITApO2gmJihhLlpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFRrOmZ1bmN0aW9uKCl7ZS5TYSgpfHwKZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5MYygpfHwoYT10aGlzLnNhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxVazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Cby5iaW5kKHRoaXMpLHRoaXMuQW8uYmluZCh0aGlzKSl9LEJvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxBbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LEtiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sc2E6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmZqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5sbHx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5kYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucWE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Naz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkZrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5mbD1lLlgoMTApO3RoaXMuSmI9ZS5YKDEwKTt0aGlzLkhiPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlRiPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSWI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVG09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuJGk9YTthLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlZuKCk7ZS5vKGsud2ssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5XaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLnpuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVWIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5VYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVGI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlBuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy4kaygpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlVsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkRsKGIpKSk7cmV0dXJuIGd9LERsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxVbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTm0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlduKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuQ28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLlpvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLiRvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5PbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay55byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5lYyhhKTt0aGlzLlBhKCl9LGVjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxQbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5GayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuQWsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkRrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYWwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZyksdGhpcy5NbigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxNbjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLnRhJiZlLkVrKHRoaXMuYi5vcmlnaW4udGEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucWE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5YbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuS28oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5MbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5QbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVG8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuYmMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk1vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5ObygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5NYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk1iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxQbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxSbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sU286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFFvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxLbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuVm8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sQWs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIuc2EoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLkhvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxEazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5JYiYmIXRoaXMuZGMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLklifHwodGhpcy5JYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5FbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5EbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5JYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnVrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx4azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVG4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLnhrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLlFtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmRjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnFhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApIbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmRjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5UaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlRiKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmRjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5xYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5JYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLklifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sVm46ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxXbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE1iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSWIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5WbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUubm0oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5qbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnprKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQmsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEJrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSwkazpmdW5jdGlvbigpe3RoaXMubGM9e319LFluOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFZsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Gby5iaW5kKHRoaXMpKX0sRm86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmJjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5iY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuYmMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxEbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0sQ2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkRiKCk7dGhpcy5DYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuSmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5EYigpO3RoaXMuQ2IoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkhiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkRiKCl9fSxEYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTWIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMudWI/KGUuaWEodGhpcy5DLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx2bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5NYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLndtKCkmJnRoaXMudm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkZiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHdtOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpO3JldHVybiB0aGlzLkIuVWImJiFlLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHZtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxLbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpO3RoaXMuZmY9dGhpcy5XYz10aGlzLlJmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuS2woKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWW4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlRtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEudm4oKSx0aGlzLmpjPSExLGUubyhrLmRsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5SaCgpOnRoaXMuQ2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuYmMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuWWcoKSk7cmV0dXJuIGF9LEZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy4kaXx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Zbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuWW98fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMudGE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5FbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLmVrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnJkKCksYjtiPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCkpe3ZhciBoPWUuQ2codGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy5EbS5iaW5kKHRoaXMpLHRoaXMuQW0uYmluZCh0aGlzKSl9LFRnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuRmIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkZifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5GYnx8dGhpcy50bShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5jbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx0bTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERtOmZ1bmN0aW9uKGEpe3RoaXMuZG4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuaWg9YS51cmxDYWxsZWQ7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5wYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZToKRC5VZn0pKX0sRW06ZnVuY3Rpb24oYSl7dHJ5e3RoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5RYSh3LmZlKSl9dGhpcy5WPXRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLlYubGVuZ3RoP3RoaXMuT2MoKTp0aGlzLnBhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5QZj9ELmVlOkQuVWZ9KSl9LEFtOmZ1bmN0aW9uKCl7dGhpcy5wYSh0aGlzLlFhKHcuVGYse2RlcHRoOmJ9KSl9LE9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMueG0oKT90aGlzLm1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucGEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLndvKCkmJnRoaXMuamYodGhpcy5obCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8KKHRoaXMud2M9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuYmYoKX0sQWg6ZnVuY3Rpb24oKXt0aGlzLnVjPyh0aGlzLnVjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LkFoKCl9LHdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam8oKT90aGlzLmlvKCk/ITA6KC0xIT10aGlzLkdjKCk/dGhpcy5wYSh0aGlzLlFhKHcuWWQpKTp0aGlzLnBhKHRoaXMuUWEody5TZikpLCExKToodGhpcy5wYSh0aGlzLlFhKHcuWWMsRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy50YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLlBnO3RoaXMucGFyZW50LmpmKGEpfSxobDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5kdXJhdGlvbj10aGlzLkdjKCk7YS5NPXRoaXMuJGcoKTthLmJjPXRoaXMuRmwoKTthLmtxPVtdO2Eub3JpZ2luPXRoaXM7YS52PXRoaXMuQmwoKTthLkJmPXRoaXMuVGwoYS5kdXJhdGlvbik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO3JldHVybiBhfSxwYTpmdW5jdGlvbihhKXt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5KJiYoYS5NYT1hLmVycm9yLmNvZGUhPXcuWWQuY29kZT9hLk1hLmNvbmNhdCh0aGlzLkdsKCkpOmEuTWEuY29uY2F0KHRoaXMuUGwoKSkpO3RoaXMuVi5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5lYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmVjJiZ0aGlzLnBhcmVudC5lYyhhKSxiPTAsdGhpcy5PYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnBhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucGEmJnRoaXMucGFyZW50LnBhKGEpLGI9MCl9LGVjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmVjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucGEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxtbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxqbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJGcoKS5sZW5ndGh9LGlvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5HYygpfSxGZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVi5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5WJiYyPD10aGlzLlYubGVuZ3RoJiYhdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGRuOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx4bTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmRoKCkubGVuZ3RofSxkaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiVkFTVEFkVGFnVVJJIil9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJBZFN5c3RlbSIpfSxZZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMucGgoYS5wYXJlbnROb2RlKTohMX0sUGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sR2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxFcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy52ZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sR2M6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFRsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuU24oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sRGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxHZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy52ZChhKToiIn0sdmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuZWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5DaXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTWE9W107dGhpcy5NPVtdO3RoaXMuYmM9IiI7dGhpcy52PXRoaXMudGM9dGhpcy53Yj0hMTt0aGlzLktlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5MZT0iIn1jLklqPWE7YS5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LE5sOmZ1bmN0aW9uKCl7aWYoIXRoaXMuS2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5sYSl7dmFyIGE9dGhpcy5vcmlnaW4ubGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sCllnOmZ1bmN0aW9uKCl7aWYodGhpcy5MZSlyZXR1cm4gdGhpcy5MZTt2YXIgYT0iIjsoYT10aGlzLk5sKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5MZT1hfSxYbDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuSWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5uaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMubmp8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixMYToiRFVSQVRJT05fRVJST1IifSxZYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTGE6IkVNUFRZX1ZBU1QifSxXZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCkxhOiJMT0FEX0VSUk9SIn0sYWU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLExhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixMYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLlNtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5MbXx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlFoPWE7dGhpcy52aWRlbz1jO3RoaXMuVWQ9W107dGhpcy5OaD1bXTt0aGlzLmRmPVtdO3RoaXMuR289ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5acD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5zbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5qbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlVkLnB1c2goe3NyYzpkLGZyYW1lOmgsVW06ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5kZltjXTtkLnR5cGU9PT1hJiZkLk9rKHRoaXMuSGwoYSkpfX0sSGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxXbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uVW07cmV0dXJuIiJ9LHNuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5XbChjKSx2ZW5kb3I6Y30pO3RoaXMuVW4oKX0sam46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkdvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSwKT2s6YyxmcTohMX0pfSxVbjpmdW5jdGlvbigpe3RoaXMuTmgubWFwKGZ1bmN0aW9uKGEpe2EucW18fChhLllwKHthZFNlc3Npb25JZDplLlgoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmpxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5xbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLkxpfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlgoMTApO3RoaXMuQT1CLnBvcCgpO3RoaXMuQXx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk5hPXt9O3RoaXMubWc9ITE7dGhpcy4kYj1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmRtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxhbzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sRmg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5CYyx0aGlzLmMubCgpKX0sdm46ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkEuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMua2IpO3RoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sZG06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSx3bDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLiRiLmxlbmd0aDthKyspdGhpcy4kYlthXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuJGJ8fCh0aGlzLiRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy4kYi5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkEmJnRoaXMuQS5wYXVzZSYmdGhpcy5BLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5PaXx8WWEsQj1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMubmx8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0seGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLkJqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Y2EoKTt0aGlzLlhiPXRoaXMuWGJ8fCExO3RoaXMuZGc9dGhpcy5mZz10aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRWI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMubWg9ITA7dGhpcy52ZygpfS5iaW5kKHRoaXMpKTt0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0scWc6ZnVuY3Rpb24oKXtpZih0aGlzLmxkKCkpe3ZhciBhPXRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LHVsOmZ1bmN0aW9uKGEsYil7dGhpcy5YYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlhifHwzMDI9PXRoaXMuWGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm5hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5RbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Banx8YmI7KGZ1bmN0aW9uKGMpe2MuQ2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxzbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5Oai5zay5xaz93aW5kb3cuT08uTmouc2sucWsuQXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMuSGt8fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLklpfHxmYjsoZnVuY3Rpb24oYyl7Yy5IaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxzZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5uYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm5hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuTGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlVqfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy4kaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSy5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuJGp8fFQ7KGZ1bmN0aW9uKGMpe2MuWmo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guZGQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUm0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWmwoKX0sUm06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlpqfHxVOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5CZCYmKGE9ZS5rbChhLHRoaXMuQmQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVChkKTtpZighdGhpcy5MKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwKKHRoaXMuYWFbYV09e30pO3RoaXMuYWFbYV1bYl18fCh0aGlzLmFhW2FdW2JdPVtdKTt0aGlzLmFhW2FdW2JdLnB1c2goYyl9LG5vOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2JdKXRoaXMuTmN8fCh0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy51bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxabDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmFhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ubyhhKX19KX0pKGMpO3ZhciBqYj1jLmFrfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuTWp8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxyYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuRWl8fGxiOyhmdW5jdGlvbihjKXtjLkZpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLkZpfHxtYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRykpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGI9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt2YXIgYj10aGlzLktnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5FYz1iKTtpZighdGhpcy54ZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmhuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sCldnOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylyZXR1cm4gdGhpcy5FYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5LZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGhuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnJlc3VtZSYmdGhpcy5lYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueGp8fHFiOyhmdW5jdGlvbihjKXtjLndqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0KITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMudWkmJih0aGlzLmcoKSx0aGlzLnVpPSEwLHRoaXMua2EoKSk7Yi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMud2p8fHJiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsCiIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnlqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLmNwfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5qa3x8dWI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGZuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm5hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZm4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm5hKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5pa3x8dmI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1qPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5tanx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5ZbSgpfS5iaW5kKHRoaXMpLDUwMCl9LFltOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LFhuOmZ1bmN0aW9uKCl7dGhpcy5rZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5IbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5IbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLldtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmJsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMudWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxibDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubWEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLnMoKSx0aGlzLm5hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVnKCl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oKXtpZighdGhpcy5EaClmb3IodmFyIGE9Yy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVms6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlZrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ta3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5hcHx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx4bjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5BbHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGduOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMub2t8fFJiOyhmdW5jdGlvbihjKXtjLm5rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTWguYmluZCh0aGlzKSwxMCl9LGFjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy50az0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMudGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmFjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5NaCgpO3RoaXMuWmYoKTt0aGlzLmtuKCl9LGtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5lbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmFjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm5rfHxTYjsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5nbigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMucGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm9sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5vbHx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuY2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5LbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seG46ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkttfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLkdoJiYodGhpcy5HaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuY2t8fE47KGZ1bmN0aW9uKGMpe2MuYms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkJlKWlmKHRoaXMuR2J8fCh0aGlzLkdiPTApLHRoaXMuR2IrKywxNTx0aGlzLkdiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLktuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmJrfHxPOyhmdW5jdGlvbihjKXtjLmRrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLmRrfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5LaD1lLktiKDEwKTt0aGlzLnJoKCl9LHJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5pbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuaWx8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLlhvfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnhpfHxnYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy53aXx8aGM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxSYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuUGl8fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLktqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUmwoYSk6W10sYzt0aGlzLnVoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLnRoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sWm46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uUmIpfX19KShjKTt2YXIgbGM9Yy5Lanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5Ianx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueG8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuUG0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTsKdmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuT2cod2luZG93LEcuaW0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5Yanx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy55ZD0wO3RoaXMuYmI9IiI7dGhpcy5FZD0KW107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtHbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQm46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxBbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmptKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5vYSx0aGlzLm5iLm9mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5hbSgpKXRoaXMud24oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuYW8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wueW4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkdtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5UaChsKX19LGptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueWQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy55ZC5nZXRUaW1lKCksdGhpcy55ZD1hLDNFNTxjPyEwOiExO3RoaXMueWQ9YTtyZXR1cm4hMX0sUm46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS52ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxRbjpmdW5jdGlvbihhKXtpZighdGhpcy5IaCl7ZS52ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuR24oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuTm4odGhpcy5Rbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxKZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS52ZigibWlkcm9sbCIpO2lmKCF0aGlzLnhoKXt0aGlzLnhoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuRm4odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5SbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm1uKCk7dGhpcy5ubigpfSxwbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkVkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5icChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRmQ9dGhpcy5FZC5sZW5ndGh9LGFtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkZkJiYoYT0hMCk7cmV0dXJuIGF9LAp3bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYm4uYmluZCh0aGlzKSl9LGJuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxHbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9dGhpcy5tZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy56aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnhsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoU2FlZ29vcGhJc29UaG9vRCxTYWVnb29waElzb1Rob29EKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.120 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-120.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101
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
Fri, 15 Nov 2019 22:36:50 GMT
Via
1.1 cb33a7a4640adbb55df3e0d143601559.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
78
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:47 GMT
Server
AmazonS3
ETag
"063da71572f57793ea4125f50b418f84"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
X-Amz-Cf-Pop
FRA2-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
B7fqNFJ-cKyU9NYlaXv8C8xVSEJAieOMOtSr0esFFFoWZ3p8EQ3Ffw==
Expires
0
/
ssl.2.damoh.giga.de/d94290f2d3dc976b246a0b279f4a216c0d432e1d/ Frame A0DF
653 B
1 KB
XHR
General
Full URL
https://ssl.2.damoh.giga.de/d94290f2d3dc976b246a0b279f4a216c0d432e1d/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFNhZWdvb3BoSXNvVGhvb0Q9U2FlZ29vcGhJc29UaG9vRHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5OayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5CbihtKTtiLkFuKGwpO2IucG4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Kbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5wbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTms9ITE7dGhpcy5GYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmFuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYmo9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLiRuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxFazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYW46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuJG0oYi5kYXRhKX0sJG06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxDazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHVtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxMbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuZ2woYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTG4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUGs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGdsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5QayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxLYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0RpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEtpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAplbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxEajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxXajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuRGkoKXx8Yi5LaSgpfHxiLmVtKCl8fGIuRGooKXx8Yi5saygpfHxiLnJqKCl8fGIuV2ooKX19O3JldHVybiBudWxsIT1iLktrKCl9LEVsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sc2E6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxnYzpmdW5jdGlvbihiKXtiPXRoaXMuc2EoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFNsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuc2EoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxrbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxTbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuRmI7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxjbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlNsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVG46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmZjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5jbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVWsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy51bShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5DayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxDbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQ20oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkpuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYmp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmFqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVm09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuT209e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLiRvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Dbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTm09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5abz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmRsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eud2s9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnZrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlFtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuVm89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EueW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlBtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5hanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLnZqfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxPbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5PbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmNqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhtfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTWk9YX0pKGMpO3ZhciBLPWMuTWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Zanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTGI9MDt0aGlzLlRhPTE1MDt0aGlzLlJiPTA7dGhpcy5DbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGE/KHRoaXMuTGIrKyx0aGlzLlJiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTGI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLkxiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxDbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuWm4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxvbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkpqfHx0OyhmdW5jdGlvbihjKXtjLkxqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5MYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRWI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTm46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRm46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGEmJih0aGlzLkxiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ibSgpfHx0aGlzLnlrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHlrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkViPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5FYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRWImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLkxqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucms9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLldiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5EbihiKX0sZjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGdtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmZjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5mYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV09MX0sbG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZmMoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmdtKCk7aWYoIXRoaXMubG0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5XYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5XYiYmMDx0aGlzLldiLmxlbmd0aCYmKHRoaXMuV2I9ZS51bmlxdWUodGhpcy5XYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuV2Iuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LEtuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ya30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxNbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEZtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5vb3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubWE/Yi5tYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5UaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLk9qfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5jbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5ranx8cmE7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmNsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5uYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5qanx8c2E7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5JbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLm9tKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSWw6ZnVuY3Rpb24oKXt2YXIgYT1lLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmxqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5mbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuZm18fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5na3x8d2E7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuS2IoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuTW0oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5RaygpLAp0aGlzLnNiKCkpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubWE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubWE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubWE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LG1tOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMua20oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0sa206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5sbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGxuOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUWs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLm1tKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sUms6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuY20oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxjbTpmdW5jdGlvbigpe2lmKDA8PWUuZ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkVsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMubmEoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFprOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSW8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5JbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnRuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlprKCl9LmJpbmQodGhpcyksNTApKSl9LHRuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Kbyl7dGhpcy5Kbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmZrfHx4YTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmhrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5Ja3x8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFhtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Ganx8QmE7KGZ1bmN0aW9uKGMpe2MuRWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkdifHwodGhpcy5HYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkdiKyssMTU8dGhpcy5HYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlhtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkdqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnpqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy56anx8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuWm09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy5abSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxyYTpmdW5jdGlvbigpe3JldHVybiEwfSxZazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5oanx8R2E7KGZ1bmN0aW9uKGMpe2MuZ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZ2p8fEhhOyhmdW5jdGlvbihjKXtjLmlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaWp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5CaXx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmRqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEVuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sems6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5kanx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkVuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZWo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmVqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLk5pPWE7YS5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSG46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnJuKCk7dGhpcy5EYSYmdGhpcy5xbigpfX19KShjKTt2YXIgTWE9Yy5OaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLlpiPSIiO3RoaXMuZ2Q9dGhpcy5ZYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMub2E9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk5iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuVmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuT2I9IiI7dGhpcy5QYj1bXTt0aGlzLlFiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlViPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5maj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMub2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5OYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlZiLHRlc3RIaWRlOnRoaXMuT2IsdGVzdFRhZ3M6dGhpcy5QYix0ZXN0VGFnc0pTOnRoaXMuUWIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5VYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHpuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLlpiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLm9hPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5OYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlZiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuT2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5RYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVWI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sJGw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSmw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy5zYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuWmJ8fHRoaXMuamJ8fHRoaXMuWWJ8fHRoaXMuZ2QpJiYoaD10aGlzLkptKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCkxsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxJbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuc2EoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEptOmZ1bmN0aW9uKGIpe3RoaXMuWmImJgooYis9dGhpcy5aYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5ZYiYmKGI9dGhpcy5JbShiLHRoaXMuWWIpKTtyZXR1cm4gYn0sWGs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuU2sodGhpcy56YS5jbGllbnRBUElzKX0sU2s6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkluKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5IbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5vYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5YaygpO3RoaXMuQm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMub2EpdGhpcy56bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMub2EpdHJ5e3RoaXMub2E9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLm9hKXRyeXt0aGlzLm9hPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQm06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWWwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sem06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMub2ErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMub2EuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLktiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5nYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlNiKCk7ZS5GYyhrLlZtKTsoYT1lLmdjKHRoaXMueGQoKSkpfHwoYT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxZbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMub2F8fHRoaXMuTmJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5TYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLm9hfWVsc2UgZD10aGlzLm9hO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fAplLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8ZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLk5iPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5KZT1kLmFkcGF0aHx8IiI7dGhpcy5zZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5nYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLk5iJiZ0aGlzLkFhJiZ0aGlzLmdhLmxlbmd0aD90aGlzLk1jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlNiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy5zYSh0aGlzLk5iKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLk5iK3RoaXMub2UoImN1c3RvbWVyIikpO3RoaXMuSWEoYSx0aGlzLmJvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnVmKCJjdXN0b21lciIpO2I/dGhpcy5Waj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlZqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0sYm86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0KITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5WYz10aGlzLmZiKGQuc3RyaWN0KTt0aGlzLlRkPXRoaXMuZmIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuR2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLiRhPXRoaXMuZmIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5PYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlFiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLlpiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWWI9CmQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5nZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT1kLmpzcG9wdXBzfHwhMTt0aGlzLnRiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLlViPWQudnBhaWR8fCExO3RoaXMuemEudnBhaWQ9dGhpcy5VYjt0aGlzLkFmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMua2Q9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLk9mPWQudm1hcHN8fCIiO3RoaXMuemM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLk9hPWQuYml0cmF0ZXx8MUUzO3RoaXMuaWU9ZC5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuUGQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaWM9ITAsdGhpcy5NYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5wbygpJiYodGhpcy5PYnx8dGhpcy5RYnx8dGhpcy5QYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9CiEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuU2IoKSk6dGhpcy5mbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkdmKCkpfX0sZm86ZnVuY3Rpb24oKXt0aGlzLmVvKCk7dGhpcy5obygpfSxobzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xOwpmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRj1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEYsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihGKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrCmUuemIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy56YSYmdGhpcy56YS5wbGF5ZXImJnRoaXMuemEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZGEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEdmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5TYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz0KdGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIoYSkpLHRoaXMuU2IoKSx0aGlzLnRlKCkpfSxlbzpmdW5jdGlvbigpe2lmKHRoaXMuT2Ipe3ZhciBhPWUucmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLnJtKCkpdGhpcy5PZCh0aGlzLlZiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5PYik7Zy5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLk9iKTtnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7CmE9ZH1jYXRjaChmKXt9YT90aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmRpKCl9fWVsc2UgdGhpcy5kaSgpfSxjaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigpKTt0aGlzLmtvKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy4kaC5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5WYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlBiPXRoaXMuVWMpJiZ0aGlzLlBiLmxlbmd0aCl7dmFyIGQ9dGhpcy5QYi5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLiRoKCl9LGtvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuS2IoKSk7dGhpcy5sbyhmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuY2kuYmluZCh0aGlzKSxnLmJpbmQodGhpcykpfWZ1bmN0aW9uIGcoKXt0aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuUWImJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuY2koKX0sbG86ZnVuY3Rpb24oYSxnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLAohMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZyl7Zz09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSwkaDpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuemQodGhpcy5vYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5BYj0hdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LAphaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuU2IoKTt0aGlzLnRlKCl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sU2I6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpO3RoaXMuVmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5WZCYmdGhpcy5WZCh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5BYn0pfSwKV2s6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLiRsKCkpe3ZhciBhPXRoaXMuSmwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9ITApO2MmJmUucG0oKSYmKGEuUWc9ITApO2gmJihhLlpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFRrOmZ1bmN0aW9uKCl7ZS5TYSgpfHwKZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5MYygpfHwoYT10aGlzLnNhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxVazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Cby5iaW5kKHRoaXMpLHRoaXMuQW8uYmluZCh0aGlzKSl9LEJvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxBbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LEtiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sc2E6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmZqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5sbHx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5kYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucWE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Naz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkZrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5mbD1lLlgoMTApO3RoaXMuSmI9ZS5YKDEwKTt0aGlzLkhiPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlRiPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSWI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVG09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuJGk9YTthLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlZuKCk7ZS5vKGsud2ssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5XaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLnpuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVWIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5VYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVGI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlBuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy4kaygpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlVsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkRsKGIpKSk7cmV0dXJuIGd9LERsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxVbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTm0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlduKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuQ28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLlpvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLiRvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5PbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay55byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5lYyhhKTt0aGlzLlBhKCl9LGVjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxQbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5GayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuQWsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkRrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYWwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZyksdGhpcy5NbigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxNbjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLnRhJiZlLkVrKHRoaXMuYi5vcmlnaW4udGEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucWE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5YbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuS28oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5MbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5QbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVG8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuYmMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk1vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5ObygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5NYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk1iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxQbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxSbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sU286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFFvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxLbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuVm8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sQWs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIuc2EoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLkhvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxEazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5JYiYmIXRoaXMuZGMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLklifHwodGhpcy5JYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5FbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5EbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5JYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnVrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx4azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVG4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLnhrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLlFtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmRjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnFhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApIbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmRjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5UaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlRiKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmRjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5xYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5JYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLklifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sVm46ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxXbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE1iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSWIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5WbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUubm0oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5qbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnprKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQmsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEJrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSwkazpmdW5jdGlvbigpe3RoaXMubGM9e319LFluOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFZsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Gby5iaW5kKHRoaXMpKX0sRm86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmJjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5iY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuYmMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxEbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0sQ2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkRiKCk7dGhpcy5DYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuSmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5EYigpO3RoaXMuQ2IoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkhiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkRiKCl9fSxEYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTWIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMudWI/KGUuaWEodGhpcy5DLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx2bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5NYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLndtKCkmJnRoaXMudm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkZiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHdtOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpO3JldHVybiB0aGlzLkIuVWImJiFlLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHZtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxLbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpO3RoaXMuZmY9dGhpcy5XYz10aGlzLlJmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuS2woKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWW4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlRtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEudm4oKSx0aGlzLmpjPSExLGUubyhrLmRsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5SaCgpOnRoaXMuQ2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuYmMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuWWcoKSk7cmV0dXJuIGF9LEZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy4kaXx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Zbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuWW98fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMudGE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5FbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLmVrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnJkKCksYjtiPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCkpe3ZhciBoPWUuQ2codGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy5EbS5iaW5kKHRoaXMpLHRoaXMuQW0uYmluZCh0aGlzKSl9LFRnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuRmIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkZifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5GYnx8dGhpcy50bShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5jbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx0bTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERtOmZ1bmN0aW9uKGEpe3RoaXMuZG4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuaWg9YS51cmxDYWxsZWQ7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5wYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZToKRC5VZn0pKX0sRW06ZnVuY3Rpb24oYSl7dHJ5e3RoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5RYSh3LmZlKSl9dGhpcy5WPXRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLlYubGVuZ3RoP3RoaXMuT2MoKTp0aGlzLnBhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5QZj9ELmVlOkQuVWZ9KSl9LEFtOmZ1bmN0aW9uKCl7dGhpcy5wYSh0aGlzLlFhKHcuVGYse2RlcHRoOmJ9KSl9LE9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMueG0oKT90aGlzLm1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucGEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLndvKCkmJnRoaXMuamYodGhpcy5obCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8KKHRoaXMud2M9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuYmYoKX0sQWg6ZnVuY3Rpb24oKXt0aGlzLnVjPyh0aGlzLnVjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LkFoKCl9LHdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam8oKT90aGlzLmlvKCk/ITA6KC0xIT10aGlzLkdjKCk/dGhpcy5wYSh0aGlzLlFhKHcuWWQpKTp0aGlzLnBhKHRoaXMuUWEody5TZikpLCExKToodGhpcy5wYSh0aGlzLlFhKHcuWWMsRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy50YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLlBnO3RoaXMucGFyZW50LmpmKGEpfSxobDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5kdXJhdGlvbj10aGlzLkdjKCk7YS5NPXRoaXMuJGcoKTthLmJjPXRoaXMuRmwoKTthLmtxPVtdO2Eub3JpZ2luPXRoaXM7YS52PXRoaXMuQmwoKTthLkJmPXRoaXMuVGwoYS5kdXJhdGlvbik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO3JldHVybiBhfSxwYTpmdW5jdGlvbihhKXt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5KJiYoYS5NYT1hLmVycm9yLmNvZGUhPXcuWWQuY29kZT9hLk1hLmNvbmNhdCh0aGlzLkdsKCkpOmEuTWEuY29uY2F0KHRoaXMuUGwoKSkpO3RoaXMuVi5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5lYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmVjJiZ0aGlzLnBhcmVudC5lYyhhKSxiPTAsdGhpcy5PYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnBhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucGEmJnRoaXMucGFyZW50LnBhKGEpLGI9MCl9LGVjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmVjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucGEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxtbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxqbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJGcoKS5sZW5ndGh9LGlvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5HYygpfSxGZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVi5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5WJiYyPD10aGlzLlYubGVuZ3RoJiYhdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGRuOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx4bTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmRoKCkubGVuZ3RofSxkaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiVkFTVEFkVGFnVVJJIil9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJBZFN5c3RlbSIpfSxZZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMucGgoYS5wYXJlbnROb2RlKTohMX0sUGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sR2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxFcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy52ZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sR2M6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFRsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuU24oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sRGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxHZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy52ZChhKToiIn0sdmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuZWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5DaXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTWE9W107dGhpcy5NPVtdO3RoaXMuYmM9IiI7dGhpcy52PXRoaXMudGM9dGhpcy53Yj0hMTt0aGlzLktlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5MZT0iIn1jLklqPWE7YS5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LE5sOmZ1bmN0aW9uKCl7aWYoIXRoaXMuS2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5sYSl7dmFyIGE9dGhpcy5vcmlnaW4ubGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sCllnOmZ1bmN0aW9uKCl7aWYodGhpcy5MZSlyZXR1cm4gdGhpcy5MZTt2YXIgYT0iIjsoYT10aGlzLk5sKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5MZT1hfSxYbDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuSWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5uaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMubmp8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixMYToiRFVSQVRJT05fRVJST1IifSxZYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTGE6IkVNUFRZX1ZBU1QifSxXZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCkxhOiJMT0FEX0VSUk9SIn0sYWU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLExhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixMYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLlNtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5MbXx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlFoPWE7dGhpcy52aWRlbz1jO3RoaXMuVWQ9W107dGhpcy5OaD1bXTt0aGlzLmRmPVtdO3RoaXMuR289ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5acD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5zbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5qbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlVkLnB1c2goe3NyYzpkLGZyYW1lOmgsVW06ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5kZltjXTtkLnR5cGU9PT1hJiZkLk9rKHRoaXMuSGwoYSkpfX0sSGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxXbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uVW07cmV0dXJuIiJ9LHNuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5XbChjKSx2ZW5kb3I6Y30pO3RoaXMuVW4oKX0sam46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkdvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSwKT2s6YyxmcTohMX0pfSxVbjpmdW5jdGlvbigpe3RoaXMuTmgubWFwKGZ1bmN0aW9uKGEpe2EucW18fChhLllwKHthZFNlc3Npb25JZDplLlgoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmpxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5xbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLkxpfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlgoMTApO3RoaXMuQT1CLnBvcCgpO3RoaXMuQXx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk5hPXt9O3RoaXMubWc9ITE7dGhpcy4kYj1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmRtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxhbzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sRmg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5CYyx0aGlzLmMubCgpKX0sdm46ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkEuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMua2IpO3RoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sZG06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSx3bDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLiRiLmxlbmd0aDthKyspdGhpcy4kYlthXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuJGJ8fCh0aGlzLiRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy4kYi5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkEmJnRoaXMuQS5wYXVzZSYmdGhpcy5BLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5PaXx8WWEsQj1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMubmx8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0seGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLkJqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Y2EoKTt0aGlzLlhiPXRoaXMuWGJ8fCExO3RoaXMuZGc9dGhpcy5mZz10aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRWI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMubWg9ITA7dGhpcy52ZygpfS5iaW5kKHRoaXMpKTt0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0scWc6ZnVuY3Rpb24oKXtpZih0aGlzLmxkKCkpe3ZhciBhPXRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LHVsOmZ1bmN0aW9uKGEsYil7dGhpcy5YYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlhifHwzMDI9PXRoaXMuWGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm5hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5RbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Banx8YmI7KGZ1bmN0aW9uKGMpe2MuQ2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxzbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5Oai5zay5xaz93aW5kb3cuT08uTmouc2sucWsuQXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMuSGt8fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLklpfHxmYjsoZnVuY3Rpb24oYyl7Yy5IaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxzZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5uYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm5hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuTGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlVqfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy4kaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSy5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuJGp8fFQ7KGZ1bmN0aW9uKGMpe2MuWmo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guZGQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUm0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWmwoKX0sUm06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlpqfHxVOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5CZCYmKGE9ZS5rbChhLHRoaXMuQmQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVChkKTtpZighdGhpcy5MKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwKKHRoaXMuYWFbYV09e30pO3RoaXMuYWFbYV1bYl18fCh0aGlzLmFhW2FdW2JdPVtdKTt0aGlzLmFhW2FdW2JdLnB1c2goYyl9LG5vOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2JdKXRoaXMuTmN8fCh0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy51bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxabDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmFhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ubyhhKX19KX0pKGMpO3ZhciBqYj1jLmFrfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuTWp8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxyYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuRWl8fGxiOyhmdW5jdGlvbihjKXtjLkZpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLkZpfHxtYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRykpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGI9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt2YXIgYj10aGlzLktnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5FYz1iKTtpZighdGhpcy54ZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmhuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sCldnOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylyZXR1cm4gdGhpcy5FYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5LZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGhuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnJlc3VtZSYmdGhpcy5lYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueGp8fHFiOyhmdW5jdGlvbihjKXtjLndqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0KITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMudWkmJih0aGlzLmcoKSx0aGlzLnVpPSEwLHRoaXMua2EoKSk7Yi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMud2p8fHJiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsCiIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnlqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLmNwfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5qa3x8dWI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGZuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm5hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZm4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm5hKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5pa3x8dmI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1qPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5tanx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5ZbSgpfS5iaW5kKHRoaXMpLDUwMCl9LFltOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LFhuOmZ1bmN0aW9uKCl7dGhpcy5rZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5IbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5IbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLldtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmJsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMudWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxibDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubWEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLnMoKSx0aGlzLm5hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVnKCl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oKXtpZighdGhpcy5EaClmb3IodmFyIGE9Yy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVms6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlZrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ta3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5hcHx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx4bjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5BbHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGduOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMub2t8fFJiOyhmdW5jdGlvbihjKXtjLm5rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTWguYmluZCh0aGlzKSwxMCl9LGFjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy50az0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMudGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmFjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5NaCgpO3RoaXMuWmYoKTt0aGlzLmtuKCl9LGtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5lbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmFjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm5rfHxTYjsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5nbigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMucGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm9sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5vbHx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuY2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5LbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seG46ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkttfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLkdoJiYodGhpcy5HaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuY2t8fE47KGZ1bmN0aW9uKGMpe2MuYms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkJlKWlmKHRoaXMuR2J8fCh0aGlzLkdiPTApLHRoaXMuR2IrKywxNTx0aGlzLkdiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLktuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmJrfHxPOyhmdW5jdGlvbihjKXtjLmRrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLmRrfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5LaD1lLktiKDEwKTt0aGlzLnJoKCl9LHJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5pbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuaWx8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLlhvfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnhpfHxnYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy53aXx8aGM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxSYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuUGl8fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLktqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUmwoYSk6W10sYzt0aGlzLnVoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLnRoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sWm46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uUmIpfX19KShjKTt2YXIgbGM9Yy5Lanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5Ianx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueG8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuUG0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTsKdmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuT2cod2luZG93LEcuaW0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5Yanx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy55ZD0wO3RoaXMuYmI9IiI7dGhpcy5FZD0KW107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtHbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQm46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxBbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmptKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5vYSx0aGlzLm5iLm9mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5hbSgpKXRoaXMud24oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuYW8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wueW4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkdtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5UaChsKX19LGptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueWQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy55ZC5nZXRUaW1lKCksdGhpcy55ZD1hLDNFNTxjPyEwOiExO3RoaXMueWQ9YTtyZXR1cm4hMX0sUm46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS52ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxRbjpmdW5jdGlvbihhKXtpZighdGhpcy5IaCl7ZS52ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuR24oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuTm4odGhpcy5Rbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxKZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS52ZigibWlkcm9sbCIpO2lmKCF0aGlzLnhoKXt0aGlzLnhoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuRm4odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5SbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm1uKCk7dGhpcy5ubigpfSxwbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkVkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5icChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRmQ9dGhpcy5FZC5sZW5ndGh9LGFtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkZkJiYoYT0hMCk7cmV0dXJuIGF9LAp3bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYm4uYmluZCh0aGlzKSl9LGJuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxHbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9dGhpcy5tZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy56aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnhsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoU2FlZ29vcGhJc29UaG9vRCxTYWVnb29waElzb1Rob29EKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
5.9.139.135 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.135.139.9.5.clients.your-server.de
Software
AmazonS3 /
Resource Hash
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101
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
Content-type
application/x-www-form-urlencoded

Response headers

Date
Fri, 15 Nov 2019 22:37:45 GMT
Connection
keep-alive
Content-Length
653
Last-Modified
Thu, 12 Sep 2019 07:31:24 GMT
Server
AmazonS3
Etag
"063da71572f57793ea4125f50b418f84"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Homad-Instance
de35-homad-3
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.giga.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
truncated
/ Frame 1CA2
213 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
73c5e50cb9776434e6748fe0624293f585aadecab3b2c0bea06b6afa3e6f2c6b

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

Response headers

Content-Type
image/png
data
lb67.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb67.s400.meetrics.net/data?/cgK2EzKAALlnFCUkzFFCPlAAAAAAAABwkxAPBAAFAAwkxThRjAPAAAAAANDBBhRjAZAAAOA55A55A85B55A58E55A55AGAywAzwA12ArhRjAPFAAYGA5BAHYeNAPAAAAAANDBHhRjAP5EAAAAtGBKhRjASksFbFjAAAAAAAAAAAAEAAAwkxAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0fFvmFfwFhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yA1AlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEv1F0fFvmFfwFhnFlBFdAAANDBxYAAAAFAAAhRjAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFBUS0SA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:45 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 15-Nov-19 22:37:44 GMT
skeleton.js
static.adsafeprotected.com/ Frame A60D
Redirect Chain
  • https://fw.adsafeprotected.com/rfw/www.googletagservices.com/346702/39754020/dcm/dcmads.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online...
  • https://static.adsafeprotected.com/skeleton.js
17 B
299 B
Script
General
Full URL
https://static.adsafeprotected.com/skeleton.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
199.166.0.32 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.static.adsafeprotected.com
Software
nginx /
Resource Hash
bdeed1e1c0751610c8f3dc2a5c78c93f841c366b36a7f7a54f5e6752c2656c05

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
Last-Modified
Thu, 19 Dec 2013 18:10:33 GMT
X-Server-Name
app36ami.ami.303net.pvt
ETag
"52b33699-11"
Content-Type
application/javascript
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
17
Server
nginx

Redirect headers

Pragma
no-cache
Date
Fri, 15 Nov 2019 22:37:45 GMT
X-Server-Name
app27ami.ami.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Location
https://static.adsafeprotected.com/skeleton.js
Cache-Control
no-cache
Connection
keep-alive
Content-Length
0
Server
nginx
sca.17.4.95.js
static.adsafeprotected.com/ Frame 2AC6
81 KB
20 KB
Script
General
Full URL
https://static.adsafeprotected.com/sca.17.4.95.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
199.166.0.32 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.static.adsafeprotected.com
Software
nginx /
Resource Hash
149c8d10677f2f6979fa28c078cf832f575ee53c397d791b739e7c4c687fe7bc

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
Content-Encoding
gzip
Last-Modified
Tue, 19 Jun 2018 17:20:43 GMT
X-Server-Name
app36ami.ami.303net.pvt
ETag
"5b293b6b-4fda"
Content-Type
application/javascript
Cache-Control
max-age=315360000
Connection
keep-alive
Content-Length
20442
Server
nginx
Expires
Thu, 31 Dec 2037 23:55:55 GMT
hic_qos
ssl.1.damoh.giga.de/ Frame A0DF
24 B
409 B
XHR
General
Full URL
https://ssl.1.damoh.giga.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFNhZWdvb3BoSXNvVGhvb0Q9U2FlZ29vcGhJc29UaG9vRHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5OayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5CbihtKTtiLkFuKGwpO2IucG4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Kbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5wbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTms9ITE7dGhpcy5GYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmFuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYmo9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLiRuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxFazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYW46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuJG0oYi5kYXRhKX0sJG06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxDazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHVtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxMbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuZ2woYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTG4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUGs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGdsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5QayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxLYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0RpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEtpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAplbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxEajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxXajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuRGkoKXx8Yi5LaSgpfHxiLmVtKCl8fGIuRGooKXx8Yi5saygpfHxiLnJqKCl8fGIuV2ooKX19O3JldHVybiBudWxsIT1iLktrKCl9LEVsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sc2E6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxnYzpmdW5jdGlvbihiKXtiPXRoaXMuc2EoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFNsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuc2EoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxrbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxTbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuRmI7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxjbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlNsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVG46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmZjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5jbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVWsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy51bShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5DayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxDbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQ20oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkpuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYmp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmFqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVm09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuT209e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLiRvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Dbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTm09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5abz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmRsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eud2s9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnZrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlFtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuVm89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EueW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlBtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5hanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLnZqfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxPbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5PbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmNqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhtfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTWk9YX0pKGMpO3ZhciBLPWMuTWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Zanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTGI9MDt0aGlzLlRhPTE1MDt0aGlzLlJiPTA7dGhpcy5DbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGE/KHRoaXMuTGIrKyx0aGlzLlJiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTGI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLkxiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxDbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuWm4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxvbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkpqfHx0OyhmdW5jdGlvbihjKXtjLkxqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5MYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRWI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTm46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRm46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGEmJih0aGlzLkxiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ibSgpfHx0aGlzLnlrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHlrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkViPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5FYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRWImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLkxqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucms9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLldiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5EbihiKX0sZjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGdtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmZjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5mYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV09MX0sbG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZmMoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmdtKCk7aWYoIXRoaXMubG0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5XYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5XYiYmMDx0aGlzLldiLmxlbmd0aCYmKHRoaXMuV2I9ZS51bmlxdWUodGhpcy5XYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuV2Iuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LEtuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ya30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxNbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEZtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5vb3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubWE/Yi5tYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5UaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLk9qfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5jbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5ranx8cmE7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmNsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5uYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5qanx8c2E7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5JbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLm9tKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSWw6ZnVuY3Rpb24oKXt2YXIgYT1lLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmxqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5mbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuZm18fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5na3x8d2E7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuS2IoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuTW0oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5RaygpLAp0aGlzLnNiKCkpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubWE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubWE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubWE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LG1tOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMua20oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0sa206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5sbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGxuOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUWs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLm1tKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sUms6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuY20oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxjbTpmdW5jdGlvbigpe2lmKDA8PWUuZ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkVsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMubmEoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFprOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSW8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5JbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnRuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlprKCl9LmJpbmQodGhpcyksNTApKSl9LHRuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Kbyl7dGhpcy5Kbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmZrfHx4YTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmhrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5Ja3x8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFhtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Ganx8QmE7KGZ1bmN0aW9uKGMpe2MuRWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkdifHwodGhpcy5HYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkdiKyssMTU8dGhpcy5HYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlhtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkdqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnpqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy56anx8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuWm09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy5abSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxyYTpmdW5jdGlvbigpe3JldHVybiEwfSxZazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5oanx8R2E7KGZ1bmN0aW9uKGMpe2MuZ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZ2p8fEhhOyhmdW5jdGlvbihjKXtjLmlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaWp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5CaXx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmRqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEVuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sems6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5kanx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkVuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZWo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmVqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLk5pPWE7YS5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSG46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnJuKCk7dGhpcy5EYSYmdGhpcy5xbigpfX19KShjKTt2YXIgTWE9Yy5OaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLlpiPSIiO3RoaXMuZ2Q9dGhpcy5ZYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMub2E9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk5iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuVmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuT2I9IiI7dGhpcy5QYj1bXTt0aGlzLlFiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlViPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5maj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMub2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5OYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlZiLHRlc3RIaWRlOnRoaXMuT2IsdGVzdFRhZ3M6dGhpcy5QYix0ZXN0VGFnc0pTOnRoaXMuUWIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5VYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHpuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLlpiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLm9hPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5OYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlZiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuT2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5RYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVWI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sJGw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSmw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy5zYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuWmJ8fHRoaXMuamJ8fHRoaXMuWWJ8fHRoaXMuZ2QpJiYoaD10aGlzLkptKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCkxsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxJbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuc2EoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEptOmZ1bmN0aW9uKGIpe3RoaXMuWmImJgooYis9dGhpcy5aYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5ZYiYmKGI9dGhpcy5JbShiLHRoaXMuWWIpKTtyZXR1cm4gYn0sWGs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuU2sodGhpcy56YS5jbGllbnRBUElzKX0sU2s6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkluKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5IbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5vYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5YaygpO3RoaXMuQm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMub2EpdGhpcy56bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMub2EpdHJ5e3RoaXMub2E9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLm9hKXRyeXt0aGlzLm9hPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQm06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWWwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sem06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMub2ErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMub2EuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLktiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5nYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlNiKCk7ZS5GYyhrLlZtKTsoYT1lLmdjKHRoaXMueGQoKSkpfHwoYT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxZbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMub2F8fHRoaXMuTmJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5TYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLm9hfWVsc2UgZD10aGlzLm9hO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fAplLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8ZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLk5iPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5KZT1kLmFkcGF0aHx8IiI7dGhpcy5zZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5nYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLk5iJiZ0aGlzLkFhJiZ0aGlzLmdhLmxlbmd0aD90aGlzLk1jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlNiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy5zYSh0aGlzLk5iKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLk5iK3RoaXMub2UoImN1c3RvbWVyIikpO3RoaXMuSWEoYSx0aGlzLmJvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnVmKCJjdXN0b21lciIpO2I/dGhpcy5Waj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlZqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0sYm86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0KITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5WYz10aGlzLmZiKGQuc3RyaWN0KTt0aGlzLlRkPXRoaXMuZmIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuR2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLiRhPXRoaXMuZmIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5PYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlFiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLlpiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWWI9CmQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5nZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT1kLmpzcG9wdXBzfHwhMTt0aGlzLnRiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLlViPWQudnBhaWR8fCExO3RoaXMuemEudnBhaWQ9dGhpcy5VYjt0aGlzLkFmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMua2Q9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLk9mPWQudm1hcHN8fCIiO3RoaXMuemM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLk9hPWQuYml0cmF0ZXx8MUUzO3RoaXMuaWU9ZC5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuUGQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaWM9ITAsdGhpcy5NYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5wbygpJiYodGhpcy5PYnx8dGhpcy5RYnx8dGhpcy5QYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9CiEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuU2IoKSk6dGhpcy5mbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkdmKCkpfX0sZm86ZnVuY3Rpb24oKXt0aGlzLmVvKCk7dGhpcy5obygpfSxobzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xOwpmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRj1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEYsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihGKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrCmUuemIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy56YSYmdGhpcy56YS5wbGF5ZXImJnRoaXMuemEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZGEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEdmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5TYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz0KdGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIoYSkpLHRoaXMuU2IoKSx0aGlzLnRlKCkpfSxlbzpmdW5jdGlvbigpe2lmKHRoaXMuT2Ipe3ZhciBhPWUucmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLnJtKCkpdGhpcy5PZCh0aGlzLlZiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5PYik7Zy5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLk9iKTtnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7CmE9ZH1jYXRjaChmKXt9YT90aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmRpKCl9fWVsc2UgdGhpcy5kaSgpfSxjaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigpKTt0aGlzLmtvKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy4kaC5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5WYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlBiPXRoaXMuVWMpJiZ0aGlzLlBiLmxlbmd0aCl7dmFyIGQ9dGhpcy5QYi5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLiRoKCl9LGtvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuS2IoKSk7dGhpcy5sbyhmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuY2kuYmluZCh0aGlzKSxnLmJpbmQodGhpcykpfWZ1bmN0aW9uIGcoKXt0aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuUWImJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuY2koKX0sbG86ZnVuY3Rpb24oYSxnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLAohMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZyl7Zz09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSwkaDpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuemQodGhpcy5vYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5BYj0hdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LAphaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuU2IoKTt0aGlzLnRlKCl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sU2I6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpO3RoaXMuVmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5WZCYmdGhpcy5WZCh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5BYn0pfSwKV2s6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLiRsKCkpe3ZhciBhPXRoaXMuSmwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9ITApO2MmJmUucG0oKSYmKGEuUWc9ITApO2gmJihhLlpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFRrOmZ1bmN0aW9uKCl7ZS5TYSgpfHwKZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5MYygpfHwoYT10aGlzLnNhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxVazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Cby5iaW5kKHRoaXMpLHRoaXMuQW8uYmluZCh0aGlzKSl9LEJvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxBbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LEtiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sc2E6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmZqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5sbHx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5kYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucWE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Naz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkZrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5mbD1lLlgoMTApO3RoaXMuSmI9ZS5YKDEwKTt0aGlzLkhiPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlRiPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSWI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVG09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuJGk9YTthLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlZuKCk7ZS5vKGsud2ssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5XaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLnpuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVWIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5VYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVGI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlBuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy4kaygpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlVsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkRsKGIpKSk7cmV0dXJuIGd9LERsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxVbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTm0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlduKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuQ28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLlpvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLiRvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5PbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay55byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5lYyhhKTt0aGlzLlBhKCl9LGVjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxQbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5GayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuQWsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkRrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYWwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZyksdGhpcy5NbigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxNbjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLnRhJiZlLkVrKHRoaXMuYi5vcmlnaW4udGEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucWE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5YbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuS28oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5MbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5QbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVG8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuYmMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk1vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5ObygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5NYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk1iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxQbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxSbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sU286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFFvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxLbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuVm8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sQWs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIuc2EoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLkhvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxEazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5JYiYmIXRoaXMuZGMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLklifHwodGhpcy5JYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5FbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5EbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5JYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnVrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx4azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVG4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLnhrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLlFtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmRjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnFhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApIbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmRjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5UaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlRiKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmRjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5xYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5JYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLklifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sVm46ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxXbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE1iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSWIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5WbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUubm0oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5qbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnprKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQmsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEJrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSwkazpmdW5jdGlvbigpe3RoaXMubGM9e319LFluOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFZsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Gby5iaW5kKHRoaXMpKX0sRm86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmJjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5iY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuYmMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxEbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0sQ2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkRiKCk7dGhpcy5DYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuSmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5EYigpO3RoaXMuQ2IoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkhiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkRiKCl9fSxEYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTWIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMudWI/KGUuaWEodGhpcy5DLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx2bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5NYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLndtKCkmJnRoaXMudm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkZiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHdtOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpO3JldHVybiB0aGlzLkIuVWImJiFlLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHZtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxLbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpO3RoaXMuZmY9dGhpcy5XYz10aGlzLlJmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuS2woKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWW4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlRtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEudm4oKSx0aGlzLmpjPSExLGUubyhrLmRsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5SaCgpOnRoaXMuQ2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuYmMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuWWcoKSk7cmV0dXJuIGF9LEZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy4kaXx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Zbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuWW98fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMudGE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5FbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLmVrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnJkKCksYjtiPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCkpe3ZhciBoPWUuQ2codGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy5EbS5iaW5kKHRoaXMpLHRoaXMuQW0uYmluZCh0aGlzKSl9LFRnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuRmIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkZifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5GYnx8dGhpcy50bShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5jbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx0bTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERtOmZ1bmN0aW9uKGEpe3RoaXMuZG4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuaWg9YS51cmxDYWxsZWQ7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5wYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZToKRC5VZn0pKX0sRW06ZnVuY3Rpb24oYSl7dHJ5e3RoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5RYSh3LmZlKSl9dGhpcy5WPXRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLlYubGVuZ3RoP3RoaXMuT2MoKTp0aGlzLnBhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5QZj9ELmVlOkQuVWZ9KSl9LEFtOmZ1bmN0aW9uKCl7dGhpcy5wYSh0aGlzLlFhKHcuVGYse2RlcHRoOmJ9KSl9LE9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMueG0oKT90aGlzLm1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucGEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLndvKCkmJnRoaXMuamYodGhpcy5obCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8KKHRoaXMud2M9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuYmYoKX0sQWg6ZnVuY3Rpb24oKXt0aGlzLnVjPyh0aGlzLnVjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LkFoKCl9LHdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam8oKT90aGlzLmlvKCk/ITA6KC0xIT10aGlzLkdjKCk/dGhpcy5wYSh0aGlzLlFhKHcuWWQpKTp0aGlzLnBhKHRoaXMuUWEody5TZikpLCExKToodGhpcy5wYSh0aGlzLlFhKHcuWWMsRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy50YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLlBnO3RoaXMucGFyZW50LmpmKGEpfSxobDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5kdXJhdGlvbj10aGlzLkdjKCk7YS5NPXRoaXMuJGcoKTthLmJjPXRoaXMuRmwoKTthLmtxPVtdO2Eub3JpZ2luPXRoaXM7YS52PXRoaXMuQmwoKTthLkJmPXRoaXMuVGwoYS5kdXJhdGlvbik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO3JldHVybiBhfSxwYTpmdW5jdGlvbihhKXt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5KJiYoYS5NYT1hLmVycm9yLmNvZGUhPXcuWWQuY29kZT9hLk1hLmNvbmNhdCh0aGlzLkdsKCkpOmEuTWEuY29uY2F0KHRoaXMuUGwoKSkpO3RoaXMuVi5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5lYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmVjJiZ0aGlzLnBhcmVudC5lYyhhKSxiPTAsdGhpcy5PYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnBhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucGEmJnRoaXMucGFyZW50LnBhKGEpLGI9MCl9LGVjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmVjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucGEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxtbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxqbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJGcoKS5sZW5ndGh9LGlvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5HYygpfSxGZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVi5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5WJiYyPD10aGlzLlYubGVuZ3RoJiYhdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGRuOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx4bTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmRoKCkubGVuZ3RofSxkaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiVkFTVEFkVGFnVVJJIil9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJBZFN5c3RlbSIpfSxZZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMucGgoYS5wYXJlbnROb2RlKTohMX0sUGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sR2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxFcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy52ZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sR2M6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFRsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuU24oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sRGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxHZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy52ZChhKToiIn0sdmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuZWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5DaXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTWE9W107dGhpcy5NPVtdO3RoaXMuYmM9IiI7dGhpcy52PXRoaXMudGM9dGhpcy53Yj0hMTt0aGlzLktlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5MZT0iIn1jLklqPWE7YS5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LE5sOmZ1bmN0aW9uKCl7aWYoIXRoaXMuS2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5sYSl7dmFyIGE9dGhpcy5vcmlnaW4ubGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sCllnOmZ1bmN0aW9uKCl7aWYodGhpcy5MZSlyZXR1cm4gdGhpcy5MZTt2YXIgYT0iIjsoYT10aGlzLk5sKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5MZT1hfSxYbDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuSWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5uaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMubmp8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixMYToiRFVSQVRJT05fRVJST1IifSxZYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTGE6IkVNUFRZX1ZBU1QifSxXZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCkxhOiJMT0FEX0VSUk9SIn0sYWU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLExhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixMYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLlNtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5MbXx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlFoPWE7dGhpcy52aWRlbz1jO3RoaXMuVWQ9W107dGhpcy5OaD1bXTt0aGlzLmRmPVtdO3RoaXMuR289ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5acD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5zbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5qbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlVkLnB1c2goe3NyYzpkLGZyYW1lOmgsVW06ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5kZltjXTtkLnR5cGU9PT1hJiZkLk9rKHRoaXMuSGwoYSkpfX0sSGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxXbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uVW07cmV0dXJuIiJ9LHNuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5XbChjKSx2ZW5kb3I6Y30pO3RoaXMuVW4oKX0sam46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkdvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSwKT2s6YyxmcTohMX0pfSxVbjpmdW5jdGlvbigpe3RoaXMuTmgubWFwKGZ1bmN0aW9uKGEpe2EucW18fChhLllwKHthZFNlc3Npb25JZDplLlgoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmpxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5xbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLkxpfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlgoMTApO3RoaXMuQT1CLnBvcCgpO3RoaXMuQXx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk5hPXt9O3RoaXMubWc9ITE7dGhpcy4kYj1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmRtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxhbzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sRmg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5CYyx0aGlzLmMubCgpKX0sdm46ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkEuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMua2IpO3RoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sZG06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSx3bDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLiRiLmxlbmd0aDthKyspdGhpcy4kYlthXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuJGJ8fCh0aGlzLiRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy4kYi5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkEmJnRoaXMuQS5wYXVzZSYmdGhpcy5BLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5PaXx8WWEsQj1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMubmx8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0seGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLkJqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Y2EoKTt0aGlzLlhiPXRoaXMuWGJ8fCExO3RoaXMuZGc9dGhpcy5mZz10aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRWI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMubWg9ITA7dGhpcy52ZygpfS5iaW5kKHRoaXMpKTt0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0scWc6ZnVuY3Rpb24oKXtpZih0aGlzLmxkKCkpe3ZhciBhPXRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LHVsOmZ1bmN0aW9uKGEsYil7dGhpcy5YYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlhifHwzMDI9PXRoaXMuWGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm5hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5RbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Banx8YmI7KGZ1bmN0aW9uKGMpe2MuQ2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxzbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5Oai5zay5xaz93aW5kb3cuT08uTmouc2sucWsuQXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMuSGt8fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLklpfHxmYjsoZnVuY3Rpb24oYyl7Yy5IaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxzZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5uYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm5hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuTGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlVqfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy4kaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSy5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuJGp8fFQ7KGZ1bmN0aW9uKGMpe2MuWmo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guZGQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUm0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWmwoKX0sUm06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlpqfHxVOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5CZCYmKGE9ZS5rbChhLHRoaXMuQmQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVChkKTtpZighdGhpcy5MKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwKKHRoaXMuYWFbYV09e30pO3RoaXMuYWFbYV1bYl18fCh0aGlzLmFhW2FdW2JdPVtdKTt0aGlzLmFhW2FdW2JdLnB1c2goYyl9LG5vOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2JdKXRoaXMuTmN8fCh0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy51bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxabDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmFhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ubyhhKX19KX0pKGMpO3ZhciBqYj1jLmFrfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuTWp8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxyYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuRWl8fGxiOyhmdW5jdGlvbihjKXtjLkZpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLkZpfHxtYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRykpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGI9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt2YXIgYj10aGlzLktnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5FYz1iKTtpZighdGhpcy54ZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmhuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sCldnOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylyZXR1cm4gdGhpcy5FYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5LZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGhuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnJlc3VtZSYmdGhpcy5lYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueGp8fHFiOyhmdW5jdGlvbihjKXtjLndqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0KITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMudWkmJih0aGlzLmcoKSx0aGlzLnVpPSEwLHRoaXMua2EoKSk7Yi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMud2p8fHJiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsCiIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnlqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLmNwfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5qa3x8dWI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGZuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm5hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZm4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm5hKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5pa3x8dmI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1qPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5tanx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5ZbSgpfS5iaW5kKHRoaXMpLDUwMCl9LFltOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LFhuOmZ1bmN0aW9uKCl7dGhpcy5rZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5IbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5IbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLldtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmJsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMudWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxibDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubWEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLnMoKSx0aGlzLm5hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVnKCl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oKXtpZighdGhpcy5EaClmb3IodmFyIGE9Yy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVms6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlZrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ta3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5hcHx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx4bjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5BbHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGduOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMub2t8fFJiOyhmdW5jdGlvbihjKXtjLm5rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTWguYmluZCh0aGlzKSwxMCl9LGFjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy50az0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMudGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmFjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5NaCgpO3RoaXMuWmYoKTt0aGlzLmtuKCl9LGtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5lbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmFjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm5rfHxTYjsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5nbigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMucGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm9sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5vbHx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuY2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5LbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seG46ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkttfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLkdoJiYodGhpcy5HaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuY2t8fE47KGZ1bmN0aW9uKGMpe2MuYms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkJlKWlmKHRoaXMuR2J8fCh0aGlzLkdiPTApLHRoaXMuR2IrKywxNTx0aGlzLkdiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLktuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmJrfHxPOyhmdW5jdGlvbihjKXtjLmRrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLmRrfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5LaD1lLktiKDEwKTt0aGlzLnJoKCl9LHJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5pbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuaWx8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLlhvfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnhpfHxnYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy53aXx8aGM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxSYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuUGl8fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLktqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUmwoYSk6W10sYzt0aGlzLnVoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLnRoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sWm46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uUmIpfX19KShjKTt2YXIgbGM9Yy5Lanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5Ianx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueG8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuUG0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTsKdmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuT2cod2luZG93LEcuaW0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5Yanx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy55ZD0wO3RoaXMuYmI9IiI7dGhpcy5FZD0KW107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtHbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQm46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxBbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmptKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5vYSx0aGlzLm5iLm9mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5hbSgpKXRoaXMud24oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuYW8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wueW4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkdtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5UaChsKX19LGptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueWQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy55ZC5nZXRUaW1lKCksdGhpcy55ZD1hLDNFNTxjPyEwOiExO3RoaXMueWQ9YTtyZXR1cm4hMX0sUm46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS52ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxRbjpmdW5jdGlvbihhKXtpZighdGhpcy5IaCl7ZS52ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuR24oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuTm4odGhpcy5Rbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxKZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS52ZigibWlkcm9sbCIpO2lmKCF0aGlzLnhoKXt0aGlzLnhoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuRm4odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5SbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm1uKCk7dGhpcy5ubigpfSxwbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkVkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5icChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRmQ9dGhpcy5FZC5sZW5ndGh9LGFtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkZkJiYoYT0hMCk7cmV0dXJuIGF9LAp3bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYm4uYmluZCh0aGlzKSl9LGJuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxHbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9dGhpcy5tZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy56aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnhsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoU2FlZ29vcGhJc29UaG9vRCxTYWVnb29waElzb1Rob29EKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.51.163 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.163.51.251.148.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101
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
Fri, 15 Nov 2019 22:37:45 GMT
Last-Modified
Tue, 18 Jun 2019 07:28:00 GMT
Server
openresty/1.15.8.2
ETag
"5d089280-18"
Access-Control-Allow-Methods
GET
Content-Type
application/octet-stream
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame 7651
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
ddf90996ed1081a0229510f79c46dada68150fbf1cede51c7de2a0b7b30f813b

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

Response headers

Content-Type
text/javascript
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=301f1fa4-5802-8636-9560-d9f5832ac8bf&tv={c:u5a49J,pingTime:-2,time:95,type:a,im:{sf:0,pom:1,prf:{mdA:3,mdZ:79,beA:119,beZ:120,mfA:121,cmA:122,inA:122,inZ:126,prA:126,prZ:131,si:136,poA:137,poZ:166,cmZ:166,mfZ:166,loA:179,loZ:180,ltA:213,ltZ:213}},sca:{dfp:{df:4,sz:300.250,dom:ins}},env:{gca:0},clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:95,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:16,wc:0.0.1600.1200,ac:968.438.300.250,am:i,cc:968.438.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[90~100],as:[90~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:0,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g.346702-39754022|1g1|1h*.346702-39754020,idMap:1h*,rend:0,renddet:WINDOW,rmeas:0,slid:[google_ads_iframe_4444/giga.de_sd/software_artikel_2,google_ads_iframe_4444/giga.de_sd/software_artikel_2__container__,sdgAdServerContainer-rectangle,rectangle-3],sinceFw:76,readyFired:true}&br=u
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:46 GMT
X-Server-Name
dt12.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
publishertag.prebid.js
static.criteo.net/js/ld/
42 KB
14 KB
Script
General
Full URL
https://static.criteo.net/js/ld/publishertag.prebid.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
178.250.0.130 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
1cd8e2130767f1a6bad26b4e3d5b60b2dee4e0e80feb160904fa45d4bba01c59

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:45 GMT
content-encoding
gzip
last-modified
Fri, 25 Oct 2019 13:44:21 GMT
server
nginx
etag
W/"5db2fc35-a7d5"
status
200
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=86400, public
timing-allow-origin
*
expires
Sat, 16 Nov 2019 22:37:45 GMT
truncated
/ Frame A60D
213 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
6b19bb68671e24a3866de5ffad4ea66c810ea399538bafded765bb3b0c647bd6

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

Response headers

Content-Type
image/png
data
lb67.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb67.s400.meetrics.net/data?/cgK2F0MAA/k0FPMmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA4xAwwAw5A1mAjwFpkF9kElzFr0FvwFmhEwhF91AyxAw2A55A03AwmAjpFk9BxzA4yA5yA2wA55A3xAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1yAxwA25A50A3wAmhEwkF91AyxAw2A55A03AwmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Az4A13A02A1zA2yAmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Az4A13A02A10AwwAmvFytFh0FjvFklF9TEr5FzjFyhFwlFyfFx2AwmAhkF29By4A01AwzA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA54Ay3Ax1A1yAmjEpkF9xAz4Ay5AxyAw0Ay0A0mAzpF6lF9xA2wA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9B1xA54Ay3Ax1A1yAmhEwkF91Ax5A4yA3xA11AymAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zA41A30A21A34AxBELlnFDUkzFYBP9AAAAAAAABb9HAPBAAFAAb9HTbosAPAAAmUA5BABbosAZAAAOA55A55A85B55A58E55A55AFAzyA2wAzBErbosASksFJFjAAAAAAAAAAAAEAAAb9HAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAx2Aw4E2wAwBEMAxzA4yA5xAywA0yA00AGAkpFylFj0FAAAAIAy4A01AwzA31AKA1xA54Ay3Ax1A1yADAzrF5BFKA1xA54Ay3Ax1A1yAKA1xA54Ay3Ax1A1yAtAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5BFdmUA5BAgCAYJAFAAAbosAAAAAOATrF5zFjyFhwFlyFfxB2wAAAAAAAAAAAAAAAAAQtjFfEWsYA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:45 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 15-Nov-19 22:37:44 GMT
data
lb67.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb67.s400.meetrics.net/data?/cgK2G1MAA/k0FdQmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9yA4xAwwAw5A1mAjwFpkF9kElzFr0FvwFmhEwhF91AyxAw2A55A03AwmAjpFk9BxzA4yA5yA2wA55A3xAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1yAxwA25A50A3wAmhEwkF91AyxAw2A55A03AwmAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Az4A13A02A1zA2yAmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEzvFm0F3hFylFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13Az4A13A02A10AwwAmvFytFh0FjvFklF9TEr5FzjFyhFwlFyfFx2AwmAhkF29By4A01AwzA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA54Ay3Ax1A1yAmjEpkF9xAz4Ay5AxyAw0Ay0A0mAzpF6lF9xA2wA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9B1xA54Ay3Ax1A1yAmhEwkF91Ax5A4yA3xA11AymAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zA41A30A21A34AxmEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29By4A01AwzA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA54Ay3Ax1A1yAmjEpkF9xAz4Ay5Aw4AzzAx4A1mAzpF6lF9zAwwA4yB1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA54Ay3Ax1A1yAmhEwkF91Ax5A4yA3xA11AymAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3zA41A30A21A5xAwBELlnFETkzFARksFAQtjF1u9zYA
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:45 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 15-Nov-19 22:37:44 GMT
/
ssl.2.damoh.giga.de/ef025392ac8785d37010db2d0fb8cf35a0b9e78a/ Frame A0DF
109 B
671 B
XHR
General
Full URL
https://ssl.2.damoh.giga.de/ef025392ac8785d37010db2d0fb8cf35a0b9e78a/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFNhZWdvb3BoSXNvVGhvb0Q9U2FlZ29vcGhJc29UaG9vRHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZ2Z8fCh4LmdmPTApO3guZ2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5nZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5OayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2Iud2YoYyk7Yi5CbihtKTtiLkFuKGwpO2IucG4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Kbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS52aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudmgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnBsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5wbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuTms9ITE7dGhpcy5GYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmFuLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5oaD17fTt0aGlzLnRmPSExfWMuYmo9YTthLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnRmfHwodGhpcy50Zj1lLlgoMTApKTtyZXR1cm4gdGhpcy50Zn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmhoW2JdJiYodGhpcy5oaFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLiRuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxFazpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sYW46ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuJG0oYi5kYXRhKX0sJG06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxDZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5YZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMuemQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxYZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSxDazpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnNhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnlsKGIpKXJldHVybjsoYT10aGlzLkNnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx5bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTWc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHVtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFZnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxMbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHlmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuZ2woYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuTG4oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sUGs6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGdsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5QayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxFZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxxaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxLYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFVoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scmQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRiPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0RpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEtpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAplbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxEajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxsazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxXajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LEtrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuRGkoKXx8Yi5LaSgpfHxiLmVtKCl8fGIuRGooKXx8Yi5saygpfHxiLnJqKCl8fGIuV2ooKX19O3JldHVybiBudWxsIT1iLktrKCl9LEVsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sc2E6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxnYzpmdW5jdGlvbihiKXtiPXRoaXMuc2EoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LFNsOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuc2EoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxrbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxTbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxSZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMubGkoYSkrIjoiK3RoaXMubGkoTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGxpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx2ZjpmdW5jdGlvbihiKXt0aGlzLkZiPWJ9LE9nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuRmI7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5PZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxjbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLlNsKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sVG46ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmZjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5jbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS53YShmLCEwKTtmPW0ud2EoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFJkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uVWsoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnZkKGIpOiIifSx2ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy51bShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnJmJiZ3aW5kb3cuc2FuZGJveC5yZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnJmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLk1nKGIpKXJldHVybiB0aGlzLk1nKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS54ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5DayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHpkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxDbTpmdW5jdGlvbihiLGEsZCl7dGhpcy56ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx2aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMuQ20oZi54ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkpuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGJwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sbm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuYmp8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmFqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVm09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuT209e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuV289e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5xbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLiRvPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuaGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuJGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5lZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5pZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EudWs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuY2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Dbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTm09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Eucmw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5abz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS55Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmRsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5uZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5nZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eud2s9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnZrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5zaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLlFtPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuQWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS56Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuVm89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EueW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54bz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLlBtPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5hanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLnZqfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxPbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdWQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnVkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudWQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG9oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5PbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnVkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmNqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhtfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTWk9YX0pKGMpO3ZhciBLPWMuTWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Zanx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Kaj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTGI9MDt0aGlzLlRhPTE1MDt0aGlzLlJiPTA7dGhpcy5DbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGE/KHRoaXMuTGIrKyx0aGlzLlJiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTGI+dGhpcy5UYT8hMDohMX0scWY6ZnVuY3Rpb24oKXt0aGlzLkxiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxDbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sTWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudWgmJkwuWm4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxvbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLkpqfHx0OyhmdW5jdGlvbihjKXtjLkxqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5MYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRWI9IiI7dGhpcy5FZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTm46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRm46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTGI8PXRoaXMuVGEmJih0aGlzLkxiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSGQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ibSgpfHx0aGlzLnlrKCk7dGhpcy5IZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHlrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx4YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxUaDpmdW5jdGlvbihhKXt0aGlzLkViPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWJ9LFBoOmZ1bmN0aW9uKCl7dGhpcy5FYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRWImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkVnfHwodGhpcy5FZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLkxqfHxxOyhmdW5jdGlvbihjKXtjLkFpPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuWGY9IjEiO3RoaXMuWWY9IjIiO3RoaXMucms9IjMiO3RoaXMuJGM9MDt0aGlzLnloPQozMDt0aGlzLldiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5qZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMud2YoYSk7dGhpcy5EbihiKX0sZjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLm5pfHwodGhpcy5uaT0hMCxlLlhlKCkpfSxlZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGdtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmZjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5mYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZmMoKV09MX0sbG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZmMoKSYmKHRoaXMueGYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy51YSgpKXt0aGlzLmdtKCk7aWYoIXRoaXMubG0oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMueGYoKTtyZXR1cm59dGhpcy54ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuaGkoKTt0aGlzLmpnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy51YSgpfHwodGhpcy5XYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGhpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5XYiYmMDx0aGlzLldiLmxlbmd0aCYmKHRoaXMuV2I9ZS51bmlxdWUodGhpcy5XYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuV2Iuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamd9LHM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlhmfSx4ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWWZ9LEtuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ya30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxiZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5YZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWWZ9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx3ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxNbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEZtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5BaXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm9vPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5vb3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubWE/Yi5tYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5UaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLk9qfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuTGcoKTt0aGlzLk5nKCk7dGhpcy5jbD0hMX0sTGc6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxOZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0seGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5ranx8cmE7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuYWQ9ITE7dGhpcy5rZT0xO3RoaXMuYmQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTthLmdldENvbmZpZyYmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nPyhiLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiYKYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMua2U9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnliPSEwKTooYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy55Yj0hMCksYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy55Yj0hMCkpKSxiLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMueWI9ITApKTp0aGlzLnMoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZENvbXBsZXRlJiZhLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ29tcGxldGUiKTt0aGlzLmFkPSEwfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiYKYS5fZXZlbnRzLmFkQ2xpY2smJmEuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uJiZhLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRJbXByZXNzaW9uIik7dGhpcy5lZigpfS5iaW5kKHRoaXMpfSk7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRNZXRhJiZhLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTthLl9ldmVudHMmJmEuX2V2ZW50cy5hZFNraXBwZWQmJmEuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5hZFRpbWUmJmEuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLmFkRXJyb3ImJmEuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKX0pO2EuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YSxjYWxsYmFjazpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz0hMDtiLmR1cmF0aW9uPnRoaXMueWgmJiF0aGlzLnVhKCkmJih0aGlzLnliPyh0aGlzLm0oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmcoKSk6KHRoaXMubSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChiLmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKX0pOwphLl9ldmVudHMmJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmEuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLmNsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYjtiJiYoYi5DZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkQ29tcGxldGUpYS5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRDb21wbGV0ZSIpO3RoaXMuYWQ9ITB9LmJpbmQodGhpcykpO2lmKGEub25BZEltcHJlc3Npb24pYS5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMucygib25BZEltcHJlc3Npb24iKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpO2lmKGEub25BZFBsYXkpYS5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMucygib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7CmlmKGEub25BZFRpbWUpYS5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMucygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2lmKGEub25UaW1lKWEub25UaW1lKGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy55aCYmIXRoaXMudWEoKSYmKHRoaXMueWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGIuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmJkLmluZGV4T2YoYikmJnRoaXMuYmQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy5zKCksdGhpcy5uYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPwp0aGlzLnMoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy5zKCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5iZC5sZW5ndGg+PXRoaXMua2UmJnRoaXMuZygpKX0sRm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRWYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLnMoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmFkfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuTGcoKSxiLk5nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksCjIwKSl9fSl9KShjKTt2YXIgc2E9Yy5qanx8c2E7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5JbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IHJhKHdpbmRvdy5qd3BsYXllcihhW2JdKSk7dGhpcy5MKGcpfHx0aGlzLm9tKGcpfHwodGhpcy5OKGcpLGc9bmV3IHNhKGcsdGhpcy5HKSxnLksoKSxnLmYoKSl9fXRoaXMuUCgpfX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sSWw6ZnVuY3Rpb24oKXt2YXIgYT1lLnNhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGEuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmxqfHx0YSx1YT1uZXcgdGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5mbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuZm18fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmdrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGI9YS5lbF87Ynx8KGI9YS5lbCgpKTtiPyh0aGlzLlQoYiksKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVyhhKTp0aGlzLlooKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sUjpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sClFkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihhKXRyeXt2YXIgYj1KU09OLnBhcnNlKGEpO2lmKGIuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWJbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9YT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5hdXRvcGxheT9hLmF1dG9wbGF5KCk6ITF9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSx4YTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/CiExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLmN1cnJlbnRUaW1lKXJldHVybiBhLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgd2E9Yy5na3x8d2E7KGZ1bmN0aW9uKGMpe2MuZms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9dGhpcy5mZD0hMTt0aGlzLktoPWUuS2IoMTApO3RoaXMuSmY9ITA7dGhpcy54Yz10aGlzLmxoPSExO3RoaXMuTW0oYS5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLkJoKCksdGhpcy5RaygpLAp0aGlzLnNiKCkpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYS5WLCI7Iix0eXBlb2YgYS5WLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixhLlY/YS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYS5WP3R5cGVvZiBhLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixhLmltYSwiOyIsdHlwZW9mIGEuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYS5ILCI7Iix0eXBlb2YgYS5ILCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuaW1hP2EuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguRWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixhLmltYSYmYS5pbWEuRWE/YS5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuaW1hJiZhLmltYS5FYT90eXBlb2YgYS5pbWEuRWEoKToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkguZ2U6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkguaGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5oZToKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubWE6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucWU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5LaCl9LEhjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmltYTMmJih0aGlzLmltYT1hLmltYTMpO2lmKGEuaW1hKXt0aGlzLmltYT0KYS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChiKXt9fXJldHVybiB0aGlzLmltYX0sSWM6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc0xvYWRlciYmKHRoaXMubWE9YS5hZHNMb2FkZXIpLGEuX2Fkc0xvYWRlciYmKHRoaXMubWE9YS5fYWRzTG9hZGVyKSxhLmdldEFkc0xvYWRlciYmKHRoaXMubWE9YS5nZXRBZHNMb2FkZXIpLGEuY29udHJvbGxlciYmYS5jb250cm9sbGVyLnNka0ltcGwmJmEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LApaZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LG1tOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2gpe3ZhciBhPXRoaXMuSGMoKSxiPXRoaXMua20oKTt3aW5kb3cuaW1hJiZhJiYoYS5fYWRzTG9hZGVyfHxhLmFkc0xvYWRlcnx8YikmJih0aGlzLmtoPSEwKX1yZXR1cm4gdGhpcy5raH0sa206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmZkJiZhLmFkcyYmKGEuYWRzLnN0YXRlfHxhLmFkcy5fc3RhdGUpJiYodGhpcy5mZD0hMCk7cmV0dXJuIHRoaXMuZmR9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYygpO2lmKGEpe3ZhciBiPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT0KdHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5sbigpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGxuOmZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt2YXIgYT10aGlzLlpnKCk7aWYoYXx8dGhpcy51YSgpKXt2YXIgYj0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTthLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsKInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtpZihlLkYoImNoaXAuZGUiKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFiLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTsKYS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMueWN8fCh0aGlzLm0oImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmJhKCksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLkJnJiZhLmFkcyYmCih0aGlzLkJnPWEuYWRzKTtyZXR1cm4gdGhpcy5CZ30sUWs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7dGhpcy5tKCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTNhZGVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsCnRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmVmKCl9LmJpbmQodGhpcykpfSxwZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1hJiYoKGE9dGhpcy5aZygpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZygpJiYwPGEuY3VycmVudFRpbWUoKSlpZih0aGlzLm1tKCkpe3ZhciBiPXRoaXMuSGMoKSwKZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLnMoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5saD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmJhKCkpOih0aGlzLmJhKCEwKSx0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5saD0hMDthLmlzUGxheWluZygpJiYxMDxhLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJoKCl9LmJpbmQodGhpcyksNTApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIsYSl7dmFyIGc9ITE7aWYoYil7aWYoMTAwOT09Ynx8MzAzPT0KYnx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sUms6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy5zKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLkNjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SaygpfS5iaW5kKHRoaXMpLDEwKX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZT8hMTp0aGlzLnZhfSxDYTpmdW5jdGlvbigpe2lmKHRoaXMuY20oKSl7dGhpcy52YT0hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpdGhpcy5KZj0hMSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwic2V0IiwhMCk7dGhpcy5nKCEwKX1lbHNlIHRoaXMudmE9CiEwLHRoaXMucygiZW1wdHkgdmFzdCIpfSxjbTpmdW5jdGlvbigpe2lmKDA8PWUuZ2MoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPSExO2UuemQoImh0dHBzOi8vYWRzZXJ2ZXIuc2NobmVldm9ubW9yZ2VuLmNvbS9hZHNlcnZlL3YxL2NjIiwiZ2V0IixudWxsLGZ1bmN0aW9uKGIpe2I9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7YT0hZS5mYihiLmNjKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2E9ITF9LCEwLCEwKTt2YXIgYj1lLkVsKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS54ZT0tMSE9Yi5pbmRleE9mKCJmaXJlZm94Iil8fC0xIT1iLmluZGV4T2YoInNhZmFyaSIpfHxhfXJldHVybiExfSxiYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKT8KKHRoaXMucygpLHRoaXMubmEoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy51YSgpfHwoYXx8KHRoaXMuSmY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSmYsZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFprOmZ1bmN0aW9uKCl7dGhpcy5ScHx8KDEwPHRoaXMuSW8/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApKToodGhpcy5JbysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnRuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlprKCl9LmJpbmQodGhpcyksNTApKSl9LHRuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnZwRXZlbnQmJgohdGhpcy5Kbyl7dGhpcy5Kbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIisKYixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmZrfHx4YTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxiO2I9dGhpcy5ZaCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXRyeXtiPWJ8fHRoaXMuWWgoYVtnXSl9Y2F0Y2goZCl7fXRoaXMuUCgpfX0sWWg6ZnVuY3Rpb24oYSl7dmFyIGI9W107YS52aWRlb2pzJiZhLnZpZGVvanMuZ2V0UGxheWVycz9iPWEudmlkZW9qcy5nZXRQbGF5ZXJzKCk6YS52aWRlb2pzJiZhLnZpZGVvanMucGxheWVycyYmKGI9YS52aWRlb2pzLnBsYXllcnMpO2lmKDA8CmUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5SYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKX19KX0pKGMpO3ZhciB5YT1jLmhrfHx5YSx6YT1uZXcgeWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLklrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQWE9Yy5Ja3x8QWE7bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5oZj0KMDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlcoYSk6dGhpcy5aKCl9LFhtOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRWIsZz10aGlzLmhhKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLmpjJiYoMDw9Zy5pbmRleE9mKGQpfHxiLkNkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5oZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx4YTpmdW5jdGlvbigpe3RoaXMuaGYrKztpZigxMDx0aGlzLmhmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247CmlmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFFkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9fSl9KShjKTt2YXIgQmE9Yy5Ganx8QmE7KGZ1bmN0aW9uKGMpe2MuRWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSlpZih0aGlzLkdifHwodGhpcy5HYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkdiKyssMTU8dGhpcy5HYil0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5nKCEwKTsKZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9fSwKcWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBnPWEuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZiKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmCmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMudGw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9BREVSUk9SLApmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy50bD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlhtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBDYT1jLkVqfHxDYTsoZnVuY3Rpb24oYyl7Yy5Haj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7CndpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGc9bmV3IEJhKGFbYl0pO2cuamF8fHRoaXMuTChnKXx8KHRoaXMuTihnKSwobmV3IENhKGcsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBEYT1jLkdqfHxEYSxFYT1uZXcgRGEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnpqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRmE9Yy56anx8RmE7bmV3IEZhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlZnKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYoYj1iLnBhcmVudE5vZGUpfXRoaXMuWm09YS5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWEud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1hLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9YS53aWR0aDtnLnN0eWxlLmhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1hLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9CiJhdXRvIjtzd2l0Y2godGhpcy5abSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYil9dGhpcy5UKGcpO3RoaXMuVyhnKTt0aGlzLnNkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2QpfSxyYTpmdW5jdGlvbigpe3JldHVybiEwfSxZazpmdW5jdGlvbigpe2UucWgodGhpcy5zZCk7ZS5PZSh0aGlzLnNkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWsoKX0uYmluZCh0aGlzKSw1MCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sVWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgR2E9Yy5oanx8R2E7KGZ1bmN0aW9uKGMpe2MuZ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuZ2p8fEhhOyhmdW5jdGlvbihjKXtjLmlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiZsLmlucmVhZCl7dmFyIGE9bC5pbnJlYWQsYj1lLlZnKGEsImVsZW1lbnRJRCIpO2lmKGUucWgoYikmJihhPW5ldyBHYShhKSwhdGhpcy5MKGEpKSl7dGhpcy5OKGEpOyhuZXcgSGEoYSx0aGlzLkcpKS5mKCk7cmV0dXJufXRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuUmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIElhPWMuaWp8fElhLEphPW5ldyBJYShyKTsKYz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy5CaXx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmRqPWE7YS5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYil7dGhpcy5kYXRhPWJ9LEVuOmZ1bmN0aW9uKGIpe3RoaXMubWV0aG9kPWJ9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYixhKXt0aGlzLmRhdGFbYl09YX0sems6ZnVuY3Rpb24oYil7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShiKSl9Y2F0Y2goYSl7fX19fSkoYyk7dmFyIEE9Yy5kanx8QTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiLGcsCmQsZil7dGhpcy5YYT1iO3RoaXMuUWc9dGhpcy52aT0hMTt0aGlzLkNoPWQ7dGhpcy5aaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5SZSh0aGlzLlhhLnVybCkmJm0uVmMpe3ZhciBlPW5ldyBBKGIudXJsKTtlLkVuKCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYShlLGZ1bmN0aW9uKGIpe3ZhciBhPSExO3RyeXthPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2E9ITF9YSYmYS5waW5nJiYicG9uZyI9PWEucGluZyYmCihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZWo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuUWcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuaGIudXJsQ2FsbGVkPXRoaXMuWGEudXJsO3RyeXt0aGlzLlpoP3RoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLnZpfHwodGhpcy5oYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJgp0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLlJlKHRoaXMuWGEudXJsKSx0aGlzLkNoJiZ0aGlzLkNoKCl9cmV0dXJuIHRoaXMuaGJ9fX0pKGMpO3ZhciBMYT1jLmVqfHxMYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuRGE9dGhpcy5jZT0hMX1jLk5pPWE7YS5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGIpe3RoaXMuY2U9Yn0sSG46ZnVuY3Rpb24oYil7dGhpcy5EYT1ifSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLAoicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIix2cDoiQWRTa2lwcGVkIix3cDoiQWRTdGFydGVkIixscDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLG1wOiJBZEltcHJlc3Npb24iLGlwOiJBZENyZWF0aXZlVmlldyIscHA6IkFkVmlkZW9NaWRwb2ludCIscXA6IkFkUGF1c2VkIixzcDoiQWRWaWRlb1N0YXJ0Iix0cDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIodGhpcy5jZSxhW2RdKX0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmJlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmJlKXRoaXMuRGEuYmUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5EYSx0aGlzLkRhLmJlW2FdKTt0aGlzLkRhJiZ0aGlzLkRhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhLmdldEVycm9yKCk7YiYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixiKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNlJiZ0aGlzLnJuKCk7dGhpcy5EYSYmdGhpcy5xbigpfX19KShjKTt2YXIgTWE9Yy5OaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhhPQohMTt0aGlzLlpiPSIiO3RoaXMuZ2Q9dGhpcy5ZYj10aGlzLmpiPW51bGw7dGhpcy5IZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMub2E9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm9mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk5iPSIiO3RoaXMuJGQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5aZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuVmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuT2I9IiI7dGhpcy5QYj1bXTt0aGlzLlFiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkFiPSExO3RoaXMuUGQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5pYz0hMTt0aGlzLndnPXRoaXMuVmQ9bnVsbDt0aGlzLkFmPQp0aGlzLlViPXRoaXMuR2c9dGhpcy5UZD10aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLndkPTA7dGhpcy5naD0hMTt0aGlzLmZoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5maj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLlpiLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuWWIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5PYSxqc3BvcHVwczp0aGlzLlRlLHNpZGVsb2Fkczp0aGlzLnRiLGRpc2FibGV0ZXN0czp0aGlzLkhnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuU2UsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMub2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLAppc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5OYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuJGQsSE9NQURfQkxPQ0tFRDp0aGlzLlpkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlZiLHRlc3RIaWRlOnRoaXMuT2IsdGVzdFRhZ3M6dGhpcy5QYix0ZXN0VGFnc0pTOnRoaXMuUWIsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlBkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuaWMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy53ZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5UZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy56YSwKc2VydmVySWQ6dGhpcy5zZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5VYixza2lwQWxsb3dlZDp0aGlzLkFmLHZtYXBzOnRoaXMuT2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHpuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLlpiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5ZYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmCih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkhnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5TZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLm9hPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5OYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuJGQ9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5aZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy52Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlZiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuT2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5RYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUGQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuaWM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLndnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5UZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy56YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVWI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQWY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuT2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuaWU9Yi5hZEZhbGxiYWNrVVJMKX0sJGw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx1ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPQohMH0sSmw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxOZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkxrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsCmM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy5zYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuWmJ8fHRoaXMuamJ8fHRoaXMuWWJ8fHRoaXMuZ2QpJiYoaD10aGlzLkptKGgpKTtiPW5ldyBBKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxRZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sUmU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5RZShiKTtyZXR1cm4gYX0sCkxsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwO3JldHVybiJub25lIn0seGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnNmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnhkKCksYT10aGlzLlVoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LHpoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxJbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuc2EoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPGgubGVuZ3RoO0YrKyl7dmFyIGs9aFtGXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLnpoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy56aChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEptOmZ1bmN0aW9uKGIpe3RoaXMuWmImJgooYis9dGhpcy5aYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5ZYiYmKGI9dGhpcy5JbShiLHRoaXMuWWIpKTtyZXR1cm4gYn0sWGs6ZnVuY3Rpb24oKXt0aGlzLnphJiZ0aGlzLnphLmNsaWVudEFQSXMmJnRoaXMuU2sodGhpcy56YS5jbGllbnRBUElzKX0sU2s6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkluKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5IbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXttPXRoaXM7dGhpcy5TZT0hMDt0aGlzLkpjPWI7dGhpcy5vYT1hO3RoaXMub2Y9ZDt0aGlzLlZkPWY7dGhpcy5EYz1jO3RoaXMuemE9ZXx8e307dGhpcy5YaygpO3RoaXMuQm0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMub2EpdGhpcy56bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMub2EpdHJ5e3RoaXMub2E9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLm9hKXRyeXt0aGlzLm9hPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxyYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sQm06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMuSmMrdGhpcy5vZSgiZ2xvYmFsIikpLHRoaXMuWWwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0sem06ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyBBKHRoaXMub2ErdGhpcy5vZSgiY2xpZW50IiwKLTEhPXRoaXMub2EuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy51ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLktiKCkpO3RoaXMuemEmJnRoaXMuemEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnphJiZ0aGlzLnphLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5nYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWmQpKTt0aGlzLlNiKCk7ZS5GYyhrLlZtKTsoYT1lLmdjKHRoaXMueGQoKSkpfHwoYT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxZbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMub2F8fHRoaXMuTmJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5TYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLm9hfWVsc2UgZD10aGlzLm9hO2lmKCFkLmVuYWJsZWR8fCFkLnNlcnZlcnx8IWQuYWxpYXMpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fAplLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8ZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLk5iPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5KZT1kLmFkcGF0aHx8IiI7dGhpcy5zZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5nYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLk5iJiZ0aGlzLkFhJiZ0aGlzLmdhLmxlbmd0aD90aGlzLk1jKCExKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSx0aGlzLlNiKCkpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT1uZXcgQSh0aGlzLlBjKCkpLGQ9dGhpcy5zYSh0aGlzLk5iKTsKYS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQSh0aGlzLk5iK3RoaXMub2UoImN1c3RvbWVyIikpO3RoaXMuSWEoYSx0aGlzLmJvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnVmKCJjdXN0b21lciIpO2I/dGhpcy5Waj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlZqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0sYm86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmljJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5pYz0KITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5WYz10aGlzLmZiKGQuc3RyaWN0KTt0aGlzLlRkPXRoaXMuZmIoZC5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuR2c9ZC5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLiRhPXRoaXMuZmIoZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5PYj1kLnRlc3RoaWRlfHwiIjt0aGlzLlFiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLlpiPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuWWI9CmQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5nZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT1kLmpzcG9wdXBzfHwhMTt0aGlzLnRiPWQuc2lkZWxvYWRzfHwhMTt0aGlzLlViPWQudnBhaWR8fCExO3RoaXMuemEudnBhaWQ9dGhpcy5VYjt0aGlzLkFmPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMua2Q9ZC5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLk9mPWQudm1hcHN8fCIiO3RoaXMuemM9ZC5hbHRlcm5hdGVfY2xpY2t0aHJvdWdofHwhMTt0aGlzLk9hPWQuYml0cmF0ZXx8MUUzO3RoaXMuaWU9ZC5hZF9mYWxsYmFja19VUkx8fCIiO3RoaXMuUGQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTshdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuaWM9ITAsdGhpcy5NYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5wbygpJiYodGhpcy5PYnx8dGhpcy5RYnx8dGhpcy5QYnx8dGhpcy5VYyk/dGhpcy5vZj8odGhpcy5IYT10aGlzLlM9CiEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuU2IoKSk6dGhpcy5mbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLkdmKCkpfX0sZm86ZnVuY3Rpb24oKXt0aGlzLmVvKCk7dGhpcy5obygpfSxobzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGE9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xOwpmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRj1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEYsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYihGKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYihoKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrCmUuemIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy56YSYmdGhpcy56YS5wbGF5ZXImJnRoaXMuemEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7cmV0dXJufXRoaXMuZGEoImNzcF8iK2EpfWUudHJhY2soInN0YXRzX2hkX2NzcCIsYSwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LEdmOmZ1bmN0aW9uKCl7dGhpcy5TPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSk7dGhpcy5TYigpfSxPZDpmdW5jdGlvbihhKXt0aGlzLnNjPSEwO3RoaXMuU3x8KHRoaXMuUz0KdGhpcy5IYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIoYSkpLHRoaXMuU2IoKSx0aGlzLnRlKCkpfSxlbzpmdW5jdGlvbigpe2lmKHRoaXMuT2Ipe3ZhciBhPWUucmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLnJtKCkpdGhpcy5PZCh0aGlzLlZiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5PYik7Zy5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLk9iKTtnLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4O21pbi13aWR0aDoxMHB4O21pbi1oZWlnaHQ6MTBweDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgZD0wPT09Zy5vZmZzZXRXaWR0aHx8MD09PWcub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyk7CmE9ZH1jYXRjaChmKXt9YT90aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmRpKCl9fWVsc2UgdGhpcy5kaSgpfSxjaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5LYigpKTt0aGlzLmtvKGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy4kaC5iaW5kKHRoaXMpLGcuYmluZCh0aGlzKSl9ZnVuY3Rpb24gZygpe3RoaXMuT2QodGhpcy5WYiwibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLlBiPXRoaXMuVWMpJiZ0aGlzLlBiLmxlbmd0aCl7dmFyIGQ9dGhpcy5QYi5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLiRoKCl9LGtvOmZ1bmN0aW9uKGEsZyxkKXtmdW5jdGlvbiBmKCl7YygpJiZnKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgQShhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZGk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuS2IoKSk7dGhpcy5sbyhmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuY2kuYmluZCh0aGlzKSxnLmJpbmQodGhpcykpfWZ1bmN0aW9uIGcoKXt0aGlzLk9kKHRoaXMuVmIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuUWImJnRoaXMuUWIubGVuZ3RoKXt2YXIgZD10aGlzLlFiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuY2koKX0sbG86ZnVuY3Rpb24oYSxnLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmcoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBoPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGgpLAohMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZyl7Zz09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSwkaDpmdW5jdGlvbigpe2lmKHRoaXMub2MpdHJ5e2UuemQodGhpcy5vYywiZ2V0IixudWxsLGZ1bmN0aW9uKGEpe2E9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7dGhpcy5BYj0hdGhpcy5mYihhLmNjKTt0aGlzLkdmKCl9LmJpbmQodGhpcyksdGhpcy5haS5iaW5kKHRoaXMpLCEwKX1jYXRjaChhKXt0aGlzLmFpKCl9ZWxzZSB0aGlzLkdmKCl9LAphaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuU2IoKTt0aGlzLnRlKCl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PWFkZEV2ZW50TGlzdGVuZXIudG9TdHJpbmcoKS5pbmRleE9mKCJuYXRpdmUgY29kZSIpJiYtMT09YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoImFkZEV2ZW50TGlzdGVuZXIiKX0sU2I6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsZz0iMCI7dHJ5e2UuU2EoKSYmKGE9IjEiKX1jYXRjaChkKXthPTJ9dGhpcy5zYyYmKGc9IjEiKTtlLnRyYWNrKCJzdGF0c19oZF9tb2JpbGVfYWIiLGErIiIrZywhMCk7dGhpcy5vYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkFiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy4kZCkpO3RoaXMuVmQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5WZCYmdGhpcy5WZCh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5BYn0pfSwKV2s6ZnVuY3Rpb24oKXtpZih0aGlzLlRkJiZ0aGlzLiRsKCkpe3ZhciBhPXRoaXMuSmwoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGhpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChnKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSWE6ZnVuY3Rpb24oYSxnLGQsZixjLGgpe3RoaXMud2R8fCh0aGlzLndkPTApO3RoaXMud2QrKzt0aGlzLndkPnRoaXMuZmgmJiF0aGlzLmdoJiYodGhpcy5naD0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuZmgsITApKTthPW5ldyBMYShhLGcsZCk7ZiYmKGEudmk9ITApO2MmJmUucG0oKSYmKGEuUWc9ITApO2gmJihhLlpoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFRrOmZ1bmN0aW9uKCl7ZS5TYSgpfHwKZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGc9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGc9YS5yZXNwb25zZVhNTCl8fChnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5kYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGQpaWYoYT1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5MYygpfHwoYT10aGlzLnNhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBlPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LGNvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLk9mfSxVazpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLklhKGEsdGhpcy5Cby5iaW5kKHRoaXMpLHRoaXMuQW8uYmluZCh0aGlzKSl9LEJvOmZ1bmN0aW9uKGEpe3ZhciBnPW51bGwsZD1udWxsO3RyeXsoZz1hLnJlc3BvbnNlWE1MKXx8KGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59ZHx8dGhpcy5zbCgpfSxBbzpmdW5jdGlvbigpe30sc2w6ZnVuY3Rpb24oKXtlLkZjKGsucmwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZGEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAp0ZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnRiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMudGIubGVuZ3RoO2ErKyl7dmFyIGc9dGhpcy50YlthXTsicmVxdWVzdCI9PWcudHlwZSYmZS5hYihnLnVybCxnLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWcudHlwZSl7dmFyIGQ9bmV3IEg7d2luZG93W2QuZmEoKV09dGhpcztlLmFiKGcudXJsLGcuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LHBvOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuUGR9LEtiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGc9CiIiLGQ9MDtkPGE7ZCsrKWcrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBnfSxmYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGc9IiIsZCxmLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZj1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGY+PjQsaD0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZz1nKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZ30sc2E6ZnVuY3Rpb24oYSl7dmFyIGc9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbZ1tjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2dbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sVWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZyhhKXt2YXIgYj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWE+Pj40KmQmMTUsYis9Zy50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBjLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscj0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSx1LHYsdztuPWEubGVuZ3RoO3ZhciB4PVtdO2ZvcihjPTA7YzxuLTM7Yys9NCllPWEuY2hhckNvZGVBdChjKTw8MjR8YS5jaGFyQ29kZUF0KGMrMSk8PDE2fGEuY2hhckNvZGVBdChjKzIpPDw4fGEuY2hhckNvZGVBdChjKzMpLHgucHVzaChlKTsKc3dpdGNoKG4lNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpjPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goYyk7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHgubGVuZ3RoO2ErPTE2KXtmb3IoYz0wOzE2PmM7YysrKWhbY109eFthK2NdO2ZvcihjPTE2Ozc5Pj1jO2MrKyloW2NdPWQoaFtjLTNdXmhbYy04XV5oW2MtMTRdXmhbYy0xNl0sMSk7ZT1rO249bDtxPW07dT1yO3Y9dDtmb3IoYz0wOzE5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfH5uJnUpK3YraFtjXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsCnY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9MjA7Mzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTQwOzU5Pj1jO2MrKyl3PWQoZSw1KSsobiZxfG4mdXxxJnUpK3YraFtjXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz02MDs3OT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTU7cj1yK3UmNDI5NDk2NzI5NTt0PXQrdiY0Mjk0OTY3Mjk1fXJldHVybihnKGspK2cobCkrZyhtKStnKHIpK2codCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBOYT1jLmZqfHxOYSxtPW5ldyBOYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgT2E9Yy5sbHx8T2E7bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGcsZCl7dGhpcy5hPWE7YS5jLlI/dGhpcy5iYj1hLmMuUigpOnRoaXMuYmI9IiI7YS5jLm5oJiZhLmMubmgoe3BhdXNlOnRoaXMuQ2QuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5SaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5hZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEua2I7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5kYz10aGlzLmhkPSExO3RoaXMuSms9MUUzO3RoaXMucWE9bnVsbDt0aGlzLkI9Zzt0aGlzLmdiPXt9O3RoaXMudmlkZW89e307dGhpcy5MZD17fTtlLnBiKCJuZXdCaWdBZElkIik7dGhpcy5Naz1lLlgoMTApOwp0aGlzLkNmPTA7dGhpcy5lZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLmVkPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLmVkPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLkZrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuZmY9dGhpcy5LZD0hMTt0aGlzLndoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy5uZT0hMTt0aGlzLmtpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuamM9ITE7dGhpcy5mbD1lLlgoMTApO3RoaXMuSmI9ZS5YKDEwKTt0aGlzLkhiPWUuWCgxMCk7dGhpcy5WaD1lLlgoMTApO3RoaXMuY29uZj17fTt0aGlzLldkPQp0aGlzLlRiPXRoaXMudmU9dGhpcy5vZD10aGlzLk1kPXRoaXMudWI9dGhpcy5xYz10aGlzLkVoPXRoaXMudGQ9dGhpcy5xbz10aGlzLnhiPXRoaXMuSWI9ITE7dGhpcy52Yz1bXTt0aGlzLmxjPXt9O3RoaXMuVG09MjAwO3RoaXMuUmY9dGhpcy5XYz10aGlzLnJlPXRoaXMuUWY9dGhpcy5uZj0hMTt0aGlzLmNmPXt9fWMuJGk9YTthLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBnPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGc9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gZ30saWk6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLlZuKCk7ZS5vKGsud2ssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sV2U6ZnVuY3Rpb24oYSxnLGQsYyl7dGhpcy54Yj0KZDt2YXIgaD0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoaD0hMCk7aWYodGhpcy5CLlMpdGhpcy5DZisrLGUucGIoIm5ld1NtYWxsQWRJZCIpLHRoaXMuQi5XaygpLGM9bS5nZXRDb25maWcoKSxlLnhlJiYodGhpcy5CLnpuKHthZHRhZ3BhcmFtZXRlcjoiJnN2bS1kYXQ9MSJ9KSxlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiY2FsbCIsITApKSx0aGlzLkIuSGEmJnRoaXMuQi5pc0VuYWJsZWQ/KHRoaXMuaWkoKSxuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ZyxiaXRyYXRlOmMuT2EsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkIuVWIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6Zz8odGhpcy5paSgpLApuZXcgUih0aGlzLGEsdGhpcy53aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuQi5VYix1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLlBhKCk7ZWxzZXt2YXIgaz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtrLldlKGEsZyxkKX0sNTApfX0samY6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLldkPXRoaXMuVGI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlBuKHRoaXMuYik7dGhpcy5iaChhKTt0aGlzLnZjPXRoaXMuU2coYSk7dGhpcy4kaygpfSxiaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5MZD10aGlzLlVsKGIpKSx0aGlzLmJoKGIucGFyZW50KSl9LFNnOmZ1bmN0aW9uKGIpe3ZhciBnPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGc9dGhpcy5TZyhiLnBhcmVudCkpLGcucHVzaCh0aGlzLkRsKGIpKSk7cmV0dXJuIGd9LERsOmZ1bmN0aW9uKGEpe3ZhciBnPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtnPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZC5wdXNoKGFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6ZyxjcmVhdGl2ZUlEOmR9fSxVbDpmdW5jdGlvbihhKXt2YXIgZz1bXSxkPVtdLGM9W10sZT1bXSxoPSIiO2lmKGEuSil7Zz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKYz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxnLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoZ1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBnPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGc9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoZz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpnPT1ELmVlLmNvZGU/ZS5vKGsuV28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTooZS5YZSgpLGc9PUQuVmYuY29kZSYmZS5vKGsuTm0sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk7ZS5vKGsucWwsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlduKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5BYiwhMCk7YnJlYWs7Y2FzZSB3LlRmLmNvZGU6ZS5vKGsuQ28sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5XZi5jb2RlOmUubyhrLlpvLAp0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5mZS5jb2RlOmUubyhrLiRvLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYWUuY29kZTplLm8oay5PbSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWWQuY29kZTplLm8oay55byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay56byx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5lYyhhKTt0aGlzLlBhKCl9LGVjOmZ1bmN0aW9uKGEpe3ZhciBnPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZz1hLmVycm9yLmNvZGUsOTAxPGcmJihnPTkwMCkpO2ZvcihnPXsiW0VSUk9SQ09ERV0iOmd9O2EuTWEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5NYS5wb3AoKTt0aGlzLlZlKGQudXJsLGQudHlwZSxnKX1jYXRjaChjKXt9fSxQbjpmdW5jdGlvbihhKXt0aGlzLnZlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBnPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGc9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1nO2c9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGM9IiI7ZCYmZC5lbnZ2YXJzJiYoYz1kLmVudnZhcnMoKSk7Yy52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcyYmKGM9ZC5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKYy52aWRlb1Nsb3QmJihnPWMudmlkZW9TbG90LHRoaXMubmY9ITApfWNhdGNoKGgpe31nLmNxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihnLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmZy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5GayYmdGhpcy5wbGF5ZXIuQ2UoKSYmKGcudm9sdW1lPXRoaXMucGxheWVyLkNlKCkvMTAwKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDwKYS5NLmxlbmd0aDtkKyspZy5jYW5QbGF5VHlwZShhLk1bZF0udHlwZSkmJnRoaXMuQWsoZyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm5mJiZnLmxvYWQoKTtpZih0aGlzLmVpKGcpKXt0aGlzLldoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkRrKGcpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5uZj90aGlzLnZpZGVvPWc6dGhpcy52aWRlbz10aGlzLnFhLmFwcGVuZENoaWxkKGcpfWNhdGNoKGwpe3RoaXMudmlkZW89Z319ZWxzZSB0aGlzLmIuYWwoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdPwphLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMucWE9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMucWEuYXBwZW5kQ2hpbGQoZyksdGhpcy5NbigpKTp0aGlzLmIub3JpZ2luLklnKHcuYWUpfSxNbjpmdW5jdGlvbigpe3RoaXMuUWY9ITA7dGhpcy51Yj10aGlzLnFjPSExO3RoaXMuYS5jLnJhJiZ0aGlzLmEuYy5yYSgpJiYoZS5vKGsuemcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnViPSEwKTtlLnVlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLnRhJiZlLkVrKHRoaXMuYi5vcmlnaW4udGEpO3RoaXMuV2goInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUIucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuRmgoKTt0aGlzLmEuemYoKTtmb3IoYT0KdGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS56ZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS55Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMucWE9dGhpcy5hLkk7dGhpcy5vaSgidnBhaWQiKTtpZih0aGlzLnViKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuTWIoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLAoibm8iKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnlmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5YbCgpLGM9dGhpcy5iLnYuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHwKYi5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmMsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuaWEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLAoiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5uZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucGUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsCnRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmhjKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuS28oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5MbygpLHRoaXMuYS5oYyghMCksIXRoaXMuVGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMuQywKY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5QbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaGMoITApLHRoaXMuVG8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuU28oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy50aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD0KYS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmIuYmMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk9vKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5sZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk1vKCk7CiJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmKHRoaXMuV2MmJih0aGlzLlJmPSExLHRoaXMubmMoKSksdGhpcy5ObygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnViPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5NYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQWQsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMudWI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk1iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLklmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGUubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSwKdGhpcy51KCkpKX19LmJpbmQodGhpcykpO2UucGUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlBhKCl9LmJpbmQodGhpcykpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXtlLmlhKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5qZSx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudiwKdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnFjPSExfSxQbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmhnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LE9vOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LExvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuWGgoKTtlLm8oay5jZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxUbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpfSxSbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay4kZiwKdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sU286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuZWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKX0sVW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLmlnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSl9LFFvOmZ1bmN0aW9uKCl7dGhpcy5MZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHRpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOwplLnVlKCk7dGhpcy5DPSExO3RoaXMuUGEoYSl9fSxLbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuVm8sdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt0aGlzLnRpKCEwKX0sQWs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5IYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBkPWIuc2EoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLkhvLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLApkKGMsdGhpcy5CKSl9LGVpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxEazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5waS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLk5mLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LEdkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTmYuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yaS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLkxmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTWYuYmluZCh0aGlzKSl9LHBpOmZ1bmN0aW9uKGEpe3RoaXMuZGN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kY3x8dGhpcy5OZihhKX0uYmluZCh0aGlzKSx0aGlzLkprKSl9LE5mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmVpKHRoaXMudmlkZW8pJiYhdGhpcy5JYiYmIXRoaXMuZGMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLklifHwodGhpcy5JYj0hMCx0aGlzLkdkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsCnRoaXMuV2EoKSwhMCksdGhpcy5CLkdnfHx0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5QYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5FbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLnpmKCk7dGhpcy5EbygpO3RoaXMub2koKTt0aGlzLm9nKCk7dGhpcy5hLkZoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkRmKCl9fSxEZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuYWcoKX0sYWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5QYSgpOih0aGlzLmFmKCEwKSx0aGlzLmFnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0uYmluZCh0aGlzKTt0aGlzLkVlKCkuVGgodGhpcyl9LExmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5JYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnVrLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5QYSgpfSx4azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlhnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlJhKGEsdGhpcy51KCkpO2UuVG4oYSl9LFBhOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLlhkJiZ0aGlzLnhrKHRoaXMuYi5YZCk7CmlmKCF0aGlzLnZlKWlmKHRoaXMudmU9ITAsdGhpcy5XZHx8KGUubyhrLlFtLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLndifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuQ2YrKzt0aGlzLmRjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnFhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmEubWkoKX1jYXRjaChoKXt9dGhpcy5NZD0hMDt0aGlzLmEuSWUoKTt0aGlzLmpjPSExO3RoaXMuRWUoKS5QaCgpO3RoaXMuYi53YiYmdGhpcy5iLm9yaWdpbi5iZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5BaCgpOnRoaXMud2UoKSl9ZWxzZSB0aGlzLndlKCl9LApIbzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuTWYoYSkpfSxNZjpmdW5jdGlvbihhKXt0aGlzLmRjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5UaygpO3RoaXMuYi5vcmlnaW4uSWcody5hZSl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy5xbyl0aGlzLlBhKCk7ZWxzZXt0aGlzLmpjPSEwO3RoaXMuYS5jLnhhJiYhdGhpcy5NZCYmdGhpcy5hLmMueGEoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpOwp0aGlzLnRvKGEpO2lmKCF0aGlzLlRiKXt2YXIgYz0yRTMsZD01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVGI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLldkPSEwO2UubyhrLnNpLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlBlKHRoaXMuVGIpfWQ9IiI7dGhpcy5iLkJmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlZoKSkmJihkPXRoaXMuYi5CZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApkKTooZD10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmdnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7dGhpcy5iLndiPyh0aGlzLmRjPXRoaXMuaGQ9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnFhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5xYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYS5taSgpLHRoaXMuYi5vcmlnaW4uYmYoKSk6dGhpcy5QYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5uZT0hMDsKdGhpcy52aWRlby5jb250cm9scz0hMX19LGppOmZ1bmN0aW9uKCl7dGhpcy5FaHx8KHRoaXMuRWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHRvOmZ1bmN0aW9uKGEpe2UubyhrLmxlLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSk7YT09dGhpcy5raXx8dGhpcy5JYnx8KDA9PWEmJih0aGlzLnhiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnhiKSx0aGlzLnhiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkFiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5BYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmppKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5qaSgpfS5iaW5kKHRoaXMpKSx0aGlzLklifHwKdGhpcy5YaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmNnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksZS5vKGsuaGcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLiRmLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksCmUubyhrLmVnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5pZyx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksdGhpcy51KCkpKSx0aGlzLmtpPWEpfSxXaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sVm46ZnVuY3Rpb24oKXtlLlJkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LFhoOmZ1bmN0aW9uKCl7ZS5SZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSxXbjpmdW5jdGlvbigpe2UuUmQoWyJzdGF0c19oZF9hZF9lbXB0eToiKwp0aGlzLldhKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX0sVWE6ZnVuY3Rpb24oYSl7ZS5SZChbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5RZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE1iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuSWIpe3RoaXMuY2YmJnRoaXMuY2YudHJhY2smJnRoaXMuY2YudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnhlJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0KITB9dmFyIGQ9W107dHJ5e2Q9dGhpcy5WbCh0aGlzLmIuTWEsYSl9Y2F0Y2goZil7ZD1bXX1mb3IoO2QubGVuZ3RoOyl0cnl7dmFyIGg9ZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnJlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTGQuaW1wcmVzc2lvbnMmJmUubm0oaC51cmwsdGhpcy5MZC5pbXByZXNzaW9ucyk/dGhpcy5WZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsudmssdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHthZElkOnRoaXMuTGQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMudSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlZlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTWE9dGhpcy5qbCh0aGlzLmIuTWEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IiwKYz0iIjt0aGlzLlFmJiYoYz0iX3ZwYWlkIik7dGhpcy5XYyYmKGM9Il93ZWxlY3QiKTtyZXR1cm4gYStjfSxWZTpmdW5jdGlvbihhLGMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi53YShhKSxkJiZjLnprKGQpLGZ8fChmPXRoaXMuRmcpLGV8fChlPXRoaXMuRmcpLHRoaXMuQmsoYSksdGhpcy5CLklhKGMsZnVuY3Rpb24oKXt0aGlzLk9oKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuT2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LEJrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxPaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSwkazpmdW5jdGlvbigpe3RoaXMubGM9e319LFluOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFZsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PQpjfSl9LGpsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1jfSl9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Gby5iaW5kKHRoaXMpKX0sRm86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmJjJiYoZS5vKGsueWcsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9CnRoaXMuYi5iY31jYXRjaChkKXt3aW5kb3cub3Blbih0aGlzLmIuYmMsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxEbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9CiJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuUmcoMCkpO3ZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNiLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnFhLmFwcGVuZENoaWxkKGEpfX0sQ2I6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9pOmZ1bmN0aW9uKGEpe2lmKCFlLkVmKHRoaXMuY29udHJvbHMpKXt2YXIgYz0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuZmw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkRiKCk7dGhpcy5DYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuSmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ2kuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5naS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZmkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5EYigpO3RoaXMuQ2IoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkhiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5zby5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnJvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLklkKCl9LmJpbmQodGhpcykpOwpoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlZoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkJmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnFhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRGIoKTt0aGlzLkNiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucWEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLApjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy55YT10aGlzLnFhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5rZyhmdW5jdGlvbihhKXt0aGlzLnlhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5yYSYmdGhpcy5hLmMucmEoKSYmKGUubyhrLnpnLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5hZigpKTt0aGlzLkRiKCl9fSxEYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7dGhpcy55YSYmImJsb2NrIj09dGhpcy55YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxmaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLnBhdXNlZD8odGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSkpfSxnaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMucWM/KGUuaWEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLnlhJiYodGhpcy55YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5EYigpLHRoaXMuQ2IoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sQ2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsuamUsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LFJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5jZCx0aGlzLmIudix0aGlzLmEuYy5sKCksdGhpcy53KCksCnRoaXMudSgpKSl9LHJvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTWIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwidXNlciIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSxzbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMudWI/KGUuaWEodGhpcy5DLCJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuaWEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuTWIoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkFkLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSkpfSx2bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5NYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS5vKGsuSWYsdGhpcy5iLnYsdGhpcy5hLmMubCgpLHRoaXMudygpLHRoaXMudSgpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm5lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5EZigpKX0sd2U6ZnVuY3Rpb24oKXt0aGlzLndtKCkmJnRoaXMudm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkZiJiZ0aGlzLnVvKCl8fCh0aGlzLm9kPSEwLHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMuQWcoKSl9LHdtOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpO3JldHVybiB0aGlzLkIuVWImJiFlLlNhKCkmJgooYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHZtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5zYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZmZ8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMucmUmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmZmfSxLbDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sdW86ZnVuY3Rpb24oKXttLmdldENvbmZpZygpO3RoaXMuZmY9dGhpcy5XYz10aGlzLlJmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwKdGhpcy5XYSgpLCEwKTt0aGlzLnJlPSEwO3ZhciBhPXRoaXMuS2woKSxhPWUubmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLldlKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEFnOmZ1bmN0aW9uKGEpe3RoaXMuWW4oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlRtKToodGhpcy5NZD0hMCx0aGlzLmEuSWUoKSx0aGlzLmEudm4oKSx0aGlzLmpjPSExLGUubyhrLmRsLHRoaXMuYi52LHRoaXMuYS5jLmwoKSx0aGlzLncoKSx0aGlzLnUoKSksdGhpcy5FZSgpLlBoKCkpfSxFZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxvZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5SaCgpOnRoaXMuQ2QoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSwKMTAwKSl9LHc6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuYmMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIud2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5NaysiLSIrdGhpcy5DZjt0aGlzLmImJnRoaXMuYi5ZZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuWWcoKSk7cmV0dXJuIGF9LEZnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy4kaXx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5Zbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuWW98fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubGE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMudGE9IiI7dGhpcy5QZj0hMTt0aGlzLmloPSIiO2QmJmQuZW1wdHk/dGhpcy5FbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGcsZD1bXTtjLmVrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnJkKCksYjtiPWUuc2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBBKHRoaXMudXJsKTptLndhKG0uTmQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCkpe3ZhciBoPWUuQ2codGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmCnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLGw9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKWwoKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLk5kKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1tLndhKG0uTmQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy5EbS5iaW5kKHRoaXMpLHRoaXMuQW0uYmluZCh0aGlzKSl9LFRnOmZ1bmN0aW9uKCl7dmFyIGE9CjA8dGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5sYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuRmIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGcpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7CjA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkZifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5GYnx8dGhpcy50bShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5jbygpKXRyeXt2YXIgZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zy5sZW5ndGgmJihnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWYuZmlyc3RDaGlsZDtjLnB1c2goZil9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSx0bTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERtOmZ1bmN0aW9uKGEpe3RoaXMuZG4oYSk7dHJ5e3RoaXMubGE9YS5yZXNwb25zZVhNTCx0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLlFhKHcuZmUpKX10aGlzLlY9dGhpcy5UZygpO3RoaXMud2M9dGhpcy5GZigpO3RoaXMudWM9dGhpcy5iaSgpO3RoaXMuaWg9YS51cmxDYWxsZWQ7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5wYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuUGY/RC5lZToKRC5VZn0pKX0sRW06ZnVuY3Rpb24oYSl7dHJ5e3RoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucGEodGhpcy5RYSh3LmZlKSl9dGhpcy5WPXRoaXMuVGcoKTt0aGlzLndjPXRoaXMuRmYoKTt0aGlzLnVjPXRoaXMuYmkoKTt0aGlzLlYubGVuZ3RoP3RoaXMuT2MoKTp0aGlzLnBhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5QZj9ELmVlOkQuVWZ9KSl9LEFtOmZ1bmN0aW9uKCl7dGhpcy5wYSh0aGlzLlFhKHcuVGYse2RlcHRoOmJ9KSl9LE9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMueG0oKT90aGlzLm1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZGgoKSxnLHtBZFN5c3RlbTp0aGlzLkNsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucGEodGhpcy5RYSh3LldmKSk6KGI9MCx0aGlzLndvKCkmJnRoaXMuamYodGhpcy5obCgpKSl9LGJmOmZ1bmN0aW9uKCl7dGhpcy53Yz8KKHRoaXMud2M9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuYmYoKX0sQWg6ZnVuY3Rpb24oKXt0aGlzLnVjPyh0aGlzLnVjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LkFoKCl9LHdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam8oKT90aGlzLmlvKCk/ITA6KC0xIT10aGlzLkdjKCk/dGhpcy5wYSh0aGlzLlFhKHcuWWQpKTp0aGlzLnBhKHRoaXMuUWEody5TZikpLCExKToodGhpcy5wYSh0aGlzLlFhKHcuWWMsRC5WZikpLCExKX0samY6ZnVuY3Rpb24oYSl7dGhpcy50YXx8KHRoaXMudGE9IiIpO2EuWGR8fChhLlhkPVtdKTthLlhkLnB1c2godGhpcy5paCk7YS5NYT1hLk1hLmNvbmNhdCh0aGlzLlllKCkpO2Eud2I9YS53Yj9hLndiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy50YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJgohdGhpcy5vcHRpb25zLlBnO3RoaXMucGFyZW50LmpmKGEpfSxobDpmdW5jdGlvbigpe3ZhciBhPW5ldyBSYTt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5kdXJhdGlvbj10aGlzLkdjKCk7YS5NPXRoaXMuJGcoKTthLmJjPXRoaXMuRmwoKTthLmtxPVtdO2Eub3JpZ2luPXRoaXM7YS52PXRoaXMuQmwoKTthLkJmPXRoaXMuVGwoYS5kdXJhdGlvbik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO3JldHVybiBhfSxwYTpmdW5jdGlvbihhKXt0aGlzLnRhfHwodGhpcy50YT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMudGEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlBnO2lmKCF0aGlzLkomJnRoaXMubGEmJnRoaXMubGEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5sYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpjLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGQpe319dGhpcy5KJiYoYS5NYT1hLmVycm9yLmNvZGUhPXcuWWQuY29kZT9hLk1hLmNvbmNhdCh0aGlzLkdsKCkpOmEuTWEuY29uY2F0KHRoaXMuUGwoKSkpO3RoaXMuVi5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5lYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmVjJiZ0aGlzLnBhcmVudC5lYyhhKSxiPTAsdGhpcy5PYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnBhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucGEmJnRoaXMucGFyZW50LnBhKGEpLGI9MCl9LGVjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmVjKGEpfSxJZzpmdW5jdGlvbihhLGIpe3RoaXMucGEodGhpcy5RYShhLGIpKX0sUWE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxtbzpmdW5jdGlvbigpe3JldHVybiBiPApnfSxqbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJGcoKS5sZW5ndGh9LGlvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5HYygpfSxGZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVi5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5WJiYyPD10aGlzLlYubGVuZ3RoJiYhdGhpcy5GZigpJiYoYT0hMCk7cmV0dXJuIGF9LGRuOmZ1bmN0aW9uKGEpe3RoaXMudGE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy50YT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLnRhPSJVTktOT1dOIn10cnl7dGhpcy5QZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx4bTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLmRoKCkubGVuZ3RofSxkaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiVkFTVEFkVGFnVVJJIil9LENsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGUodGhpcy5KLCJBZFN5c3RlbSIpfSxZZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnBoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0scGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/CiJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMucGgoYS5wYXJlbnROb2RlKTohMX0sUGw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sR2w6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlllKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LEZsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LCRnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2E6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSwKaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxFcDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5sYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5PYSktTWF0aC5hYnMoZC1iLk9hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpOwpmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy52ZChhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sR2M6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LFRsOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuU24oZCwKYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sRGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmxiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxHZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy52ZChhKToiIn0sdmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuZWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5DaXx8VGE7bmV3IFRhKDEsbmV3IERhdGUsCjIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTWE9W107dGhpcy5NPVtdO3RoaXMuYmM9IiI7dGhpcy52PXRoaXMudGM9dGhpcy53Yj0hMTt0aGlzLktlPXRoaXMub3JpZ2luPW51bGw7dGhpcy5MZT0iIn1jLklqPWE7YS5wcm90b3R5cGU9e2FsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LE5sOmZ1bmN0aW9uKCl7aWYoIXRoaXMuS2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5sYSl7dmFyIGE9dGhpcy5vcmlnaW4ubGE7aWYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSlmb3IodmFyIGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5LZT1hW2RdKX1yZXR1cm4gdGhpcy5LZX0sCllnOmZ1bmN0aW9uKCl7aWYodGhpcy5MZSlyZXR1cm4gdGhpcy5MZTt2YXIgYT0iIjsoYT10aGlzLk5sKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5MZT1hfSxYbDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtjXTtyZXR1cm4gYX19fSkoYyk7dmFyIFJhPWMuSWp8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5uaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMubmp8fFVhO25ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtmZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixMYToiWE1MX1BBUlNFX0VSUk9SIn0sU2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMiwKbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixMYToiRFVSQVRJT05fRVJST1IifSxZYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsTGE6IkVNUFRZX1ZBU1QifSxXZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixMYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sVGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCkxhOiJMT0FEX0VSUk9SIn0sYWU6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLExhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sZXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTGE6Ik1FRElBRklMRV9FUlJPUiJ9LFlkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLExhOiJEVU1NWV9BRCJ9fSxEPXtVZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLExhOiJOT19BRFMifSxWZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTGE6Ik5PX01FRElBRklMRVMifSxmcDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsTGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxlZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixMYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYT1jLlNtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5NYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT0KYy5MbXx8V2E7bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxjKXt0aGlzLlFoPWE7dGhpcy52aWRlbz1jO3RoaXMuVWQ9W107dGhpcy5OaD1bXTt0aGlzLmRmPVtdO3RoaXMuR289ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmdwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuUWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5RaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LAplPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2guc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoKTt2YXIgaz1oLmNvbnRlbnRXaW5kb3c7ay5acD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5zbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5qbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpOwp0aGlzLlVkLnB1c2goe3NyYzpkLGZyYW1lOmgsVW06ZSx2ZW5kb3I6Yy5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyl7dmFyIGQ9dGhpcy5kZltjXTtkLnR5cGU9PT1hJiZkLk9rKHRoaXMuSGwoYSkpfX0sSGw6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7aXE6ITAsaHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7VnA6InZpZGVvIixscToianNDdXN0b20iLG1xOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsbnE6MSxGcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLAplbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxXbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVWQubGVuZ3RoO2MrKylpZih0aGlzLlVkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVWRbY10uVW07cmV0dXJuIiJ9LHNuOmZ1bmN0aW9uKGEsYyl7dGhpcy5OaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5XbChjKSx2ZW5kb3I6Y30pO3RoaXMuVW4oKX0sam46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLkdvLm1hcChmdW5jdGlvbihhKXt0aGlzLmxnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMubGcoYSxjKX0sbGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRmLnB1c2goe3R5cGU6YSwKT2s6YyxmcTohMX0pfSxVbjpmdW5jdGlvbigpe3RoaXMuTmgubWFwKGZ1bmN0aW9uKGEpe2EucW18fChhLllwKHthZFNlc3Npb25JZDplLlgoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLmpxLGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5xbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLkxpfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuVWcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPQplLlgoMTApO3RoaXMuQT1CLnBvcCgpO3RoaXMuQXx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLk5hPXt9O3RoaXMubWc9ITE7dGhpcy4kYj1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3psOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuemwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLmRtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0KwphLmNsaWVudExlZnQsZCs9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtoJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxhbzpmdW5jdGlvbigpe3RoaXMubWc9ITB9LG1pOmZ1bmN0aW9uKCl7dGhpcy5BPUIucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5BLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkEuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sRmg6ZnVuY3Rpb24oKXt0aGlzLmMucGF1c2UoKTtlLm8oay5CYyx0aGlzLmMubCgpKX0sdm46ZnVuY3Rpb24oKXt0aGlzLm1nfHwodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LHpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCsKMCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkEuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMua2IpO3RoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlVnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sZG06ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9CiEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfSx3bDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGN9LGhjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMud2wodGhpcy5rYik7aWYoYy54IT10aGlzLk5hLnh8fGMueSE9dGhpcy5OYS55fHxjLnBvc2l0aW9uIT10aGlzLk5hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk5hLndpZHRofHxjLmhlaWdodCE9dGhpcy5OYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5OYS53aWR0aCYmMDx0aGlzLk5hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuSWUoKTtyZXR1cm59dGhpcy5OYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuSS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuSS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuSS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuQS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLiRiLmxlbmd0aDthKyspdGhpcy4kYlthXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkVmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaGMuYmluZCh0aGlzKSwxMCl9LGtnOmZ1bmN0aW9uKGEpe3RoaXMuJGJ8fCh0aGlzLiRiPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy4kYi5wdXNoKGEpfSxJZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpOwp0aGlzLkEmJnRoaXMuQS5wYXVzZSYmdGhpcy5BLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWWE9Yy5PaXx8WWEsQj1bXSxaYT0wOzEwMD5aYTtaYSsrKXt2YXIgTT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO00uc3R5bGUuZGlzcGxheT0iYmxvY2siO00uaWQ9ZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0IucHVzaChNKX12YXIgST0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMubmx8fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2J8fChhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSGQoYSk7dGhpcy5EZygpfSxIZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sRGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkdhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0seGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmcmJmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5HYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7CnZhciBhYj1jLkJqfHxhYjsoZnVuY3Rpb24oYyl7Yy5Baj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Y2EoKTt0aGlzLlhiPXRoaXMuWGJ8fCExO3RoaXMuZGc9dGhpcy5mZz10aGlzLm1oPXRoaXMudmE9dGhpcy5IZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnVsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLm1oJiZ0aGlzLnZnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuRWI7YSYmYS5qYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLAoxMDApfS5iaW5kKHRoaXMpKTtiLm1iLnN1YnNjcmliZShhLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5sZCgpO3RoaXMubWg9ITA7dGhpcy52ZygpfS5iaW5kKHRoaXMpKTt0aGlzLnFnKCl9LHZnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3RoaXMubGQoKTtpZighdGhpcy5IZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkhmJiZ0aGlzLmRnJiYhdGhpcy5mZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5haCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxhaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSwKYz0wO2M8Yi5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWIubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1hKXJldHVybiBkLmluc3RhbmNlfX0scWc6ZnVuY3Rpb24oKXtpZih0aGlzLmxkKCkpe3ZhciBhPXRoaXMuYWgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5mZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRnPWEuQ3B9dGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWcoKX0uYmluZCh0aGlzKSwxMDApfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5UcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGEuaXNQbGF5aW5nP2EuaXNQbGF5aW5nKCk6LTF9LHVsOmZ1bmN0aW9uKGEsYil7dGhpcy5YYj1iLm1hdGNoKC9cZCsvKT9wYXJzZUludChiLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLlhifHwzMDI9PXRoaXMuWGI/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWGIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLnMoKSx0aGlzLm5hKCkpOmEuTWUoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5RbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgYmI9Yy5Banx8YmI7KGZ1bmN0aW9uKGMpe2MuQ2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxzbTpmdW5jdGlvbigpe3dpbmRvdy5PTy5Oai5zay5xaz93aW5kb3cuT08uTmouc2sucWsuQXAoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5GZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkNqfHxjYixkYj1uZXcgY2Iocik7Yz0KY3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Iaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGViPWMuSGt8fGViO25ldyBlYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuamE9ITE7dGhpcy5laCgpfSxlaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7CmEmJiFiJiYoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTthJiZiPyh0aGlzLlQoYSksdGhpcy5XKGIpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWgoKX0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEthOmZ1bmN0aW9uKCl7dGhpcy5JaCgpfSxJaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JaCgpfS5iaW5kKHRoaXMpLAoxMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpdG1vdmluIn19KX0pKGMpO3ZhciBmYj1jLklpfHxmYjsoZnVuY3Rpb24oYyl7Yy5IaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxzZzpmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5uYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLm5hKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLnNnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuc2coYSl9LmJpbmQodGhpcykpOwphLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LExoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5IZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy52bHx8KHRoaXMudmw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkxoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpOwppZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuTGgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLlVqfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy4kaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSy5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuJGp8fFQ7KGZ1bmN0aW9uKGMpe2MuWmo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3guZGQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUm0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guWmwoKX0sUm06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9CmlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMucygpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlpqfHxVOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5CZCYmKGE9ZS5rbChhLHRoaXMuQmQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVChkKTtpZighdGhpcy5MKGQpKXt0aGlzLk4oZCk7dmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkJkfHwodGhpcy5CZD1bXSksdGhpcy5CZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwKKHRoaXMuYWFbYV09e30pO3RoaXMuYWFbYV1bYl18fCh0aGlzLmFhW2FdW2JdPVtdKTt0aGlzLmFhW2FdW2JdLnB1c2goYyl9LG5vOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2JdKXRoaXMuTmN8fCh0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy51bigpJiYodGhpcy5xZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxabDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGU9MDtlPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmFhW2NdW2RdW2VdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ubyhhKX19KX0pKGMpO3ZhciBqYj1jLmFrfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuTWp8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9CiExO3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHhhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxyYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSwKUjpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuRWl8fGxiOyhmdW5jdGlvbihjKXtjLkZpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy5zKCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLkZpfHxtYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8Cih0aGlzLk4oaCksKG5ldyBtYihoLHRoaXMuRykpLmYoKSl9Y2F0Y2goayl7fX10aGlzLlAoKX0sTDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldFJhd1BsYXllcigpOyQoIiMiK2IpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGI9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MueGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy54Zz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXt0cnl7aWYoYSYmYS5zb3VyY2UmJmEuc291cmNlLl9lbnZ2YXJzKXt2YXIgYj10aGlzLktnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5FYz1iKTtpZighdGhpcy54ZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfVElNRXx8IiI7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsYS5zb3VyY2UuQ0hPT1NFUl9BQnx8IiIsITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsYywhMCk7dGhpcy54Zz0hMH19fWNhdGNoKGgpe319LmJpbmQodGhpcykpO3RoaXMuV2coKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmhuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sCldnOmZ1bmN0aW9uKCl7aWYodGhpcy5FYylyZXR1cm4gdGhpcy5FYztpZih0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5LZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sS2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGhuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnJlc3VtZSYmdGhpcy5lYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LG5oOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMueGp8fHFiOyhmdW5jdGlvbihjKXtjLndqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy51aT0KITF9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9dGhpcy5nZXRQbGF5ZXIoKTthLmF1dG9zdGFydCYmIXRoaXMudWkmJih0aGlzLmcoKSx0aGlzLnVpPSEwLHRoaXMua2EoKSk7Yi5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLldnKCk/dGhpcy5EKCk6KHRoaXMueWV8fCh0aGlzLnllPTEpLHRoaXMueWUrKywxMDA8dGhpcy55ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMud2p8fHJiOyhmdW5jdGlvbihjKXtjLnlqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYT1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsCiIiLCEwKX1mb3IodmFyIGM9ITEsZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9bmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnlqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLmNwfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxLYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5qa3x8dWI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGZuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLm5hKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMucygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZm4odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMucygiZW1wdHkiKSx0aGlzLm5hKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5pa3x8dmI7KGZ1bmN0aW9uKGMpe2Mua2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmtrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1qPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5tanx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlNqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmtmPSExfSxLYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5ZbSgpfS5iaW5kKHRoaXMpLDUwMCl9LFltOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmtmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LFhuOmZ1bmN0aW9uKCl7dGhpcy5rZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuU2p8fHpiOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5IbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5IbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWG4oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuUmp8fEFiOyhmdW5jdGlvbihjKXtjLlRqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuVGp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLldtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Ranx8RWI7KGZ1bmN0aW9uKGMpe2MuUGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5rYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmJsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQmIoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55bSgpOnRoaXMudWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxibDpmdW5jdGlvbigpe3RoaXMuYmcoKXx8dGhpcy5nKCEwKX0seW06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7IWEubWEmJmEuViYmYS56cCYmYS5CcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHVnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLnMoKSx0aGlzLm5hKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVnKCl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oKXtpZighdGhpcy5EaClmb3IodmFyIGE9Yy5aYy5CYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5HYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5EaD1hW2VdKTtyZXR1cm4gdGhpcy5EaH0sVXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQmIoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuUGp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVms6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQmIoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlZrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQmI9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihsJiZsLnBsYXllcmFwaSYmKGE9bC5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLm1rPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ta3x8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sU3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLmdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx4YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYTtFPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmxmPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubGY9YS5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5sZiYmYyE9dGhpcy5sZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLiRwKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RT0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEUpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5qYT90aGlzLnFmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBFLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmFwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5hcHx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx4bjpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sWHA6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmthKCl9LmJpbmQodGhpcykpfSxyZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5yZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5zKCksdGhpcy5uYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2MuamF8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkFsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5BbHx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mub2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGduOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlNkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuU2QoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5TZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMub2t8fFJiOyhmdW5jdGlvbihjKXtjLm5rPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTWguYmluZCh0aGlzKSwxMCl9LGFjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy50az0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLnMoKTp0aGlzLmcoKSk6KHRoaXMudGt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LFpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmFjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5aZi5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5NaCgpO3RoaXMuWmYoKTt0aGlzLmtuKCl9LGtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5hYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5lbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5lbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmFjKGEpKX19KX0pKGMpO3ZhciBTYj1jLm5rfHxTYjsoZnVuY3Rpb24oYyl7Yy5waz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5nbigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMucGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm9sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5vbHx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuY2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5HaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5LbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seG46ZnVuY3Rpb24oKXt9LHJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx4YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkttfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlFkKGEpfS5iaW5kKHRoaXMpKX0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLkdoJiYodGhpcy5HaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuY2t8fE47KGZ1bmN0aW9uKGMpe2MuYms9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkJlKWlmKHRoaXMuR2J8fCh0aGlzLkdiPTApLHRoaXMuR2IrKywxNTx0aGlzLkdiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLktuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQmU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmJrfHxPOyhmdW5jdGlvbihjKXtjLmRrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2EuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucWYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLmRrfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5Ha3x8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5qaD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy52YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5LaD1lLktiKDEwKTt0aGlzLnJoKCl9LHJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm1hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5zYigpLCEwO3RoaXMuamgrKztpZigxMDx0aGlzLmpoKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmguYmluZCh0aGlzKSwxMDApLCExfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWE7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5pbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuaWx8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5qYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLlhvfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy54aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnhpfHxnYzsoZnVuY3Rpb24oYyl7Yy53aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnNlKCk7dGhpcy5wZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxxYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhfSxDYTpmdW5jdGlvbigpe3RoaXMudmE9ITA7dGhpcy5zKCJlbXB0eSB2YXN0Iil9LHBnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnMoKSx0aGlzLm5hKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX0sc2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMTApLHRoaXMucygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5zZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmthLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy53aXx8aGM7KGZ1bmN0aW9uKGMpe2MueWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxSYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmphP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlJhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5SYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuUGl8fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnNoPXRoaXMudWg9dGhpcy50aD0hMTt0aGlzLkRkPVtdO3RoaXMucGY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLktqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUmwoYSk6W10sYzt0aGlzLnVoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLnRoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLlNoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5wZil7aWYodGhpcy5zaClicmVhaztjPXRoaXMucGZbZF07dGhpcy5LZihjKSYmKHRoaXMuRGQucHVzaChjKSx0aGlzLlNoKGMpKX19LEtmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUmw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucGZbZF0sdGhpcy5LZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxTaDpmdW5jdGlvbihhKXt0aGlzLktmKGEpJiZhLmYoKX0sWm46ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLnRoKWZvcih0aGlzLnNoPSEwLGE9MDthPHRoaXMuRGQubGVuZ3RoO2ErKyl0aGlzLkRkW2FdLlJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRGRbYV0uUmIpfX19KShjKTt2YXIgbGM9Yy5Lanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5Ianx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsueG8pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuUG0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTsKdmFyIEc9bmV3IEgsbD0hMTtHLmZhKCk7Ry5vaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLm9oKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuT2cod2luZG93LEcuaW0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlhqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5Yanx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkhoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy55ZD0wO3RoaXMuYmI9IiI7dGhpcy5FZD0KW107dGhpcy5GZD0wO3RoaXMuSmg9ITE7dGhpcy5tZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy56aT1hO2EucHJvdG90eXBlPXtHbjpmdW5jdGlvbihhKXt0aGlzLkhoPWF9LHdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQm46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxBbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmptKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5vYSx0aGlzLm5iLm9mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5hbSgpKXRoaXMud24oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuYW8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wueW4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkdtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5UaChsKX19LGptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueWQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy55ZC5nZXRUaW1lKCksdGhpcy55ZD1hLDNFNTxjPyEwOiExO3RoaXMueWQ9YTtyZXR1cm4hMX0sUm46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS52ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5KZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxRbjpmdW5jdGlvbihhKXtpZighdGhpcy5IaCl7ZS52ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuR24oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sSmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuTm4odGhpcy5Rbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxKZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS52ZigibWlkcm9sbCIpO2lmKCF0aGlzLnhoKXt0aGlzLnhoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuRm4odGhpcy5KZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5aZSgpfSxmOmZ1bmN0aW9uKCl7dGhpcy5SbigpO3RoaXMucGxheWVyLlplJiZ0aGlzLm1uKCk7dGhpcy5ubigpfSxwbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkVkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5icChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRmQ9dGhpcy5FZC5sZW5ndGh9LGFtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkZkJiYoYT0hMCk7cmV0dXJuIGF9LAp3bjpmdW5jdGlvbihhKXt0aGlzLkpoPWE7Zm9yKGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdWyJmdW5jdGlvbiJdKHRoaXMuYm4uYmluZCh0aGlzKSl9LGJuOmZ1bmN0aW9uKGEpe3RoaXMuRmQtLTthJiZ0aGlzLm1mLnB1c2goYSk7MD49dGhpcy5GZCYmdGhpcy5KaCgpfSxHbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5tZi5sZW5ndGg7ZCsrKWM9dGhpcy5tZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy56aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnhsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoU2FlZ29vcGhJc29UaG9vRCxTYWVnb29waElzb1Rob29EKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
5.9.139.135 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.135.139.9.5.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/2006343101
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
Content-type
application/x-www-form-urlencoded

Response headers

Date
Fri, 15 Nov 2019 22:37:45 GMT
Server
TornadoServer/5.0
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
109
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=4ab0d7a7-cb9b-4c17-f3b6-646d458a0632&tv={c:u5a4cr,pingTime:-10,time:409,type:s,mvn:ZnNjPTEyLHNkPTMsbm89Nyxhc3A9MQ--,fsc:17.4.95v220002022020220000022002222000022220202020222220222220002222022002222200002220222022222222222000220200000022220222220222222222222202222222222222222222222222222222222222200000022022020020000002002202022022022222222000000000020222202022022222000000020000000000000000000002220002220000022200222202220022200200222022202220022222220020222222000220000222202222202222000002002002222222222220022202200022002220222202,sd:MTcuNC45NXYxMjAwfHwxNjAwfHwxfHwxfHwyNHx8MTIwMHx8MHx8MHx8MXx8bGFuZHNjYXBlLXByaW1hcnl8fDI0fHw0LzN8fDQvM3x8MHx8MTYwMA--,no:MTcuNC45NXZNb3ppbGxhfHxOZXRzY2FwZXx8bnx8MTZ8fG58fDB8fG58fExpbnV4IHg4Nl82NHx8R2Vja298fDIwMDMwMTA3fHwtNjB8fE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE0XzUpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NC4wLjM3MjkuMTY5IFNhZmFyaS81MzcuMzZ8fDF8fDF8fEdvb2dsZSBJbmMufHxu,asp:1573857466066||c96d00348236040a4b471abcee9e99d1||675c74d5f114ba25a49fb0f4cb02f70f||f392730a505a5a1096aa7eeed39422b3||23a1e94404c2ea615da1fb1e39ec2d9b||582a2258a03c404cff9a17f5afaa31eb||61bd4fcf33d02f0ae1070ad212ba3ce1||008f10441d9746584359b8fdb0db8957||1529428597}
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:46 GMT
X-Server-Name
dt12.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
/
track.adform.net/Serving/Cookie/
92 B
469 B
Script
General
Full URL
https://track.adform.net/Serving/Cookie/?adfaction=getjs;adfcookname=uid
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.23 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
0a6969c49df03c7da4755744082799bea4d11b57dbd474ee0a2bbedbe23ce178

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 15 Nov 2019 22:37:46 GMT
content-encoding
gzip
server
nginx
status
200
vary
Accept-Encoding
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate, no-transform
content-type
text/javascript; charset=utf-8
content-length
201
expires
-1
f9b17833-d68c-4e4d-b319-d6061d45aa9f
boot.pubstack.io/v1/tag/
1 KB
826 B
Script
General
Full URL
https://boot.pubstack.io/v1/tag/f9b17833-d68c-4e4d-b319-d6061d45aa9f
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.214.103.10 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-214-103-10.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
362c41409991f3be34623414782588fb949af5112629e468b52b400ca4c337a3

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
cache-control
max-age=120
content-encoding
gzip
content-length
714
content-type
application/javascript
content14_10_18m.js
vidstat.taboola.com/
37 KB
8 KB
Script
General
Full URL
https://vidstat.taboola.com/content14_10_18m.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/26_2_3/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
ab8bbbaf028510d8b119cce741f0c2cc94816dcc113d83cac81a6aade6a76fa9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
via
1.1 3ccfbae98f5816b531634c1e82e45259.cloudfront.net (CloudFront), 1.1 varnish
age
210630
x-cache
Hit from cloudfront, HIT
status
200
content-encoding
gzip
content-length
7638
x-served-by
cache-fra19151-FRA
last-modified
Sun, 14 Oct 2018 13:31:31 GMT
server
AmazonS3
x-timer
S1573857466.199900,VS0,VE0
etag
"d8d81221ec6e604811ce469d899c9c8b"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50
accept-ranges
bytes
x-amz-cf-id
Vs4TubaGEnCgigh3kN5-OJytJd-a8QzTxQCNFZg0hh5KVFK_O_tI7g==
x-cache-hits
492846
oppsula.js
vidstat.taboola.com/oppsula/1.3.6/
15 KB
5 KB
Script
General
Full URL
https://vidstat.taboola.com/oppsula/1.3.6/oppsula.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/26_2_3/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
6eeaa330e79de82579d573d85b1e62ee0017782c71406518af6b366b78c7981e

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
via
1.1 f96185b1d69d6f85635bc2b5554da639.cloudfront.net (CloudFront), 1.1 varnish
age
146487
x-cache
Hit from cloudfront, HIT
status
200
content-encoding
gzip
content-length
5174
x-served-by
cache-fra19151-FRA
last-modified
Sun, 24 Feb 2019 08:54:20 GMT
server
AmazonS3
x-timer
S1573857466.202743,VS0,VE0
etag
"9eef55ccd492389cc88aa5285cade680"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50
accept-ranges
bytes
x-amz-cf-id
uhaJsUkg4hXF1IiWZjxakv-aTXNBKcYYS7Jfn2_5QjDWGhm5qnKWew==
x-cache-hits
348835
OvaMediaPlayer.js
vidstat.taboola.com/vpaid/vPlayer/player/v10.5.1/
678 KB
180 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/vPlayer/player/v10.5.1/OvaMediaPlayer.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/26_2_3/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
9d8b62442d596122af5b70653d934ecfb957f5ab4d594d6d98f4ac5276ff8398

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
via
1.1 25c6baf0a31a5ef699c1e219b25ce7b9.cloudfront.net (CloudFront), 1.1 varnish
age
2015399
x-amz-meta-mtime
1571815487
x-cache
Hit from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
184119
x-served-by
cache-fra19151-FRA
last-modified
Wed, 23 Oct 2019 07:24:49 GMT
server
AmazonS3
x-timer
S1573857466.217568,VS0,VE0
etag
"e2d6c85d79d08e2311b928790db5fc47"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA6-C1
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
9LqlgAchnw2J1rxeoPum38t9MkSh-pBFGW-lqfw3a0NXiARfErIyxw==
x-cache-hits
245952
sync
match.taboola.com/ Frame F2CA
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7DfcCFgMauEugUItsDAQauEugUItsDAUAAAAGBvQHGzGizCakCWUxWg0Gs-FushgsN4vVcrcaTCHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3AhabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtfDgAAAAAPAEqF_RA_gAAAEQAAAAASAAAAABQBFf8WAhcAAAAAGAAFWD8aAFAcDOe6W192o8P1edn9AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA1VK7VvMI7tH9EVIBYxAgAAAAAkqnN42hSJ1QWVQAABOlWAFcAAAFucTcUMlm6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTYhozC0tiKWAV-0XEABg7RcQAIBN3QAA3gLggi4AVmcQk81oN5kdAAAAwN3___-_HsiMVo6Nw-MaDkaejcmzWjmMw5Fn4ls5TIvZyGXynt21hWn3nbN034iwzH7fQUE5PT1ml0HGcpkMaoGsaXL5DeKDhmE5GQTzm7DFaDWZbJbD2XIxGQxHw9FofwI3GuAEDYeDxW6w2C0Ww8liMhosBwsUiMEEJ2Q42kxWo91qN1kOJ6PRbDPZIEWrVrPRZjBczSaz3W41HAyXoxFStGYxm0wWs9FytxksJ6PBcDIcIkzuhpuZZeVc63Yj11o0G47cEodpsNaMLJOZy7McrSzDtej1MZ02xoXLs9yiYMDRXgQX6URzuvxdLstb87a4dU6fwyKWaE4W6UR22XdGK8fG4XENByPPxuRZrRzG4cgz8a0cpsVs5DL5m7vhZmZZOde63ci1Fs2GI7fEYRqsNSPLZObyLEcry3Aten1Mp41x4fIs943VbjNc7Uaz1b6x2m2Gq91ottp36Azf1edsVN60Co_MY3uWdLuZ06BwGSzen8S0mHZnB8_vd3SqVBeNsSH7JhRmg8dgUMQSwekinYhextNFLJE8LdKJZDJbrRarlXFiW65ctt1gsFgONy6XybAwbhyT4UQsUZou0ole97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtF_ceGGI3mutlcMVjONYNVAgAAAAAAAABYwpx5EwAAAIDTQBaLwWSxXAAIMdZdf-VRDm_uueTixo8h5nT5u1yWt-ZtceucPocB!&excid=22&docw=0&cijs=1
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/26_2_3/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
match.taboola.com
:scheme
https
:path
/sync?dast=V7DfcCFgMauEugUItsDAQauEugUItsDAUAAAAGBvQHGzGizCakCWUxWg0Gs-FushgsN4vVcrcaTCHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3AhabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtfDgAAAAAPAEqF_RA_gAAAEQAAAAASAAAAABQBFf8WAhcAAAAAGAAFWD8aAFAcDOe6W192o8P1edn9AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA1VK7VvMI7tH9EVIBYxAgAAAAAkqnN42hSJ1QWVQAABOlWAFcAAAFucTcUMlm6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTYhozC0tiKWAV-0XEABg7RcQAIBN3QAA3gLggi4AVmcQk81oN5kdAAAAwN3___-_HsiMVo6Nw-MaDkaejcmzWjmMw5Fn4ls5TIvZyGXynt21hWn3nbN034iwzH7fQUE5PT1ml0HGcpkMaoGsaXL5DeKDhmE5GQTzm7DFaDWZbJbD2XIxGQxHw9FofwI3GuAEDYeDxW6w2C0Ww8liMhosBwsUiMEEJ2Q42kxWo91qN1kOJ6PRbDPZIEWrVrPRZjBczSaz3W41HAyXoxFStGYxm0wWs9FytxksJ6PBcDIcIkzuhpuZZeVc63Yj11o0G47cEodpsNaMLJOZy7McrSzDtej1MZ02xoXLs9yiYMDRXgQX6URzuvxdLstb87a4dU6fwyKWaE4W6UR22XdGK8fG4XENByPPxuRZrRzG4cgz8a0cpsVs5DL5m7vhZmZZOde63ci1Fs2GI7fEYRqsNSPLZObyLEcry3Aten1Mp41x4fIs943VbjNc7Uaz1b6x2m2Gq91ottp36Azf1edsVN60Co_MY3uWdLuZ06BwGSzen8S0mHZnB8_vd3SqVBeNsSH7JhRmg8dgUMQSwekinYhextNFLJE8LdKJZDJbrRarlXFiW65ctt1gsFgONy6XybAwbhyT4UQsUZou0ole97I4DIfPX_BwHh5mv-bw8jgdZs9f8HAeHma3zmVxvYyWl93y8hjtLstb6_ecXna33m522l1uleXtNJ1eZrtF_ceGGI3mutlcMVjONYNVAgAAAAAAAABYwpx5EwAAAIDTQBaLwWSxXAAIMdZdf-VRDm_uueTixo8h5nT5u1yWt-ZtceucPocB!&excid=22&docw=0&cijs=1
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
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
cookie
t_gid=9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
server
nginx
content-type
text/html;charset=ISO-8859-1
machineid
3404
accept-ranges
bytes
date
Fri, 15 Nov 2019 22:37:46 GMT
via
1.1 varnish
x-served-by
cache-hhn4036-HHN
x-cache
MISS
x-cache-hits
0
x-timer
S1573857466.225579,VS0,VE9
st
convammp.taboola.com/
0
52 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=45&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7GloCFgMauEugUItsDAQauEugUItsDAUAAAAGBvQHGzGizCakCWUxWg0Gs-Fus1jsZsPBcjlaDWEjRpTZhDShLEarwWA23E0Wg-VmsVruVoMphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G7jQdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-zXHF4ep8Ps-QsezsPD7Na5LK6X0fKyW14eo91leWv9ntPL7tbbzU67y62yvJ2m08ts98sBAAAA4AFAqbAf4gcQACACAAAAQAIAAACAIqDi30LgAgAAAAADoADrRwMAioPhXHfry250uD4vuz8AAB4CQAAABhRIAAZwmkoAKnIOTgAAAAAAAAAAWP7___9jAPSIz2QAMpQGewAefAAeiAoQixgBAAAAQDK1eRxN6oTKogoAgCDdCuAKACDALe6GQiYMAACAYGyBHha_3-ywa_xulwEAAAAAAAAAmP2f_aMJEY25pQWxFPCq_QICAKz9AgIAsKkbAMBbAFzQBcDqDGKyGe0mswMAAAC4-____9cDmdHKsXF4XMPByLMxeVYrh3E48kx8K4dpMRu5TN6zu7Yw7b5zlu4bEZbZ7zsoKKenx-wyyFguk0EtkDVNLr9BfNAwLCeDYH4TthitJpPNcjhbLiaD4Wg4Gu1P4EYDnKDhcLDYDRa7xWI4WUxGg-VggQIxmOCEDEebyWq0W-0my-FkNJptJhukaNVqNtoMhqvZZLbbrYaD4XI0QorWLGaTyWI2Wu42g-VkNBhOhkOEyd1wM7OsnGvdbuRai2bDkVviMA3WmpFlMnN5lqOVZbgWvT6m08a4cHmWWxQMONqL4CKdaE6Xv8tleWveFrfO6XNYxBLNySKdyC77zmjl2Dg8ruFg5NmYPKuVwzgceSa-lcO0mI1cJn9zN9zMLCvnWrcbudai2XDkljhMg7VmZJnMXJ7laGUZrkWvj-m0MS5cnuW-sdpthqvdaLbaN1a7zXC1G81W-w6d4bv6nI3Km1bhkXlsz5JuN3MaFC6DxfuTmBbT7uzg-f2OTpXqojE2ZN-EwmzwGAyKWCI4XaQT0ct4uoglkqdFOpFMZqvVYrUyTmzLlcu2GwwWy-HG5TIZFsaNYzKciCVK00U60eteFofh8PkLHs7Dw-zXHF4ep8Ps-QsezsPD7Na5LK6X0fKyW14eo91leWv9ntPL7tbbzU67y62yvJ2m08tst6j_2BCj0Vw3mysGy7lmsEoAAAAAAAAAAEuYM28CAAAAcBrIYjGYLJYLACHGuuuvPMrhzT2XXNz4McScLn-Xy_LWvC1undPnMA!&cmcv=&pix=31589837&cb=1573857466193&uv=2623&tms=1573857466193&abt=expl_vA!gdpr_vB!rvf1_vA!ufm_vE&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1573857464364.1023!ts:1573857466193&
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857466.226716,VS0,VE9
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4036-HHN
st
convammp.taboola.com/
0
53 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=72&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7GloCFgMauEugUItsDAQauEugUItsDAUAAAAGBvQHGzGizCakCWUxWg0Gs-Fus1jsZsPBcjlaDWEjRpTZhDShLEarwWA23E0Wg-VmsVruVoMphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G7jQdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-zXHF4ep8Ps-QsezsPD7Na5LK6X0fKyW14eo91leWv9ntPL7tbbzU67y62yvJ2m08ts98sBAAAA4AFAqbAf4gcQACACAAAAQAIAAACAIqDi30LgAgAAAAADoADrRwMAioPhXHfry250uD4vuz8AAB4CQAAABhRIAAZwmkoAKnIOTgAAAAAAAAAAWP7___9jAPSIz2QAMpQGewAefAAeiAoQixgBAAAAQDK1eRxN6oTKogoAgCDdCuAKACDALe6GQiYMAACAYGyBHha_3-ywa_xulwEAAAAAAAAAmP2f_aMJEY25pQWxFPCq_QICAKz9AgIAsKkbAMBbAFzQBcDqDGKyGe0mswMAAAC4-____9cDmdHKsXF4XMPByLMxeVYrh3E48kx8K4dpMRu5TN6zu7Yw7b5zlu4bEZbZ7zsoKKenx-wyyFguk0EtkDVNLr9BfNAwLCeDYH4TthitJpPNcjhbLiaD4Wg4Gu1P4EYDnKDhcLDYDRa7xWI4WUxGg-VggQIxmOCEDEebyWq0W-0my-FkNJptJhukaNVqNtoMhqvZZLbbrYaD4XI0QorWLGaTyWI2Wu42g-VkNBhOhkOEyd1wM7OsnGvdbuRai2bDkVviMA3WmpFlMnN5lqOVZbgWvT6m08a4cHmWWxQMONqL4CKdaE6Xv8tleWveFrfO6XNYxBLNySKdyC77zmjl2Dg8ruFg5NmYPKuVwzgceSa-lcO0mI1cJn9zN9zMLCvnWrcbudai2XDkljhMg7VmZJnMXJ7laGUZrkWvj-m0MS5cnuW-sdpthqvdaLbaN1a7zXC1G81W-w6d4bv6nI3Km1bhkXlsz5JuN3MaFC6DxfuTmBbT7uzg-f2OTpXqojE2ZN-EwmzwGAyKWCI4XaQT0ct4uoglkqdFOpFMZqvVYrUyTmzLlcu2GwwWy-HG5TIZFsaNYzKciCVK00U60eteFofh8PkLHs7Dw-zXHF4ep8Ps-QsezsPD7Na5LK6X0fKyW14eo91leWv9ntPL7tbbzU67y62yvJ2m08tst6j_2BCj0Vw3mysGy7lmsEoAAAAAAAAAAEuYM28CAAAAcBrIYjGYLJYLACHGuuuvPMrhzT2XXNz4McScLn-Xy_LWvC1undPnMA!&cmcv=&pix=&cb=1573857466213&uv=2623&tms=1573857466213&abt=expl_vA!gdpr_vB!rvf1_vA!ufm_vE&ft=0&unm=FEED_MANAGER
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857466.226737,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4036-HHN
/
cx.atdmt.com/
Redirect Chain
  • https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
  • https://cx.atdmt.com/?c=11802502823519460259&f=AYyr4j2mdI5Ao6QbLsA8cYFTS9wl806bKsjTLwpn0NhllUOT0IAEbTg0MESGF8vLQKrPYvFgyUvHJZu9M4JonFO_&id=1773162896260346&l=3&v=0
42 B
406 B
Image
General
Full URL
https://cx.atdmt.com/?c=11802502823519460259&f=AYyr4j2mdI5Ao6QbLsA8cYFTS9wl806bKsjTLwpn0NhllUOT0IAEbTg0MESGF8vLQKrPYvFgyUvHJZu9M4JonFO_&id=1773162896260346&l=3&v=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:8004:face:b00c:0:8c , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
/
Resource Hash
6d8ba81d1b60a18707722a1f2b62dad48a6acced95a1933f49a68b5016620b93

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR CUR ADM DEV TAIo PSAo PSDo OUR BUS UNI PUR COM NAV INT DEM STA PRE OTC"

Redirect headers

pragma
no-cache
date
Fri, 15 Nov 2019 22:37:46 GMT
server
proxygen-bolt
status
302
content-type
text/plain
location
https://cx.atdmt.com/?c=11802502823519460259&f=AYyr4j2mdI5Ao6QbLsA8cYFTS9wl806bKsjTLwpn0NhllUOT0IAEbTg0MESGF8vLQKrPYvFgyUvHJZu9M4JonFO_&id=1773162896260346&l=3&v=0
cache-control
no-cache, no-store, must-revalidate
alt-svc
h3-23=":443"; ma=3600
content-length
0
expires
0
6801aee8-b7e8-4679-8728-0de0c2373375
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/6801aee8-b7e8-4679-8728-0de0c2373375
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda

Request headers

Sec-Fetch-Mode
no-cors
Accept-Encoding
identity;q=1, *;q=0
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
Range
bytes=0-

Response headers

Content-Range
bytes 0-1492/1493
Content-Length
1493
Content-Type
video/mp4
ec2f6fa4-eec8-427d-be64-098ff861b272
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/ec2f6fa4-eec8-427d-be64-098ff861b272
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda

Request headers

Sec-Fetch-Mode
no-cors
Accept-Encoding
identity;q=1, *;q=0
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
Range
bytes=0-

Response headers

Content-Range
bytes 0-1492/1493
Content-Length
1493
Content-Type
video/mp4
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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

x-amz-version-id
l7rX85QPBBoo6.Ijo6hDg0IGfcD14kv1
Content-Encoding
gzip
Last-Modified
Sun, 06 Oct 2019 22:55:03 GMT
Server
AmazonS3
x-amz-request-id
F400FF69F00615E8
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Fri, 15 Nov 2019 22:37:46 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
6ehEDhidFRch1WjWKfk7Q9UhOngjuYSCKHfN7dSV2F1PUcUPCXhKqPkRDC7radjVyC47AiTPt1w=
adex.js
dmp.theadex.com/d/285/5184/s/
39 KB
14 KB
Script
General
Full URL
https://dmp.theadex.com/d/285/5184/s/adex.js?ts=49722280
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.100 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
27fb6386870d840d410b95bcfc93a520f1ffa4f9534679ce876d322ac87ae5c8

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
content-encoding
gzip
last-modified
Tue, 12 Nov 2019 18:48:02 GMT
server
nginx
etag
W/"5dcafe62-9d2b"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Fri, 15 Nov 2019 22:42:46 GMT
ibb_map.js
bbcdn-bbnaut.ibillboard.com/library/
1 KB
1014 B
Script
General
Full URL
https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
194.213.222.30 Hrusovany u Brna, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn3.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 18:52:32 GMT
Server
ibillboard
Vary
Accept-Encoding, Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=604800
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Fri, 22 Nov 2019 12:18:56 GMT
default.js
ups.xplosion.de/loader/69511/
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/69511/default.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.e47a18ab412b5e2787f7246d7c533c93.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.73.164 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-73-164.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
text/javascript
content-length
1687
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
496 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=37477678&src.id=Stroeer
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.186.238.175 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
175.238.186.35.bc.googleusercontent.com
Software
Apache /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 15 Nov 2019 22:37:46 GMT
via
1.1 google
server
Apache
p3p
CP="NON DSP COR NID CURa PSAa PSDa OUR STP UNI COM NAV STA LOC OTC",policyref="/w3c/p3p.xml"
status
200
cache-control
no-cache, no-store, must-revalidate
content-type
image/gif;charset=UTF-8
alt-svc
clear
content-length
43
x-application-context
application
expires
Thu, 01 Jan 1970 00:00:00 GMT
match
pixel.consentric.de/tp/
43 B
354 B
Image
General
Full URL
https://pixel.consentric.de/tp/match?trackingId=5452496702549733768&partnerId=1200
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.138.221.190 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
aa03dc59bdca72631d2301e4297cfa030bd31b907dc138e7b973d12311c90a22
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:45 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Content-Type
image/gif
Access-Control-Allow-Origin
*
Cache-Control
private, no-cache, no-cache=Set-Cookie, proxy-revalidate
Content-Length
43
X-XSS-Protection
1; mode=block
monitoring.js
cdn.prod.pubstack.io/
61 KB
19 KB
XHR
General
Full URL
https://cdn.prod.pubstack.io/monitoring.js
Requested by
Host: boot.pubstack.io
URL: https://boot.pubstack.io/v1/tag/f9b17833-d68c-4e4d-b319-d6061d45aa9f
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.76.218 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
218.76.95.34.bc.googleusercontent.com
Software
UploadServer /
Resource Hash
413364272994992257eb29f54a63fd828220d3217d8cf955e57f4edb3a4e3402

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 21:50:19 GMT
content-encoding
gzip
age
2847
x-guploader-uploadid
AEnB2Urwxk9OX7W_jTrmuS4UWJ5UxvNGa1Vict8gBLL3m_AEJOOrcUoRCiOZLqMq7f_D-DSFpLQi6XtCusYAbujfRumMd7gyNA
x-goog-storage-class
STANDARD
status
200
x-goog-metageneration
2
x-goog-stored-content-encoding
gzip
alt-svc
clear
content-length
19109
last-modified
Thu, 07 Nov 2019 10:33:20 GMT
server
UploadServer
etag
"c99a31b57f67f7ef385a0bca9adb7bbe"
vary
Accept-Encoding
x-goog-hash
crc32c=tQKzsQ==, md5=yZoxtX9n9+84WgvKmtt7vg==
content-language
en
access-control-allow-origin
*
x-goog-generation
1573122800471985
access-control-expose-headers
Content-Length, Date, Server, Transfer-Encoding, X-GUploader-UploadID, X-Google-Trace
cache-control
public, max-age=3600
x-goog-stored-content-length
19109
accept-ranges
bytes
content-type
application/javascript
expires
Fri, 15 Nov 2019 22:50:19 GMT
player.css
vidstat.taboola.com/vpaid/vPlayer/player/v10.5.1/assets/
14 KB
3 KB
Stylesheet
General
Full URL
https://vidstat.taboola.com/vpaid/vPlayer/player/v10.5.1/assets/player.css
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/vPlayer/player/v10.5.1/OvaMediaPlayer.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
25d238eac82235b53958982f2d7c8db542d0c4b05ed49ccc8cfd9d1d56f38760

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
via
1.1 c05282a87474a55ae2a8dd2aa77d1233.cloudfront.net (CloudFront), 1.1 varnish
age
2015398
x-amz-meta-mtime
1571815488
x-cache
Hit from cloudfront, HIT
status
200
x-amz-meta-mode
33188
content-encoding
gzip
content-length
2454
x-served-by
cache-fra19151-FRA
last-modified
Wed, 23 Oct 2019 07:24:50 GMT
server
AmazonS3
x-timer
S1573857466.296429,VS0,VE0
etag
"06641339ce27ddb2d0da0bf718d4974a"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA6-C1
accept-ranges
bytes
content-type
text/css
x-amz-cf-id
ayN2pRvAGQOwzhKGT3LmxjKkIUVTHI1mbm6P9XVCUDcrvxxVFZNDCQ==
x-cache-hits
221095
player_options
vidanalytics.taboola.com/putes/
2 B
59 B
XHR
General
Full URL
https://vidanalytics.taboola.com/putes/player_options
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/vPlayer/player/v10.5.1/OvaMediaPlayer.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.9.12 /
Resource Hash
2689367b205c16ce32ed4200942b8b8b1e262dfc70d9bc9fbc77c49699a4f1df

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
text/plain;charset=UTF-8

Response headers

date
Fri, 15 Nov 2019 22:37:46 GMT
via
1.1 varnish
server
nginx/1.9.12
x-timer
S1573857466.313079,VS0,VE110
x-served-by
cache-fra19174-FRA
status
200
x-cache
MISS
content-type
text/plain; charset=utf-8
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
accept-ranges
bytes
content-length
2
x-cache-hits
0
st
convammp.taboola.com/
0
53 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=81&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7GloCFgMauEugUItsDAQauEugUItsDAUAAAAGBvQHGzGizCakCWUxWg0Gs-Fus1jsZsPBcjlaDWEjRpTZhDShLEarwWA23E0Wg-VmsVruVoMphBjLZTKoBRKW2e87KCinp8fsMshYLpNBLZA1TS6_G7jQdDp8rnu97ve765w-h13k8uteFofh8PkLHs7Dw-zXHF4ep8Ps-QsezsPD7Na5LK6X0fKyW14eo91leWv9ntPL7tbbzU67y62yvJ2m08ts98sBAAAA4AFAqbAf4gcQACACAAAAQAIAAACAIqDi30LgAgAAAAADoADrRwMAioPhXHfry250uD4vuz8AAB4CQAAABhRIAAZwmkoAKnIOTgAAAAAAAAAAWP7___9jAPSIz2QAMpQGewAefAAeiAoQixgBAAAAQDK1eRxN6oTKogoAgCDdCuAKACDALe6GQiYMAACAYGyBHha_3-ywa_xulwEAAAAAAAAAmP2f_aMJEY25pQWxFPCq_QICAKz9AgIAsKkbAMBbAFzQBcDqDGKyGe0mswMAAAC4-____9cDmdHKsXF4XMPByLMxeVYrh3E48kx8K4dpMRu5TN6zu7Yw7b5zlu4bEZbZ7zsoKKenx-wyyFguk0EtkDVNLr9BfNAwLCeDYH4TthitJpPNcjhbLiaD4Wg4Gu1P4EYDnKDhcLDYDRa7xWI4WUxGg-VggQIxmOCEDEebyWq0W-0my-FkNJptJhukaNVqNtoMhqvZZLbbrYaD4XI0QorWLGaTyWI2Wu42g-VkNBhOhkOEyd1wM7OsnGvdbuRai2bDkVviMA3WmpFlMnN5lqOVZbgWvT6m08a4cHmWWxQMONqL4CKdaE6Xv8tleWveFrfO6XNYxBLNySKdyC77zmjl2Dg8ruFg5NmYPKuVwzgceSa-lcO0mI1cJn9zN9zMLCvnWrcbudai2XDkljhMg7VmZJnMXJ7laGUZrkWvj-m0MS5cnuW-sdpthqvdaLbaN1a7zXC1G81W-w6d4bv6nI3Km1bhkXlsz5JuN3MaFC6DxfuTmBbT7uzg-f2OTpXqojE2ZN-EwmzwGAyKWCI4XaQT0ct4uoglkqdFOpFMZqvVYrUyTmzLlcu2GwwWy-HG5TIZFsaNYzKciCVK00U60eteFofh8PkLHs7Dw-zXHF4ep8Ps-QsezsPD7Na5LK6X0fKyW14eo91leWv9ntPL7tbbzU67y62yvJ2m08tst6j_2BCj0Vw3mysGy7lmsEoAAAAAAAAAAEuYM28CAAAAcBrIYjGYLJYLACHGuuuvPMrhzT2XXNz4McScLn-Xy_LWvC1undPnMA!&cmcv=&uv=2623&unm=FEED_MANAGER&cb=1573857466285&abt=expl_vA!gdpr_vB!rvf1_vA!ufm_vE&baseReportD=taboola.com&dataCenter=am&
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
via
1.1 varnish
server
nginx
x-timer
S1573857466.301445,VS0,VE8
x-cache
MISS
status
200
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-hhn4036-HHN
player_options
vidanalytics.taboola.com/putes/
2 B
219 B
XHR
General
Full URL
https://vidanalytics.taboola.com/putes/player_options
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/vPlayer/player/v10.5.1/OvaMediaPlayer.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.9.12 /
Resource Hash
2689367b205c16ce32ed4200942b8b8b1e262dfc70d9bc9fbc77c49699a4f1df

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
text/plain;charset=UTF-8

Response headers

date
Fri, 15 Nov 2019 22:37:46 GMT
via
1.1 varnish
server
nginx/1.9.12
x-timer
S1573857466.313056,VS0,VE57
x-served-by
cache-fra19174-FRA
status
200
x-cache
MISS
content-type
text/plain; charset=utf-8
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
accept-ranges
bytes
content-length
2
x-cache-hits
0
5210699470
api.yieldlove-ad-serving.net/v1/bl/4444/
2 B
205 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5210699470
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.29.86.7 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-29-86-7.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/5210699470
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
segments
api.theadex.com/v0.9/pub/
56 B
126 B
Script
General
Full URL
https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
Requested by
Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
89.163.159.123 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
content-length
56
content-type
text/plain; charset=utf-8
p.min.js
cdn.emetriq.de/adp/profiling/0.2.18/
5 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/69511/default.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20eb:ee00:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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, 24 Oct 2019 18:42:58 GMT
content-encoding
gzip
last-modified
Wed, 25 Sep 2019 11:08:07 GMT
server
AmazonS3
age
1914889
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
fTNde0ZXM.BzDu33z6pL5eJgKGxahMla
status
200
cache-control
max-age=31536000, no-transform, public
x-amz-cf-pop
FRA2-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
52KZAkt9CFzvKuB30l2sWIRl-CC6uJNV2qKGEdoExXJVDIrZt-SnGQ==
via
1.1 c7f7b4cf7fd5efe64bac95586db3f62b.cloudfront.net (CloudFront)
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=PayPal%20Geb%C3%BChrenrechner%3A%20Kosten%20online%20ermitteln&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=831c33358ecbd0f2ccffa910b98a4397&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=794604475324
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.73.164 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-73-164.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
83d4f5c4e13bb515a0ce09094f5d4c19f6ecd174a00086021a510717ff37b0d2

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
content-encoding
gzip
status
200
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
access-control-allow-origin
*
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
adrtxtag.min.js
cdn.adrtx.net/
840 B
848 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
63.34.92.224 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-34-92-224.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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, 06 Nov 2019 17:14:05 GMT
Content-Encoding
gzip
Last-Modified
Wed, 06 Nov 2019 17:11:02 GMT
Server
akka-http/10.1.9
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
usersync
uss.xplosion.de/ Frame C331
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBsJ0Ws_CWD_ABiUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4209665556643396968
42 B
662 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4209665556643396968
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.73.164 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-73-164.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"

Redirect headers

pragma
no-cache
date
Fri, 15 Nov 2019 22:37:46 GMT
server
nginx
status
307
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4209665556643396968
cache-control
no-store, no-cache, must-revalidate
access-control-allow-credentials
true
content-type
text/html; charset=utf-8
content-length
107
expires
0
activeview
pagead2.googlesyndication.com/pcs/ Frame 1D34
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsultlrkRoNHAzF1rzhCGD8Ll7SO66jNkpT1vs1uZCjpxh_5_qnacuSsSsd9Q9zBapH7leG9b9fUa6_Nb1dFq3K1I9Jrf1iRTLikTLSXcqY&sig=Cg0ArKJSzI5UedKnLwC1EAE&adk=2257154448&tt=-1&bs=1585%2C1200&mtos=1009,1009,1009,1009,1009&tos=1009,0,0,0,0&p=121,408,371,1178&cm=1&mcvt=1009&rs=0&ht=0&tfs=109&tls=1118&mc=1&lte=1&bas=0&bac=0&met=ce&avms=nio&exg=1&md=2&lm=2&rst=1573857465284&dlt&rpt=81&isd=0&msd=0&ext&imams=1&xdi=0&ps=1585%2C4569&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-5-10-4-9-9-0-0-0&tvt=1115&is=770%2C250&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&r=v&id=osdim&vs=4&uc=10&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191113
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 15 Nov 2019 22:37:46 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
activation
adstax-match.adrtx.net/ Frame DF15
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: cdn.adrtx.net
URL: https://cdn.adrtx.net/adrtxtag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.248.95.73 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-248-95-73.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash

Request headers

Host
adstax-match.adrtx.net
Connection
keep-alive
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
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Accept-Encoding
gzip, deflate, br
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Fri, 15 Nov 2019 22:37:46 GMT
P3P
CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Server
akka-http/10.1.9
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
error
intake.prod.pubstack.io/v1/intake/
0
57 B
XHR
General
Full URL
https://intake.prod.pubstack.io/v1/intake/error?sId=b090ce7b&c=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.125.71 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-125-71.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
application/json

Response headers

status
204
access-control-allow-origin
*
date
Fri, 15 Nov 2019 22:37:46 GMT
auction
intake.prod.pubstack.io/v1/intake/
0
57 B
XHR
General
Full URL
https://intake.prod.pubstack.io/v1/intake/auction?sId=b090ce7b&c=3
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.125.71 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-125-71.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Content-Type
application/json

Response headers

status
204
access-control-allow-origin
*
date
Fri, 15 Nov 2019 22:37:46 GMT
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=4ab0d7a7-cb9b-4c17-f3b6-646d458a0632&tv={c:u5a4mI,pingTime:1,time:1046,type:p,clog:[{piv:100,vs:i,r:,w:160,h:600,t:18}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1046,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1318.121.160.600,am:i,cc:1318.121.160.600,piv:100,obst:0,th:0,reas:,bkn:{piv:[1040~100],as:[1040~160.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:86,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754022|1h.346702-39754020,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:46 GMT
X-Server-Name
dt52.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=4ab0d7a7-cb9b-4c17-f3b6-646d458a0632&tv={c:u5a4mI,pingTime:1,time:1046,type:c,clog:[{piv:100,vs:i,r:,w:160,h:600,t:18}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1046,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1318.121.160.600,am:i,cc:1318.121.160.600,piv:100,obst:0,th:0,reas:,bkn:{piv:[1040~100],as:[1040~160.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:86,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754022|1h.346702-39754020,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0,metricId:forwrd1}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:46 GMT
X-Server-Name
dt55.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=301f1fa4-5802-8636-9560-d9f5832ac8bf&tv={c:u5a4pj,pingTime:1,time:1061,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1061,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:16,wc:0.0.1600.1200,ac:968.438.300.250,am:i,cc:968.438.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1056~100],as:[1056~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:174,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g.346702-39754022|1g1|1h*.346702-39754020,idMap:1h*,rend:0,renddet:WINDOW,rmeas:0}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:46 GMT
X-Server-Name
dt52.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=301f1fa4-5802-8636-9560-d9f5832ac8bf&tv={c:u5a4pk,pingTime:1,time:1062,type:c,clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1062,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:16,wc:0.0.1600.1200,ac:968.438.300.250,am:i,cc:968.438.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1057~100],as:[1057~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:174,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g.346702-39754022|1g1|1h*.346702-39754020,idMap:1h*,rend:0,renddet:WINDOW,rmeas:0,metricId:forwrd1}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:47 GMT
X-Server-Name
dt55.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
usersync
uss.xplosion.de/
42 B
662 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=831c33358ecbd0f2ccffa910b98a4397
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.73.164 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-73-164.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:46 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
activeview
pagead2.googlesyndication.com/pcs/ Frame 1CA2
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstkNMS1BBO4oYOnrX_8HjvTu7iJquTecmM6dn3gm4Usyq5r6RtDhMLM2WW-9PH59kFq42eot52wruywreQ9BpOxW7NdneB_qBcj3n_7lV4&sig=Cg0ArKJSzArFFeTA9RpOEAE&adk=2778923653&tt=-1&bs=1585%2C1200&mtos=1078,1078,1078,1078,1078&tos=1078,0,0,0,0&p=121,1318,721,1478&cm=1&mcvt=1078&rs=0&ht=0&tfs=125&tls=1203&mc=1&lte=1&bas=0&bac=0&met=ie&avms=nio&exg=1&md=2&lm=2&rst=1573857465557&dlt&rpt=225&isd=0&msd=0&ext&imams=1&xdi=0&ps=1585%2C4569&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-4-12-3-11-11-0-0-0&tvt=1201&is=160%2C600&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191113
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 15 Nov 2019 22:37:46 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame A60D
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsubCC5MMdDWe9jCBCQmLHdVL_K9aTdPoq0TaLSL7kBhq3k9MQlnbDrtW7LAwOq4p2bbjhxNQJwu31dphtHxV4XhgMUSZ3mw6GC9X7TEI-E&sig=Cg0ArKJSzCn6fJgHdJPEEAE&adk=1428895410&tt=-1&bs=1585%2C1200&mtos=1073,1073,1073,1073,1073&tos=1073,0,0,0,0&p=438,968,688,1268&cm=1&mcvt=1073&rs=0&ht=0&tfs=102&tls=1175&mc=1&lte=1&bas=0&bac=0&met=ie&avms=nio&exg=1&md=2&lm=2&rst=1573857465689&dlt&rpt=223&isd=0&msd=0&ext&imams=1&xdi=0&ps=1585%2C4569&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-5-12-2-11-11-0-0-0&tvt=1174&is=300%2C250&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Fspecials%2Fpaypal-gebuehrenrechner-kosten-online-ermitteln%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191113
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
date
Fri, 15 Nov 2019 22:37:47 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
5198271552
api.yieldlove-ad-serving.net/v1/bl/4444/
44 B
248 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5198271552
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.29.86.7 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-29-86-7.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
b2a27a31e9d34704f0c2adae8a77ce35e0bc3c352a40a682d89783142780c2f7

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Fri, 15 Nov 2019 22:37:47 GMT
x-powered-by
Express
etag
W/"2c-wDll0Jp0iexOSFL7+9AsyW9PVP8"
x-key
/bl/4444/5198271552
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
44
Cookie set showad.js
ads.pubmatic.com/AdServer/js/ Frame 1438
0
0
Document
General
Full URL
https://ads.pubmatic.com/AdServer/js/showad.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.180 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-180.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) /
Resource Hash

Request headers

Host
ads.pubmatic.com
Connection
keep-alive
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
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
Accept-Encoding
gzip, deflate, br
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

Last-Modified
Tue, 12 Nov 2019 06:59:02 GMT
ETag
"13006b6-97cd-59720c88c16d1"
Server
Apache/2.2.15 (CentOS)
Accept-Ranges
bytes
Content-Encoding
gzip
Set-Cookie
KTPCACOOKIE=YES; domain=.pubmatic.com; path=/; max-age=7776000;
P3P
CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC", CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC"
Content-Length
14515
Content-Type
text/html; charset=UTF-8
Cache-Control
public, max-age=168419
Expires
Sun, 17 Nov 2019 21:24:47 GMT
Date
Fri, 15 Nov 2019 22:37:48 GMT
Connection
keep-alive
Vary
Accept-Encoding
index.html
cdn.districtm.io/ids/ Frame 4D6F
0
0
Document
General
Full URL
https://cdn.districtm.io/ids/index.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.16.68.69 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

:method
GET
:authority
cdn.districtm.io
:scheme
https
:path
/ids/index.html
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
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
date
Fri, 15 Nov 2019 22:37:49 GMT
content-type
text/html
set-cookie
__cfduid=d8ff17a4ef0ed81c6d5941522dc90fbfc1573857468; expires=Sat, 14-Nov-20 22:37:48 GMT; path=/; domain=.districtm.io; HttpOnly
cf-cache-status
DYNAMIC
cache-control
s-maxage=1209600, max-age=14400
cf-ray
5364b63cc8fd978a-FRA
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
last-modified
Thu, 10 Jan 2019 16:50:48 GMT
strict-transport-security
max-age=31536000; includeSubDomains; preload
vary
Accept-Encoding
server
cloudflare
content-encoding
br
pd
eu-u.openx.net/w/1.0/ Frame C18F
Redirect Chain
  • https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
  • https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
0
0
Document
General
Full URL
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.167.1 /
Resource Hash

Request headers

:method
GET
:authority
eu-u.openx.net
:scheme
https
:path
/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
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
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
accept-encoding
gzip, deflate, br
cookie
i=f5a24b6e-469b-0fa3-020a-459a512ed82f|1573857468
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/

Response headers

status
200
vary
Accept
set-cookie
i=f5a24b6e-469b-0fa3-020a-459a512ed82f|1573857468; Version=1; Expires=Sat, 14-Nov-2020 22:37:48 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1573857468|mOgikimWiygu; Version=1; Expires=Sat, 30-Nov-2019 22:37:48 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.167.1
p3p
CP="CUR ADM OUR NOR STA NID"
date
Fri, 15 Nov 2019 22:37:48 GMT
content-type
text/html
content-length
592
via
1.1 google
alt-svc
clear

Redirect headers

status
302
set-cookie
i=f5a24b6e-469b-0fa3-020a-459a512ed82f|1573857468; Version=1; Expires=Sat, 14-Nov-2020 22:37:48 GMT; Max-Age=31536000; Domain=.openx.net; Path=/
server
OXGW/16.167.1
p3p
CP="CUR ADM OUR NOR STA NID"
location
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
date
Fri, 15 Nov 2019 22:37:48 GMT
content-length
0
via
1.1 google
alt-svc
clear
data
lb67.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb67.s400.meetrics.net/data?/cgK2HJOBALl1FDLkqFKtkyB23A52AwwA6wEylF0pFtlF2qoFx1A3zA41A30A20Az2A0hEhyB2iEjrFrwBpBFUkzFFCPBCAAAAAAABzSmAPAAAFAAzSmTTfPAPAAAJPA2GABTfPAZAAAOA55A55A85B55A58E55A55AGAx1A24A1xArTfPAPtBAJPA2GAHTfPAPAAAmUA5BAHbosAPNDAAZAwSAcAAAASksFeFjAAAAAAAAAAAAEAAAzSmAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA5wA4zAzxA41AGAkpFylFj0FAAAAIAy4A01AwzA31AKA1xA54Ay3Ax1A1yAJAylFj0FhuFnsFlBFKA1xA54Ay3Ax1A1yAKA1xA54Ay3Ax1A1yAzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPA2GAsEA6DAFAAATfPAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFgsiATA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.4.7 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h215.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:50 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Fri, 15-Nov-19 22:37:49 GMT
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=4ab0d7a7-cb9b-4c17-f3b6-646d458a0632&tv={c:u5a5pd,pingTime:5,time:5045,type:p,clog:[{piv:100,vs:i,r:,w:160,h:600,t:18}],es:0,sc:1,ha:1,gm:0,slTimes:{i:5045,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:17,wc:0.0.1600.1200,ac:1318.121.160.600,am:i,cc:1318.121.160.600,piv:100,obst:0,th:0,reas:,bkn:{piv:[5040~100],as:[5040~160.600]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:254,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754022|1h.346702-39754020,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:50 GMT
X-Server-Name
dt47.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=301f1fa4-5802-8636-9560-d9f5832ac8bf&tv={c:u5a5rQ,pingTime:5,time:5062,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:17}],es:0,sc:1,ha:1,gm:0,slTimes:{i:5062,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:16,wc:0.0.1600.1200,ac:968.438.300.250,am:i,cc:968.438.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[5058~100],as:[5058~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:178,fm:rHW1x7c+11|12|1311|1312|1313|14|151|16|1711|18|19|1a|1b|1c|1d|1e|1f|1g.346702-39754022|1g1|1h*.346702-39754020,idMap:1h*,rend:0,renddet:WINDOW,rmeas:0}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:51 GMT
X-Server-Name
dt47.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__iz=0&__id=1573857474780&__it=-60&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/specials/paypal-gebuehrenrechner-kosten-online-ermitteln/
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
Date
Fri, 15 Nov 2019 22:37:54 GMT
Last-Modified
Sat, 07 Nov 2009 22:36:48 GMT
Server
X/1.0
Content-Type
image/gif
Cache-Control
private, no-cache, no-store, proxy-revalidate, no-transform
Connection
keep-alive
Content-Length
35
Expires
Fri, 09 Nov 2012 22:36:48 GMT

Verdicts & Comments Add Verdict or Comment

330 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 string| cookieName function| getCookie function| setCookie object| smbContext object| LUX object| POST_META object| smbt object| smbadloader string| GoogleAnalyticsObject function| ga function| adLoader object| apstag object| _m6rq object| smbDmpTracking string| GIGA_AREA string| WP_SITEURL string| SHUTTLE_CORE_VIDEO_CDN_VIDEO_URL string| SHUTTLE_API_URL string| VIDEO_INLINE_MODE boolean| VIDEO_AUTOPLAY_DISABLED boolean| smbt_only function| requirejs function| require function| define object| DKUIM_SETTINGS object| is number| LUX_t_start number| LUX_t_end object| gaLog string| szmvars object| iom object| smbVideoService string| lazyLoadAmdUrl string| polyfillAmdUrl object| dependencies object| _absconfig object| pagespeed object| iam_data object| adsbygoogle object| google_tag_data object| gaplugins object| gaGlobal object| gaData object| dataLayer function| setImmediate function| clearImmediate boolean| apstagLOADED function| _extends function| _typeof string| type function| sdibgclick object| _ecoconf function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam function| setUpAgknTag object| cp2 object| google_js_reporting_queue number| google_srt object| google_ad_modifications object| google_logging_queue object| ggeac boolean| google_measure_js_timing object| googleToken object| googleIMState function| processGoogleToken object| google_reactive_ads_global_state boolean| _gfp_a_ object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad boolean| _gfp_p_ function| google_spfd number| google_lpabyc number| google_unique_id object| google_sv_map object| google_t12n_vars object| google_tag_manager object| nativendo_588f272a3e49c_conf object| google_optimize number| _m6rApiLoaded object| _econa function| send function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| __google_ad_urls number| google_global_correlator number| __google_ad_urls_id object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy boolean| google_osd_loaded boolean| google_onload_fired function| _ object| closure_memoize_cache_ object| _taboola object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| core function| pbjsYLHHChunk object| Criteo object| stroeerCore function| dummy function| log function| debug function| info function| warn function| error object| nativendo_pc function| NativendoV2 object| NativendoV2Loader object| nativendo object| nativendo_588f272a3e49c object| _m6rOnce number| _m6rContainerLoaded function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb object| TRC object| _tblConsole undefined| msg object| _comscore boolean| google_noFetch function| webpackJsonpdkuim object| Base64 boolean| dkuimInited function| $ function| jQuery function| isEmpty object| de_meetrics object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| OMSVad string| preloadType object| confiant function| __trcCopyProps function| __trcFromError function| __trcClientTimestamp function| __trcLog function| __trcError function| __trcDebug function| __trcInfo function| __trcWarn function| __trcDOMWalker function| __trcPurgeEventHandlers function| __trcJSONify function| __trcUnJSONify function| __trcGetMargins function| __trcAttachResize function| __trcDetachResize function| __trcTrim function| __trcGetElementsByClass function| __trcToArray function| __trcObjectCreate function| PageManager function| addHashParam object| params number| trc_debug_level string| trc_article_id object| TRCImpl number| taboola_view_id function| udm_ object| ns_p object| COMSCORE function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet object| nativendo_588f272a3e49c_map string| sdm_ift object| trcManager object| trcRbox object| options object| containers object| images function| stroeerCoreConnect object| cmTag function| startCMTagMain object| criteo_pubtag boolean| isCmTagFMOnPage string| category function| shuffle object| arrToUse object| travel object| news object| mobilecontent1 object| mobilecontent1_new object| travelmuted object| movietrailersHD object| movietrailersHDmuted object| widescreen object| movietrailerslight object| landscapeHD object| landscapeHDmuted object| blank object| blankblack object| blankblack7 object| blankblack5 object| blankblack_mob object| blankwhiteHDmpg object| blankblack10 object| blankwhite object| blankwhiteHD object| black_loader object| lightweight object| lightweight_single object| lightweight300600 object| bonnier object| home object| lipstick object| shoes object| art object| infiltrator object| glass object| lemurs object| NBAshoes object| Sunglasses object| Hummus object| Short_food object| Short_swim object| Euro_news object| Automoto_TV object| Uzoo object| SmartDuvet object| Tiger object| Chocolate object| Logan object| Jacket object| Bike object| Kanye object| Cancun object| Smartwatch object| Helicopter object| dogshampoo object| icetea object| charger object| blueysmoothie object| ShortContent object| carbsandwich object| pisatower object| Food1 object| Food2 object| Food3 object| Food4 object| Food5 object| Food6 object| Food7 object| Fashion object| Lifestyle1 object| Lifestyle2 object| Technology1 object| Technology2 object| Technology3 object| Entertainment object| Scrambledeggs object| Spinach object| Bub1 object| Pokemon object| style_hacks object| Motorcycle object| IceCracking object| Manatees object| Daiving object| Fishing_Lure object| Shark object| HundredsManatees object| TigerShark object| MandelaPrize object| Bertram35 object| bushfire object| Snow object| Delta object| Wheels object| Yellowfin object| Grip object| Kawasaki object| Yoga object| Cat object| Chickens object| RZR object| bitcoin object| bmw object| wombat object| koala object| Marsupial object| puppy object| bitcoinMuted object| bmwMuted object| Wallabies object| Bunny object| Pumpkins object| Dogs_Stress object| Dogs_Stress_image object| lightweight300600_short object| playlist function| webpackHotUpdate object| Adform string| vpaidId function| OvaMediaPlayer object| pbstck function| _h object| _adexc object| adex object| ibb_lib object| _EQLService object| _EQPScript object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr

36 Cookies

Domain/Path Name / Value
.openx.net/ Name: pd
Value: v2|1573857465|mOkimWiygu
.openx.net/ Name: i
Value: 4615e75b-2bda-0c41-2cbc-4ff773d27a60|1573857464
.ads.pubmatic.com/ Name: KCCH
Value: YES
.pubmatic.com/ Name: KADUSERCOOKIE
Value: 93441942-93A8-4186-90E3-A1D862DE825A
.adscale.de/ Name: ng
Value: 2#1188863686#26230957#0#d7~2&d10~1&d2~3&d4~1&d11~3&d8~2&d9~1&d12~2&d1~1&d3~3
.adscale.de/ Name: uu
Value: 6898c7d418424225bf66be962d28c288
.agkn.com/ Name: ab
Value: 0001%3AK%2BoIohEGFU3TV1Dg9j4Ba9gPoprY%2BsgBHcXJu2ftvkdWDN1Tv00PEw%3D%3D
.agkn.com/ Name: u
Value: C|0AEAlYeU5JWHlOQAAAAAAAg1RAQCADVIBAIA
.amazon-adsystem.com/ Name: ad-id
Value: A5jrvLFunk7jtSvKqSqa8lI
.giga.de/ Name: ioam2018
Value: 0015969c7bbd76f9a5dcf28b8:1600641464610:1573857464610:.giga.de:2:giga:software_content:noevent:1573857464610:tz47c7
.doubleclick.net/ Name: DSID
Value: NO_DATA
.giga.de/ Name: _gid
Value: GA1.2.1765026230.1573857465
.doubleclick.net/ Name: IDE
Value: AHWqTUn5aUinAIgzKORhBAXkmdDdgRyD2W8B4cjbyIa7IPwzKS3FNXtrSs-zKO5l
.m6r.eu/ Name: adscale
Value: 2019-11-15T22%3A37%3A45.125Z
.amazon-adsystem.com/ Name: ad-privacy
Value: 0
.m6r.eu/ Name: appnexus
Value: 2019-11-15T22%3A37%3A44.761Z
.ih.adscale.de/ Name: tu
Value: 4#1446753280#48~831c33358ecbd0f2ccffa910b98a4397~437182~0~0#101~~437182~437182~1#38~CAESEFZEXc9vGstVa1SDVOuNj0k~437182~0~0#39~c5875dcf-22df-4f00-9d88-34defa549765~437182~0~0#40~965a04f2-5ca1-4379-8870-af94751619bc~437182~0~0#42~5452496702549733768~437182~0~0#75~~437182~437182~1#108~~437182~437182~1#63~Xc8oublQJsMAAEnZFFkAAABY&1138~437182~0~0
.m6r.eu/ Name: yieldlab
Value: 2019-11-15T22%3A37%3A44.763Z
www.giga.de/ Name: smbVideoStickyAutoplay-GIGA
Value: 71
.m6r.eu/ Name: adx
Value: 2019-11-15T22%3A37%3A45.114Z
www.giga.de/ Name: trc_cookie_storage
Value: stroeer-smb-giga%253Asession-data%3Dv2_34e1cac580d3cd35ea88d3b7ea416ded_9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39_1573857465_1573857465_CNawjgYQrMVBGLGm3InnLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA%7Ctaboola%2520global%253Alocal-storage-keys%3D%255B%2522stroeer-smb-giga%253Asession-data%2522%252C%2522taboola%2520global%253Alspb%2522%252C%2522taboola%2520global%253Auser-id%2522%255D%7Ctaboola%2520global%253Alspb%3DCwsIQhCN3TwMCwiJARCN3TwMCwhMEI3dPAwLCI4BEI3dPAwLCJEBEI3dPAwLCCAQjd08DAsIJBCN3TwMCwhkEI3dPAwLCCcQjd08DAsILRCN3TwMCwg7EI3dPAwLCD0QrY48DAsIPxCN3TwMDBMU%7Ctaboola%2520global%253Auser-id%3D9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39
www.giga.de/ Name: _econa
Value: d60947d71dc6b8363d958031bdb4812c
www.giga.de/ Name: AWSELB
Value: E3417B491473CBC1A013199F961D4B7989B16A0E789908B003A63585868CC826DCDAEA2D2C8E458DA879EC40A407D1E05EAF40ABC859DCA74CDE137F32A2FD0284A29944C4
.giga.de/ Name: __gads
Value: ID=17db20f4174ca675:T=1573857465:S=ALNI_MZrQIz0JIMa3dO5ATsomqM4yW6AQA
.giga.de/ Name: _gat_gt1
Value: 1
www.giga.de/ Name: lux_uid
Value: 157385746459987419
.pubmatic.com/ Name: pi
Value: 156307:3
.m6r.eu/ Name: test
Value: true
.pubmatic.com/ Name: KTPCACOOKIE
Value: YES
www.giga.de/ Name: POPUPCHECK
Value: 1573943864611
.giga.de/ Name: _ga
Value: GA1.2.958900569.1573857465
.m6r.eu/ Name: id
Value: 831c33358ecbd0f2ccffa910b98a4397
www.giga.de/ Name: smb-session
Value: direct-1-default
www.giga.de/ Name: session_id
Value: 889f8d42-99d7-4956-a863-38cecd7c3080
.taboola.com/ Name: t_gid
Value: 9783f2e9-77d5-468d-ba40-3d22fe394e28-tuct4c8ae39
www.giga.de/ Name: variantATest
Value: 0

4 Console Messages

Source Level URL
Text
console-api log URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
starting version 20181002
console-api info URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
got title from meta
console-api debug URL: https://static.adsafeprotected.com/sca.17.4.95.js(Line 32)
Message:
a: 0.0009765625ms
console-api error (Line 1)
Message:
Pubstack.io // [object Object]

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.

15.taboola.com
aax-eu.amazon-adsystem.com
ads.pubmatic.com
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
ajax.googleapis.com
api.theadex.com
api.yieldlove-ad-serving.net
as-sec.casalemedia.com
bbcdn-bbnaut.ibillboard.com
bh.contextweb.com
bidder.criteo.com
boot.pubstack.io
bttrack.com
c.amazon-adsystem.com
c.nativendo.de
cdn-a.yieldlove.com
cdn.adrtx.net
cdn.districtm.io
cdn.emetriq.de
cdn.m6r.eu
cdn.prod.pubstack.io
cdn.speedcurve.com
cdn.stroeerdigitalmedia.de
cdn.taboola.com
cds.taboola.com
cm.g.doubleclick.net
confiant-integrations.global.ssl.fastly.net
convammp.taboola.com
cx.atdmt.com
d.agkn.com
d.nativendo.de
de-gmtdmp.mookie1.com
de.ioam.de
dkuim.de
dmp.theadex.com
dmx.districtm.io
dt.adsafeprotected.com
eu-u.openx.net
files.giga-video.de
fw.adsafeprotected.com
go.giga-abs.de
gocp.stroeermediabrands.de
googleads.g.doubleclick.net
hbopenbid.pubmatic.com
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
imprammp.taboola.com
intake.prod.pubstack.io
irqs.ioam.de
js.adscale.de
js.agkn.com
js.stroeermediabrands.de
lb67.s400.meetrics.net
m.exactag.com
match.adsrvr.org
match.taboola.com
maxcdn.bootstrapcdn.com
native.adscale.de
nugmw.userreport.com
orbidder.otto.de
pagead2.googlesyndication.com
pixel.consentric.de
pixel.rubiconproject.com
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
px.powerlinks.com
rtb.mfadsrvr.com
s3.eu-central-1.amazonaws.com
s400.mxcdn.net
sb.scorecardresearch.com
script.ioam.de
securepubads.g.doubleclick.net
si.nuggad.net
ssl-econa.met.vgwort.de
ssl.1.damoh.giga.de
ssl.2.damoh.giga.de
static.adsafeprotected.com
static.criteo.net
static.giga.de
sync.mathtag.com
t.nativendo.de
templates.stroeerdigital.de
tpc.googlesyndication.com
track.adform.net
tracking.m6r.eu
trc.taboola.com
u.ipw.metadsp.co.uk
ups.xplosion.de
uss.xplosion.de
vidanalytics.taboola.com
videos.giga.de
vidstat.taboola.com
www.dunkirkinception.com
www.facebook.com
www.giga.de
www.google-analytics.com
www.googletagservices.com
www.gstatic.com
www.storygize.net
x.bidswitch.net
xpl.theadex.com
yieldlove-d.openx.net
104.109.82.87
104.16.68.69
104.244.36.20
107.178.241.34
109.71.25.30
13.224.196.120
13.224.196.8
13.225.78.37
13.225.86.250
130.211.13.252
136.243.4.7
148.251.51.163
151.101.114.217
151.101.114.49
151.101.12.166
151.101.13.194
151.101.14.2
161.156.66.178
172.217.23.98
178.19.65.130
178.19.70.100
178.19.72.10
178.19.72.20
178.250.0.130
178.250.2.152
18.194.102.89
185.29.135.190
185.64.189.112
188.40.16.106
192.132.33.46
193.46.63.75
194.213.222.30
199.166.0.24
199.166.0.32
2.16.31.65
2.18.233.180
2.18.233.67
2.18.234.21
2.18.234.72
2001:4de0:ac19::1:b:2a
216.58.205.226
2600:9000:20eb:ee00:1c:8c89:a300:93a1
2600:9000:2156:c000:12:6213:9cc0:93a1
2600:9000:2156:e800:1f:a1b:34c0:93a1
2600:9000:21f3:3800:19:fc2c:a140:93a1
2600:9000:21f3:5c00:15:efbc:e300:93a1
2606:4700:20::6819:ac0d
2a00:1450:4001:809::200a
2a00:1450:4001:80b::2002
2a00:1450:4001:817::2002
2a00:1450:4001:818::2003
2a00:1450:4001:819::2001
2a00:1450:4001:81b::200e
2a00:1450:4001:81d::200a
2a00:1450:4001:820::2002
2a02:26f0:6c00:2bc::5f76
2a03:2880:f01c:8004:face:b00c:0:8c
2a03:2880:f11c:8183:face:b00c:0:25de
3.122.213.19
34.248.95.73
34.95.120.147
34.95.76.218
35.156.29.62
35.186.238.175
35.206.134.202
35.210.239.72
37.157.4.23
37.252.172.250
40.113.136.100
46.253.113.178
5.9.139.135
52.208.125.71
52.208.73.164
52.214.103.10
52.219.73.163
52.29.86.7
52.42.6.223
52.59.36.197
52.94.218.7
54.229.35.82
62.138.221.190
63.34.92.224
69.173.144.165
85.14.248.71
89.163.159.100
89.163.159.123
91.215.103.64
91.215.103.65
95.100.66.110
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
04a2ed057d9eeaf1414748f8ba8dedc4f83438cefb37081a334f70b0be931071
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844
0a6969c49df03c7da4755744082799bea4d11b57dbd474ee0a2bbedbe23ce178
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
149c8d10677f2f6979fa28c078cf832f575ee53c397d791b739e7c4c687fe7bc
1c3b2ef5bd8dd65a075f5e2e01b69421c16206237d55d600be9011b1cb29442f
1cd8e2130767f1a6bad26b4e3d5b60b2dee4e0e80feb160904fa45d4bba01c59
1cf2630bd915650cc9de60acc3dd011ea56516e07f68ac5cac7837b45821e932
1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
1f6ba59e0e4b96cbb3e07c3c5d908a62dae632d96714e50c6671cd1df32d1829
22628e59246bc809fbe231771381a62905ea6c689cf15d95125a5a75906a11ef
2487d1d9da384f4f793fb112f36af86a85293670abbb7b1d3b50d0dc8c4722ac
25d238eac82235b53958982f2d7c8db542d0c4b05ed49ccc8cfd9d1d56f38760
2689367b205c16ce32ed4200942b8b8b1e262dfc70d9bc9fbc77c49699a4f1df
27fb6386870d840d410b95bcfc93a520f1ffa4f9534679ce876d322ac87ae5c8
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c
362c41409991f3be34623414782588fb949af5112629e468b52b400ca4c337a3
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618
3dba93f65c632536a0fcba4dff71f82f7d6ae88b3a2814d82a1b1876558d79c1
3e4d1be0844caaeb371a4ca51bf7c4d887ecc91eebbb5a2e51d00ba8767b8d95
413364272994992257eb29f54a63fd828220d3217d8cf955e57f4edb3a4e3402
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
4479c9f0355574da9f9abd671579d7c0682862393faf87ff207545752d30a322
44d7369fc09a46365cbcb93654cf3c7bc4c9acb4a7f89e9ea398896656f427aa
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4d588963907bf497aa95ee590a91e2a00970801b85b4347994230099d86e62d9
505b170e929bca71e7fec8a2bff588459b60e1e9bc99e6f68443d29b3cd73335
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef
546390dabb77f8ffa37721249a74cd4ac7e117b65a2860d797821c14c16e3cab
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
56a110fa4752f768e35dbf197411e19faebf4c8eb59ee8545cc019dc61a1f0be
5b79f4faaf170a17eac256896c9b21be3d49ab4c9015fbd4e05ff5dd781eb158
5ed3ceb54a7225735cdd39256fa3566dfc0827732a4c7f12089d6fcc7a71dd82
5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda
62da83e0a6ff7bc7dd1c14ae65cdcbeedba860a3f9c9520064cc305a2bf0d626
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
69e942532f5c4b64fd68a98c15a62eb5d6fd6cb864282fa9a0c11ead2cdc9268
69f049c8296fa63b9a344f13a405b4f6e58432556da4b3e202af9788dae100ea
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992
6b19bb68671e24a3866de5ffad4ea66c810ea399538bafded765bb3b0c647bd6
6d5783f621f26ce9d9f954568ff21d24e8f6986910c05388a1f0098a939b38d4
6d8ba81d1b60a18707722a1f2b62dad48a6acced95a1933f49a68b5016620b93
6e8c25dacf0fdbe211487fce3530604424fa784604e8a7264a349ce1b57a7319
6eeaa330e79de82579d573d85b1e62ee0017782c71406518af6b366b78c7981e
70072788613bde80533a3cb95d5a16c924011004b1d861093610379370beb859
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847
73c5e50cb9776434e6748fe0624293f585aadecab3b2c0bea06b6afa3e6f2c6b
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
797d081d5d1cf52578e5286bb19c0d62adc09b0556171dcec2003b1e80bee59d
79ce82d4c778ade37fe234dacef1da7f0b510c5140bab394ed9faf6495c64c91
7ba19669fe546fea2ebab0aa2d803bb851d9530ecc45996aa08d1e2960079ac8
7ef74b1ad1f804099bed8427568f0f8df0364509a4cb024d4cfdb12a85af0929
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
82b0ce1e4e065950cc38896e1ca39abec1fdaea46823fd88394c24f0c987be11
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
83d4f5c4e13bb515a0ce09094f5d4c19f6ecd174a00086021a510717ff37b0d2
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
89b7e20cf73c5d61af4ae659c63f2eab235dd32a1dce673b5e6c3d47be59d6ef
8b2aa8c4b8f427191eea2b79bc69896ef382a2c45ea01abe3efaf4d9b340242b
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
8c832c688b6e9f37d0065e3ca18adebf2787d3791be4bd3fa2e71bcf4c4ce819
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0
8fcfc1b11efe36a9e89116d2a5e49bd86f2426bfc61032c3019ea790021f7e68
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
99129e2ded9b089496faf07cd01db4f88b131f81ddde8641bbd035a089bc6d0e
9cc497bc619324d17e01cd772c713cb796aeb0cd31a200a674dee1a96aab9d8d
9d8b62442d596122af5b70653d934ecfb957f5ab4d594d6d98f4ac5276ff8398
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
9f505e31c5589a466c4344fb5e4ade4c7c8ca3291dc1fc30f004df27bd38c4b0
a0166fe46c8c973fc2b03e65ebe5b1cc43cadffa32c64388dbb0c99a0eb26def
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a20b0dacacf786af5049ad45a52b917b98ab70f55fad958975e4497fcf85a5a2
aa03dc59bdca72631d2301e4297cfa030bd31b907dc138e7b973d12311c90a22
ab8bbbaf028510d8b119cce741f0c2cc94816dcc113d83cac81a6aade6a76fa9
ad1f6634283eb148dcac35d61100f05ee75811bf5983816785185976c8cb26b5
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
af9e05e18a2be5ae5a15505e259ae486da5030111e991c9d1bc5060fcd938221
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
b2a27a31e9d34704f0c2adae8a77ce35e0bc3c352a40a682d89783142780c2f7
b71ee50d2aefd4b9241ffd0a8a229552e4269cdb8ad05a4a097c8c72c3cdd05b
ba8a31dbe8e6a1c838c63c0ce99fa7e147570b5674f08d65b5dcfc5d979ef2b4
bdeed1e1c0751610c8f3dc2a5c78c93f841c366b36a7f7a54f5e6752c2656c05
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
c2c8bfa63d2daf183b2fd7d4a8e9959fdf5162caa2559ab12a587e809225d9e5
c76adeb0e2c9b27a1089106e5b66f2e8da525d22255020a39095c870a682f102
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d0fd74148f4cbe78bd0e6328dc5ce5955f0a0ecdb1eb2919da4a7e596ac65912
d1beb3953a4a78ab8ffc151a9ad4dc397f704a67bafba60dcc1126cdc2b6c6d5
d25de6a4ccc6e0327d210390aa123ca3cfb05665c52e6ed1d76e7410d7c05938
d725da6d0df682f9aafcd9904bb6dd43b9f60a3f05e55fb90aefa5b9775941c2
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913
d7c3238b2195fb180a902a65cbe1fbb8f174f042f9df4a0f31dc60ebadef26f3
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
da0b712ca2d9c1d56c96a96c3a2aabf1882a65c278834bb8d036a4c560f6979b
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b
dcfcc4bb74ea82e2469d755b15ea7ec0277d7e4a4db7b8aaeafc3d3afc9a4260
ddd5327bf80f2bf8d386cc77c9f71499c795640f8e046909effa581712c8ed4c
ddf90996ed1081a0229510f79c46dada68150fbf1cede51c7de2a0b7b30f813b
df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
e372b2913edcfa11e893b9e136525533f328b8bb8f32556d280b80441e0d006d
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e48f08b200b1d8a4054305847126d87a19219dfb882be603e9c3b30f4062a6bc
e55d4c6befec7b38f6bbbfbf4a6d821e1894b125814cb2b86eae646f98076e12
eca210371fbe17ddbfcfb8d878dabbf4b5904f334abdf1aecd5f593b94cb7bbb
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
eec9db5e24b3f9371bc50d3958500569c26db8f3a36d3c8bf5e0fb505cb80248
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f16ba37c4eacfc7f38a1a0de664a9e7e3b9e15b1215a20198f9161acaff3adc7
f2b586b6c1b604fceca3874a4af24cfd8eeaddb80ceba2aa183d0896e618c141
f623e1d423f85d8c36affb7faf68d0b804e0389e2621de2ea9eb97bb0df21c76
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
f6b9ce87b489624061f59fc26b2a1e7ef25238fac783c04df7c5e7e36cdbaf27
fbf38b1ee6fddd08f1aad56056b0a8950a6f72f593e5ff1a8220513cc35e8112