Submitted URL: http://arabshops.xyz/
Effective URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Submission: On March 16 via api from DE

Summary

This website contacted 71 IPs in 11 countries across 55 domains to perform 284 HTTP transactions. The main IP is 2606:4700:10::6814:d2f, located in United States and belongs to CLOUDFLARENET, US. The main domain is www.pcgameshardware.de.
TLS certificate: Issued by COMODO ECC Domain Validation Secure S... on December 6th 2019. Valid for: 6 months.
This is the only time www.pcgameshardware.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
2 2 2606:4700:303... 13335 (CLOUDFLAR...)
61 2606:4700:10:... 13335 (CLOUDFLAR...)
2 116.203.211.59 24940 (HETZNER-AS)
2 91.215.103.64 43407 (INFONLINE-AS)
2 2a02:26f0:10:... 20940 (AKAMAI-ASN1)
1 2 161.156.66.178 36351 (SOFTLAYER)
8 62.146.104.136 15598 (QSC-AG-IPX)
2 151.101.14.2 54113 (FASTLY)
2 4 2a00:1450:400... 15169 (GOOGLE)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
3 18 216.58.206.2 15169 (GOOGLE)
1 143.204.202.12 16509 (AMAZON-02)
2 92.122.254.186 16625 (AKAMAI-AS)
3 9 23.37.53.21 16625 (AKAMAI-AS)
1 1 2600:9000:21f... 16509 (AMAZON-02)
1 2600:9000:214... 16509 (AMAZON-02)
1 193.46.63.75 43407 (INFONLINE-AS)
1 2 91.215.103.65 43407 (INFONLINE-AS)
7 95.216.24.148 24940 (HETZNER-AS)
2 2a00:1450:400... 15169 (GOOGLE)
2 151.101.113.181 54113 (FASTLY)
2 6 23.11.238.95 16625 (AKAMAI-AS)
1 147.75.85.120 54825 (PACKET)
1 178.63.12.208 24940 (HETZNER-AS)
4 2a00:1450:400... 15169 (GOOGLE)
5 2a00:1450:400... 15169 (GOOGLE)
2 143.204.201.153 16509 (AMAZON-02)
10 52.28.163.206 16509 (AMAZON-02)
1 3 34.95.120.147 15169 (GOOGLE)
2 92.122.254.129 16625 (AKAMAI-AS)
2 185.86.139.58 201081 (SMARTADSE...)
2 23.61.243.29 16625 (AKAMAI-AS)
1 5 185.33.223.80 29990 (ASN-APPNEX)
2 185.64.189.112 62713 (AS-PUBMATIC)
2 104.16.68.69 13335 (CLOUDFLAR...)
1 178.250.0.165 44788 (ASN-CRITE...)
14 136.243.5.14 24940 (HETZNER-AS)
1 3 18.185.150.7 16509 (AMAZON-02)
8 23.60.16.116 16625 (AKAMAI-AS)
1 2a00:1450:400... 15169 (GOOGLE)
7 2a00:1450:400... 15169 (GOOGLE)
2 151.101.13.194 54113 (FASTLY)
2 52.216.178.5 16509 (AMAZON-02)
3 13.224.194.65 16509 (AMAZON-02)
3 12 35.190.94.1 15169 (GOOGLE)
23 2a00:1450:400... 15169 (GOOGLE)
2 69.173.144.140 26667 (RUBICONPR...)
3 146.148.127.183 15169 (GOOGLE)
1 2a02:2638::3 44788 (ASN-CRITE...)
7 185.22.221.117 60955 (WAVECON)
4 18.194.21.214 16509 (AMAZON-02)
2 144.76.12.56 24940 (HETZNER-AS)
3 18.185.214.82 16509 (AMAZON-02)
1 88.198.59.89 24940 (HETZNER-AS)
1 62.168.44.125 5588 (GTSCE GTS...)
3 151.101.13.108 54113 (FASTLY)
2 92.122.252.114 16625 (AKAMAI-AS)
1 23.37.55.184 16625 (AKAMAI-AS)
3 23.210.248.12 16625 (AKAMAI-AS)
2 72.247.225.182 16625 (AKAMAI-AS)
1 95.100.64.146 16625 (AKAMAI-AS)
1 37.157.6.246 198622 (ADFORM)
1 89.163.159.108 24961 (MYLOC-AS)
1 194.213.222.30 5588 (GTSCE GTS...)
2 54.171.36.151 16509 (AMAZON-02)
1 2600:9000:214... 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
1 13.224.194.82 16509 (AMAZON-02)
1 2600:9000:220... 16509 (AMAZON-02)
1 2600:9000:21f... 16509 (AMAZON-02)
1 34.253.51.81 16509 (AMAZON-02)
1 34.252.24.237 16509 (AMAZON-02)
284 71
Apex Domain
Subdomains
Transfer
64 pcgameshardware.de
www.pcgameshardware.de
extreme.pcgameshardware.de
player.pcgameshardware.de
ssl.2.damoh.pcgameshardware.de
ssl.1.damoh.pcgameshardware.de
2 MB
23 doubleclick.net
securepubads.g.doubleclick.net
stats.g.doubleclick.net
cm.g.doubleclick.net
googleads.g.doubleclick.net
121 KB
20 googlesyndication.com
tpc.googlesyndication.com
pagead2.googlesyndication.com
257 KB
14 meetrics.net
lb35.s400.meetrics.net
4 KB
14 yieldlove-ad-serving.net
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
api.yieldlove-ad-serving.net
1 KB
13 adscale.de
ih.adscale.de
js.adscale.de
gaa.adscale.de
44 KB
12 ad4m.at
ad4m.at
44 KB
10 googletagservices.com
www.googletagservices.com
274 KB
10 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
7 KB
9 onthe.io
cdn.onthe.io
tt.onthe.io
58 KB
8 adnxs.com
ib.adnxs.com
acdn.adnxs.com
5 KB
7 oadts.com
media.oadts.com
50 KB
6 teads.tv
a.teads.tv
t.teads.tv
sync.teads.tv
187 KB
6 scorecardresearch.com
sb.scorecardresearch.com
4 KB
5 computec.de
icdn.computec.de
503 KB
5 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
22 KB
4 pubmatic.com
hbopenbid.pubmatic.com
ads.pubmatic.com
186 B
4 google-analytics.com
www.google-analytics.com
36 KB
3 ad4mat.net
ad4mat.net
3 rubiconproject.com
fastlane.rubiconproject.com
eus.rubiconproject.com
3 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
61 KB
3 computecmedia.de
stats.computecmedia.de
3 KB
3 openx.net
yieldlove-d.openx.net
eu-u.openx.net
829 B
3 google.com
adservice.google.com
513 B
3 cxense.com
scdn.cxense.com
api.cxense.com
scomcluster.cxense.com
25 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
849 B
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 xplosion.de
ups.xplosion.de
4 KB
2 google.de
adservice.google.de
342 B
2 ibillboard.com
video-adserver.ibillboard.com
bbcdn-bbnaut.ibillboard.com
919 B
2 amazonaws.com
s3.amazonaws.com
1 KB
2 fastly.net
confiant-integrations.global.ssl.fastly.net
21 KB
2 districtm.io
dmx.districtm.io
cdn.districtm.io
468 B
2 yieldlab.net
ad.yieldlab.net
1 KB
2 smartadserver.com
prg.smartadserver.com
2 KB
2 casalemedia.com
as-sec.casalemedia.com
2 KB
2 amazon-adsystem.com
c.amazon-adsystem.com
28 KB
2 perfectmarket.com
widget.perfectmarket.com
32 KB
2 userreport.com
nugmw.userreport.com
sak.userreport.com
23 KB
2 mxcdn.net
s400.mxcdn.net
s385.mxcdn.net
50 KB
2 taboola.com
cdn.taboola.com
146 KB
2 vgwort.de
vg01.met.vgwort.de
777 B
2 arabshops.xyz
arabshops.xyz
686 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
582 B
1 theadex.com
dmp.theadex.com
14 KB
1 adform.net
track.adform.net
494 B
1 criteo.net
static.criteo.net
21 KB
1 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
343 B
1 googleapis.com
imasdk.googleapis.com
90 KB
1 criteo.com
bidder.criteo.com
152 B
1 google.be
adservice.google.be
778 B
1 nuggad.net
si.nuggad.net
618 B
1 yieldlove.com
cdn-a.yieldlove.com
92 KB
1 stroeerdigitalgroup.de
cdn.stroeerdigitalgroup.de
61 KB
284 55
Domain Requested by
49 www.pcgameshardware.de www.pcgameshardware.de
16 securepubads.g.doubleclick.net 1 redirects cdn.stroeerdigitalgroup.de
securepubads.g.doubleclick.net
www.pcgameshardware.de
14 lb35.s400.meetrics.net www.pcgameshardware.de
13 pagead2.googlesyndication.com www.pcgameshardware.de
js.adscale.de
pagead2.googlesyndication.com
securepubads.g.doubleclick.net
12 ad4m.at 3 redirects securepubads.g.doubleclick.net
ad4m.at
10 www.googletagservices.com securepubads.g.doubleclick.net
pagead2.googlesyndication.com
10 prod-ingestion.tracking.v2.yieldlove-ad-serving.net cdn-a.yieldlove.com
9 tracking.m6r.eu 3 redirects www.pcgameshardware.de
cdn.m6r.eu
7 media.oadts.com www.pcgameshardware.de
media.oadts.com
7 js.adscale.de securepubads.g.doubleclick.net
js.adscale.de
cdn.stroeerdigitalgroup.de
7 tpc.googlesyndication.com securepubads.g.doubleclick.net
pagead2.googlesyndication.com
tpc.googlesyndication.com
7 player.pcgameshardware.de www.pcgameshardware.de
player.pcgameshardware.de
text
7 tt.onthe.io cdn.onthe.io
6 sb.scorecardresearch.com 2 redirects cdn.taboola.com
www.pcgameshardware.de
widget.perfectmarket.com
5 ib.adnxs.com 1 redirects cdn-a.yieldlove.com
www.pcgameshardware.de
5 extreme.pcgameshardware.de www.pcgameshardware.de
5 icdn.computec.de www.pcgameshardware.de
www.google-analytics.com
player.pcgameshardware.de
4 api.yieldlove-ad-serving.net cdn-a.yieldlove.com
4 www.google-analytics.com 2 redirects www.pcgameshardware.de
player.pcgameshardware.de
3 a.teads.tv www.pcgameshardware.de
a.teads.tv
3 acdn.adnxs.com cdn-a.yieldlove.com
3 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 gaa.adscale.de js.adscale.de
3 ad4mat.net ad4m.at
3 hgc-cf-cache-1.svonm.com player.pcgameshardware.de
text
3 ih.adscale.de 1 redirects www.pcgameshardware.de
js.adscale.de
3 stats.computecmedia.de www.pcgameshardware.de
3 adservice.google.com securepubads.g.doubleclick.net
pagead2.googlesyndication.com
2 ups.xplosion.de cdn.stroeerdigitalgroup.de
cdn.emetriq.de
2 t.teads.tv www.pcgameshardware.de
2 eu-u.openx.net 1 redirects cdn-a.yieldlove.com
2 ads.pubmatic.com cdn-a.yieldlove.com
2 adservice.google.de pagead2.googlesyndication.com
2 cm.g.doubleclick.net 2 redirects
2 ssl.2.damoh.pcgameshardware.de text
2 fastlane.rubiconproject.com cdn-a.yieldlove.com
2 s3.amazonaws.com player.pcgameshardware.de
text
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 hbopenbid.pubmatic.com cdn-a.yieldlove.com
2 ad.yieldlab.net cdn-a.yieldlove.com
www.pcgameshardware.de
2 prg.smartadserver.com cdn-a.yieldlove.com
2 as-sec.casalemedia.com cdn-a.yieldlove.com
2 c.amazon-adsystem.com cdn-a.yieldlove.com
c.amazon-adsystem.com
2 widget.perfectmarket.com cdn.taboola.com
widget.perfectmarket.com
2 stats.g.doubleclick.net www.pcgameshardware.de
2 de.ioam.de 1 redirects www.pcgameshardware.de
2 cdn.taboola.com www.pcgameshardware.de
cdn.taboola.com
2 vg01.met.vgwort.de 1 redirects www.pcgameshardware.de
2 script.ioam.de www.pcgameshardware.de
player.pcgameshardware.de
2 cdn.onthe.io www.pcgameshardware.de
player.pcgameshardware.de
2 arabshops.xyz 2 redirects
1 adstax-match.adrtx.net cdn.adrtx.net
1 cdn.adrtx.net www.pcgameshardware.de
1 d.agkn.com js.agkn.com
1 cdn.emetriq.de ups.xplosion.de
1 sak.userreport.com nugmw.userreport.com
1 de-gmtdmp.mookie1.com
1 js.agkn.com cdn.stroeerdigitalgroup.de
1 bbcdn-bbnaut.ibillboard.com cdn.stroeerdigitalgroup.de
1 dmp.theadex.com cdn.stroeerdigitalgroup.de
1 track.adform.net cdn.stroeerdigitalgroup.de
1 sync.teads.tv a.teads.tv
1 eus.rubiconproject.com cdn-a.yieldlove.com
1 cdn.districtm.io cdn-a.yieldlove.com
1 video-adserver.ibillboard.com media.oadts.com
1 ssl.1.damoh.pcgameshardware.de text
1 static.criteo.net cdn-a.yieldlove.com
1 cdn.stroeerdigitalmedia.de www.pcgameshardware.de
1 imasdk.googleapis.com player.pcgameshardware.de
1 cdn.m6r.eu cdn.stroeerdigitalgroup.de
1 s385.mxcdn.net cdn.stroeerdigitalgroup.de
1 bidder.criteo.com cdn-a.yieldlove.com
1 dmx.districtm.io cdn-a.yieldlove.com
www.pcgameshardware.de
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 adservice.google.be securepubads.g.doubleclick.net
1 scomcluster.cxense.com www.pcgameshardware.de
1 api.cxense.com scdn.cxense.com
1 irqs.ioam.de script.ioam.de
1 nugmw.userreport.com www.pcgameshardware.de
1 si.nuggad.net 1 redirects
1 s400.mxcdn.net cdn.stroeerdigitalgroup.de
1 cdn-a.yieldlove.com cdn.stroeerdigitalgroup.de
1 scdn.cxense.com www.pcgameshardware.de
1 cdn.stroeerdigitalgroup.de www.pcgameshardware.de
284 84
Subject Issuer Validity Valid
ssl415893.cloudflaressl.com
COMODO ECC Domain Validation Secure Server CA 2
2019-12-06 -
2020-06-13
6 months crt.sh
*.onthe.io
Sectigo RSA Domain Validation Secure Server CA
2019-03-04 -
2020-05-02
a year crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
cdn.stroeerdigitalgroup.de
DigiCert Secure Site ECC CA-1
2020-02-13 -
2021-04-13
a year crt.sh
*.met.vgwort.de
Thawte RSA CA 2018
2018-05-22 -
2020-03-25
2 years crt.sh
icdn.computec.de
Let's Encrypt Authority X3
2020-03-04 -
2020-06-02
3 months crt.sh
f2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2020-03-03 -
2020-07-25
5 months crt.sh
*.google-analytics.com
GTS CA 1O1
2020-02-25 -
2020-05-19
3 months crt.sh
*.cxense.com
DigiCert SHA2 Secure Server CA
2020-03-11 -
2021-06-10
a year crt.sh
*.g.doubleclick.net
GTS CA 1O1
2020-02-25 -
2020-05-19
3 months 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
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
a year crt.sh
*.userreport.com
RapidSSL RSA CA 2018
2019-01-10 -
2021-03-10
2 years crt.sh
p.ssl.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-09-03 -
2021-02-22
a year crt.sh
*.scorecardresearch.com
Sectigo RSA Organization Validation Secure Server CA
2019-12-16 -
2020-12-25
a year crt.sh
*.google.be
GTS CA 1O1
2020-02-25 -
2020-05-19
3 months crt.sh
*.google.com
GTS CA 1O1
2020-02-25 -
2020-05-19
3 months crt.sh
c.amazon-adsystem.com
Amazon
2019-10-07 -
2020-09-29
a year crt.sh
*.tracking.v2.yieldlove-ad-serving.net
Amazon
2019-11-25 -
2020-12-25
a year crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years crt.sh
san.casalemedia.com
GeoTrust RSA CA 2018
2020-03-02 -
2021-04-01
a year crt.sh
*.smartadserver.com
DigiCert Global CA G2
2020-02-03 -
2022-02-03
2 years crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2020-02-04 -
2021-05-05
a year crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.pubmatic.com
Sectigo RSA Organization Validation Secure Server CA
2019-02-22 -
2021-02-21
2 years crt.sh
districtm.io
CloudFlare Inc ECC CA-2
2020-02-25 -
2020-10-09
7 months crt.sh
*.criteo.com
DigiCert ECC Secure Server CA
2019-12-05 -
2021-04-08
a year crt.sh
login.gamesaktuell.de
Let's Encrypt Authority X3
2020-03-04 -
2020-06-02
3 months crt.sh
meetrics.net
Let's Encrypt Authority X3
2020-03-05 -
2020-06-03
3 months crt.sh
*.adscale.de
Amazon
2019-07-03 -
2020-08-03
a year crt.sh
*.storage.googleapis.com
GTS CA 1O1
2020-02-25 -
2020-05-19
3 months crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2020-02-25 -
2020-05-19
3 months crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-12-18 -
2020-12-18
a year crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-11-09 -
2020-12-02
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
*.ad4m.at
AlphaSSL CA - SHA256 - G2
2017-09-13 -
2020-09-13
3 years crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.ad4mat.net
AlphaSSL CA - SHA256 - G2
2019-08-06 -
2021-09-08
2 years crt.sh
*.criteo.net
DigiCert ECC Secure Server CA
2019-12-03 -
2021-04-06
a year crt.sh
*.oadts.com
RapidSSL TLS RSA CA G1
2018-05-02 -
2020-06-30
2 years crt.sh
yieldlove-ad-serving.net
Amazon
2019-11-19 -
2020-12-19
a year crt.sh
ssl.1.damoh.pcgameshardware.de
Let's Encrypt Authority X3
2020-03-03 -
2020-06-01
3 months crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
cdn.adnxs.com
GlobalSign CloudSSL CA - SHA256 - G3
2019-05-16 -
2020-05-16
a year crt.sh
teads.tv
Let's Encrypt Authority X3
2020-01-08 -
2020-04-07
3 months crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2019-10-11 -
2021-10-10
2 years crt.sh
*.xplosion.de
Thawte RSA CA 2018
2020-01-08 -
2021-03-08
a year crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
*.mookie1.com
DigiCert SHA2 Secure Server CA
2020-02-21 -
2021-03-22
a year crt.sh
*.emetriq.de
RapidSSL RSA CA 2018
2020-02-13 -
2022-04-13
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh

This page contains 39 frames:

Primary Page: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Frame ID: 3B1AE0D02D16DA657E85B2C2DCBAEC4E
Requests: 184 HTTP requests in this frame

Frame: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Frame ID: FABB7D8EDBCB9EE1BA62AC753150DC28
Requests: 23 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssGqqt66R8V17pEZR1XY9FsIYxhtwNNspX-WX_1ffGyfvHtsvJGFIIEigBo41ai9pguFFTR0a-6y5kvm1bVeRa-bVV9ULp2DHGeNfF5D-6vSeg3_EZ0-vSA89W8TP1bBT4WN3SoOUaK05uPy8hQn_iijSdd47vMK_MQvtmJZF2Zv3BlA2GgN7qUrlNtFC_6xyFCRtup86a3tfTs9-Ztm2aNHXZW4ODaUITuUV7Y4Rz4tkIo1xujjTmW4Sr23kyARvdlQrIoGhLeD-z8Qpqylckh9GHowMGGolreqhIIcjcMkmC_Q9Znc552GrDUsvdDybOHk2whJLUz_aW09Q&sai=AMfl-YRORKCVshXqnl5BISwVe_Nk-r2bvw-8bZNaBCOp5buNholvQdNZXkYDR5QxsknAnbErD-dpgsRnjFWKa7Oi5KckVT_dGYy5HIL0eNo0&sig=Cg0ArKJSzKTRXmXgvH8iEAE&urlfix=1&adurl=
Frame ID: 3797D10CF56B8604A6FF7015A799A58C
Requests: 5 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstiWrjq5PVbpI1mAXkGreSB6faIeaxw-9dVmJ_feta_jGPx2qVIAZ_yHGURCVNnPsL6ARkgi8w6CtJ56qah_AX0DF4UvK_fGhsgN42jap8awzNQTQPMqcRMyi9Aq_5TfiTeB7kDzptsdX_qiHzZwiD3L4OzCqFKEui5TcgeESrkF5SCmURiOLDl7-XYLaaj2doQNK3YLR0cUpVDMFxTCkLyPzLAK8h3KvStYeQylzkP2cU0VQvLPLsi_M9D3gu9aTQqCX2If31gfyVWXAgUQ6ex5fG-CbYIwFZ5BsruFO-sjHLUkFIf6XR0zr3eOjZP8fUx7N4WjK7igjiOGcIl-w&sai=AMfl-YQXXRxj1D6Wgo42Qr6P2fFBhvzQLPGYGU6hV9mTp71sMkzZeoj-EnPOXxTAhEC1UkLB1r4sAF1ZwTabdH6k2HPsUyXXy1bJBS2_qpvB&sig=Cg0ArKJSzCW8znRydy4UEAE&urlfix=1&adurl=
Frame ID: C87035CCACA038C61A2D9DA194E2E9DA
Requests: 5 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsub0cgU-5IQ0HrHSqb4ueQP_ETdKpdl2A3Ebp1dL6Ia5gsWDtvcWuhlYZozzXA2GIKYJOO1fURk2WBItTq-ax4rWzXgePP6uext45Of12cBUGSPyE_6-OoIgRf1DaTBH1SoLG2m0k40EsEAkZDMEk1OU-Bt9tIarRV8cWO13ork5wU0rM2aTZcn-Ry1M_xncBaCENJ0qzuZLh13dSPxJZnlIKQka82yfdgp5F0OZxj8LWF04ysGb5t0wSA7mrX7jhAUso0-1aH_1UM2Ll5BtdZYx1weKVKJcWvS-JqmHBvSsn6U0Pg7GXfsJPmb3JxSQEXLMvMbFY9dbQEPGw&sai=AMfl-YQvbJU-3CnSrwnjasgw3UrGEKBBQ8E1q5aW0jo58MUiikrSueoF3Nt_h7nN8WUPG8opX2uVwGkO6ogwRSWcxgCOXz8uU4O9-nxUqUMD&sig=Cg0ArKJSzBZzpWoGX3TrEAE&urlfix=1&adurl=
Frame ID: 0E7906266527C1B61D36C13DEA8DDF86
Requests: 5 HTTP requests in this frame

Frame: https://ad4m.at/frame.html
Frame ID: 293C0B39B9EB8AEDB06987574F69116C
Requests: 1 HTTP requests in this frame

Frame: https://ad4m.at/frame.html
Frame ID: 134CF9FE020D8BEA1D8BBC17BDA43770
Requests: 1 HTTP requests in this frame

Frame: https://ad4m.at/frame.html
Frame ID: 343FC9B0B1191D093C34BF6070B52F50
Requests: 1 HTTP requests in this frame

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

Frame: https://ad4mat.net/frame.html
Frame ID: 71E7D56DA04381985488C36A04340857
Requests: 1 HTTP requests in this frame

Frame: https://ad4mat.net/frame.html
Frame ID: 6741FD1437E82035359F9F45F5A9411E
Requests: 1 HTTP requests in this frame

Frame: https://ad4mat.net/frame.html
Frame ID: 959FC9669877EF4083BC4BF85A154242
Requests: 1 HTTP requests in this frame

Frame: https://ad4m.at/ad/rar?a=15255%2C11198%2C15573&b=oneidMpmUzfrf1zRuWHEHGtDt2jpCkC4oneid__asuid0asuid__Stroeer_RON_728x90%2ConeidzK4SRfYfedYSpHBHMtqtz21UXCwoneid__asuid0asuid__Stroeer_RON_728x90%2ConeidPXJaBfbfDEQF9HjHbtMtK7xCYC9oneid__asuid0asuid__Stroeer_RON_728x90&f=oneid6k4aef3f6wmheHmHYtEC5kmtMC1oneid__asuid0asuid__Stroeer_RON_728x90%2Coneid8gQhDf8fk8qhgHJHEtqCkEdfACwoneid__asuid0asuid__Stroeer_RON_728x90%2ConeidbzwSQfZfeDVaYHbHzt8C1d8fjCJoneid__asuid0asuid__Stroeer_RON_728x90&c=728&d=90&e=&g=79b1afd827e3c037ebcda3728b628391%2F2146759660757302036&i=25174%2C20535%2C26474&j=16%2C16%2C41&k=0&l=0&m=0&n=&y=1&z=0
Frame ID: E620D34B6E9F75C39EBC0615CEB31375
Requests: 1 HTTP requests in this frame

Frame: https://ad4m.at/ad/rar?a=13525&b=oneidzK4SRfYf9RMapHBH8uqtzrQsXCwoneid__asuid0asuid__Stroeer_RON_300x250&f=oneid8gQhDf8fZ2zHgHJH3uqCkMKHACwoneid__asuid0asuid__Stroeer_RON_300x250&c=300&d=250&e=&g=97c231bad278c0aef7dc64f85de5fc9f%2F6607609293362353383&i=20612&j=16&k=0&l=0&m=0&n=&y=1&z=0
Frame ID: A2A7720265F29EBE001CA3338DCDACCD
Requests: 1 HTTP requests in this frame

Frame: https://ad4m.at/ad/rar?a=13516&b=oneidxRPFQfAfb3RSPHdH9uQtREQC1C6oneid__asuid0asuid__Stroeer_RON_160x600&f=oneidYz2Srf3f9YGtVH9H6ugCR5ZCQC1oneid__asuid0asuid__Stroeer_RON_160x600&c=160&d=600&e=&g=735bd80f6dbf1806ea624eb71cc01fdb%2F9088414369191691710&i=20612&j=16&k=0&l=0&m=0&n=&y=1&z=0
Frame ID: F07A54BA8B08466550273DB4CDFF3DC9
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssSKz4pENWgFeT90tz6xihHB3VAIHlHld0gxBQPpWCm7KnXFFcJQC7plEGi8ds7VvKwHXSSkY4ZxF1f18NAFerqAZVxAIfYt7KbOrX6hnxPVR2-a1zXTJ-6d5-b_ZndF0ju0TDzc4dX7p_AgBgOK3ltm1i0hk0lAZeZdpX3dRPMpf-eZumPHg4XboRsQD1dyPB2uhgG7ooZ2jilFq9Led1mGeKkLa5bwZqdPHxGZDZc6C1or3ZRAwG3bnDqwZPFfRElIN1Q9Xw0lmvXmQl-dzdlUDECKJ-dzbhxc5gbw0MjyPDzoNKRdr1aVi8&sig=Cg0ArKJSzEV_XLcCoQE-EAE&urlfix=1&adurl=
Frame ID: F616B57CF16713B9AF74FE7323AFC3D4
Requests: 7 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvU6RYEDuktOna34RoAk3cg3lU8KLf4YhSTQgEqsNBoBFPAeCYm_wOV4IFhXoiEzpBbgqcbvrEcestOVE_M6yKXLXVrrEUpU2f9ywfxwOiQkFmiA-0uGP_x0aTsAzXoAXPknHUWP8cZlhqv-AnnrDcxjtZchTurcKq8gyX5qPJKOsXMD9H0sX6JYgSwXhgbrmLnEaaEDiEBTn1930vTHMbXqPIzrCh4UUNYgnSK1S1TF021pXdBjfDgsFdX4TC_i4sXTUX9mzjrJx0v2YYdp4k0ezVExjlkGhew9lJ4n0qrm6aty2OCtzHOBoHqftrg9-M&sig=Cg0ArKJSzMeIDSrgf_tAEAE&urlfix=1&adurl=
Frame ID: 77A0D46D20E24EFF1E36E08FF0CC0C6D
Requests: 11 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssbQx3ZLLOdtE3PoIG7pOgN8NGCx4otsHfnnU_6SlT9EAct4jzkjQaeyZ4svvlD_BFF5QNPFulioUbqwWpV9179wBfifFzN2yMMcQxV5A1ajY9Y2iWOOzn1JnZ267RQZQc6ltl9-hxf5cIAPauXMF-HA6zHr4PYDV883-H1OolkwR6p1TyWnUuIdh3VBA-qLpLkI6TvFsMwxViVkwI5vLWH36DnS-H3AZDvACv64H9tJEZ7-xqWmzA0KJYyJfrXidcrpdyXPMvPsNRsdRg-fkC5MxWZPHmGqPaP4JUnZLKLi7Gy386GEZLjv9g&sig=Cg0ArKJSzAtpotZ2TGy6EAE&urlfix=1&adurl=
Frame ID: 4F2C59E10E0AF2751B20BFD23143A3DA
Requests: 5 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssvyKLNM_heuVS2FzlO4KN339NvQ-JYA6Chq7rFoOSEsNqqLEl1vt5hg2ZKmKceorqH1cINrV8asX1f5xOcwrAov0Gd2W9lfFLxdmpG0RebBoeB1MQc1VYj4v-0R1u0Dv6Z7Am5wsz0dHT1x31fO1eTvprhmYbHzaWiZRqm2EMIhfxWMxQffqATWPxDubeKaV39ihqj13pzdCuw4hBIQQGcLKn6Ri3LejMzSD320VjJDpRlx-jMDPLw2qmQ_rNEPCLz-AZ4kr2sh0vmDYAm7n5HMgs17myqIdq0JNvefCsa88xp0AWv2L1cgNE&sig=Cg0ArKJSzGcebjco6ozSEAE&urlfix=1&adurl=
Frame ID: BDABE76F5A83823EEEC361044FA751BC
Requests: 6 HTTP requests in this frame

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

Frame: https://pagead2.googlesyndication.com/pagead/show_ads.js
Frame ID: 2D0A4C89F9AE1C643FE61D0FE7C32E48
Requests: 8 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/show_ads.js
Frame ID: CE67E17690FEC2FB20DF0D5892A91797
Requests: 8 HTTP requests in this frame

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

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-8813347375005258&output=html&h=250&slotname=5657321521&adk=1821734436&adf=3530038685&w=300&guci=1.2.0.0.2.2.0.0&url=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1584389319510&bpp=16&bdt=31&fdt=56&idt=56&shv=r20200305&cbv=r20190131&ptt=5&saldr=sa&correlator=4330314914533&frm=23&ife=4&pv=2&ga_vid=344564226.1584389320&ga_sid=1584389320&ga_hid=1115592230&ga_fc=0&iag=15&icsg=170&nhd=2&dssz=5&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=848&ady=2940&biw=1585&bih=1200&isw=0&ish=0&ifk=3724966447&scr_x=0&scr_y=0&eid=44713363&oid=3&pvsid=3935956550367115&rx=0&eae=2&fc=640&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C0%2C0&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=1044&bc=31&ifi=1&uci=1.etqwj5vphiit&btvi=1&fsb=1&dtd=70
Frame ID: 05E3B7E4FB9BF73366289911EC622ECE
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-8813347375005258&output=html&h=250&slotname=5657321521&adk=1821734436&adf=3530038684&w=300&guci=1.2.0.0.2.2.0.0&url=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1584389319538&bpp=7&bdt=31&fdt=86&idt=86&shv=r20200305&cbv=r20190131&ptt=5&saldr=sa&correlator=4330314914533&frm=23&ife=4&pv=1&ga_vid=2006618431.1584389320&ga_sid=1584389320&ga_hid=595966684&ga_fc=0&iag=15&icsg=170&nhd=2&dssz=5&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&isw=0&ish=0&ifk=3724966447&scr_x=0&scr_y=0&oid=3&pvsid=2077835812915466&rx=0&eae=2&fc=640&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C0%2C0&vis=1&rsz=%7C%7CEr%7C&abl=CS&pfx=0&fu=1044&bc=31&ifi=1&uci=1.b6yteppaamj7&fsb=1&dtd=89
Frame ID: 8F25DBABD8A6008D8B00F3CEC4F0228F
Requests: 1 HTTP requests in this frame

Frame: https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Frame ID: 7764EC107AC8EB6396CF771EBDF42AA7
Requests: 1 HTTP requests in this frame

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

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

Frame: https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Frame ID: E4C9AFEC65F3D1712C6BE7CF67D4070F
Requests: 1 HTTP requests in this frame

Frame: https://ads.pubmatic.com/AdServer/js/showad.js
Frame ID: 9C2B07110036D58E22D0232C160F0FDD
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: 938F3FA71659642F16E878B28A7384D1
Requests: 1 HTTP requests in this frame

Frame: https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Frame ID: 659BFFD36CA2B79E68572CA3E27BB769
Requests: 1 HTTP requests in this frame

Frame: https://eus.rubiconproject.com/usync.html
Frame ID: DCA3F9421F3FC057D915F4FFC14AAA35
Requests: 1 HTTP requests in this frame

Frame: https://sync.teads.tv/iframe?pid=103521&userId=3c5eae62-4f38-422e-90bc-3004526caf03&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&fromFormat=true&env=js-web&1584389322185
Frame ID: 9508D328BCBEDE643D9FA409AC164514
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Frame ID: 5EA59FDD4DAC718265F35819C0AA6F95
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Frame ID: 399DC5F52184CFDD7607EAAF96F9E2D9
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Frame ID: EA14BA54CC1AAC177B2BEE6590BEF7BD
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=573868803&gdpr=&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F%22%2C%22gdpr%22%3A%22%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Frame ID: 2B9641CEF8C3DFB4413E0ACC15AC89AD
Requests: 1 HTTP requests in this frame

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

Screenshot


Page URL History Show full URLs

  1. http://arabshops.xyz/ HTTP 301
    https://arabshops.xyz/ HTTP 302
    https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-R... Page URL

Detected technologies

Overall confidence: 100%
Detected patterns
  • headers server /^cloudflare$/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

284
Requests

99 %
HTTPS

24 %
IPv6

55
Domains

84
Subdomains

71
IPs

11
Countries

4011 kB
Transfer

10138 kB
Size

3
Cookies

Page URL History

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

  1. http://arabshops.xyz/ HTTP 301
    https://arabshops.xyz/ HTTP 302
    https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 32
  • https://vg01.met.vgwort.de/na/d5d6a0d084c24736a53dc60d0ffae72c HTTP 302
  • https://vg01.met.vgwort.de/blank.gif
Request Chain 55
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 56
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=323749351&nuggtg=&nuggrid=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F HTTP 302
  • https://nugmw.userreport.com/rc-ap/a50c4aea-1a1c-4b59-9225-0fbb8df2380e/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=323749351&nuggtg=&nuggrid=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F
Request Chain 58
  • https://de.ioam.de/tx.io?st=gamworld&cp=c_pcgh_ArticlePage_TelekommunikationInternetdienste&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.pcgameshardware.de&xy=1600x1200x24&lo=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=000f&i2=000ff44cf303694245e6fdcc3&ep=1614308887&vr=416&id=sxnjyl&i3=000ff44cf303694245e6fdcc3%3A1613160515561%3A1584389315561%3A.pcgameshardware.de%3A1%3Agamworld%3Ac_pcgh_ArticlePage_TelekommunikationInternetdienste%3Anoevent%3A1584389315561&n1=1&dntt=0&lt=1584389315564&ev=&cs=iqlzx0&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=gamworld&cp=c_pcgh_ArticlePage_TelekommunikationInternetdienste&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.pcgameshardware.de&xy=1600x1200x24&lo=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=000f&i2=000ff44cf303694245e6fdcc3&ep=1614308887&vr=416&id=sxnjyl&i3=000ff44cf303694245e6fdcc3%3A1613160515561%3A1584389315561%3A.pcgameshardware.de%3A1%3Agamworld%3Ac_pcgh_ArticlePage_TelekommunikationInternetdienste%3Anoevent%3A1584389315561&n1=1&dntt=0&lt=1584389315564&ev=&cs=iqlzx0&mo=1&sr=71
Request Chain 64
  • https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=1796390970&t=pageview&_s=1&dl=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&ul=en-us&de=UTF-8&dt=iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=YEBAAEAB~&jid=348972104&gjid=1628207933&cid=766020357.1584389316&tid=UA-1536541-2&_gid=1542115608.1584389316&_r=1&cd1=desktopskin&cd3=1600&cd4=267940&cd5=0&z=750171865 HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1536541-2&cid=766020357.1584389316&jid=348972104&_gid=1542115608.1584389316&gjid=1628207933&_v=j81&z=750171865
Request Chain 108
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1584389315950&ns_c=UTF-8&cv=3.5&c8=iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM&c7=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&c9= HTTP 302
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1584389315950&ns_c=UTF-8&cv=3.5&c8=iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM&c7=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&c9=
Request Chain 168
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvNv4Q3IYGBcE-i_q68n_uCgOPzjHmob9WfIwEZ1hJDR9SoysVJA38hKCCuSP9DE4GzZ8vsfOzDTpVWhMSgon1ZDITYSv3-5RCMniVUKlKsVUKWm_R9p_plZ6HYlFonEfQKnZeD6b5kvTUYqlZHPOW9eXJFkdhReaKF7vvxooZjJrg43_VJaWRInhm7-uF6fCeYNfBo2udSaRiVCZTt756aiRMjvqojjzKT30oqlVAfwGCt0UpFTmz_d0lSzgmlz7DgU-QJLBX9GaQcoL1eUpyyyFr8BAPT7P50kounGtUZxBHYs99-RXZkMPSwew&sig=Cg0ArKJSzDHy61mdE43BEAE&urlfix=1&adurl=//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif HTTP 302
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Request Chain 174
  • https://ad4m.at/rs?a=&b=40&c=680&d=&e=728&f=90&g=0&h=Stroeer_RON_728x90&i=&j=1065&k=1&l=&m=&n=&o=0&p=0 HTTP 307
  • https://ad4m.at/ad/rar?a=15255%2C11198%2C15573&b=oneidMpmUzfrf1zRuWHEHGtDt2jpCkC4oneid__asuid0asuid__Stroeer_RON_728x90%2ConeidzK4SRfYfedYSpHBHMtqtz21UXCwoneid__asuid0asuid__Stroeer_RON_728x90%2ConeidPXJaBfbfDEQF9HjHbtMtK7xCYC9oneid__asuid0asuid__Stroeer_RON_728x90&f=oneid6k4aef3f6wmheHmHYtEC5kmtMC1oneid__asuid0asuid__Stroeer_RON_728x90%2Coneid8gQhDf8fk8qhgHJHEtqCkEdfACwoneid__asuid0asuid__Stroeer_RON_728x90%2ConeidbzwSQfZfeDVaYHbHzt8C1d8fjCJoneid__asuid0asuid__Stroeer_RON_728x90&c=728&d=90&e=&g=79b1afd827e3c037ebcda3728b628391%2F2146759660757302036&i=25174%2C20535%2C26474&j=16%2C16%2C41&k=0&l=0&m=0&n=&y=1&z=0
Request Chain 175
  • https://ad4m.at/rs?a=&b=39&c=680&d=&e=300&f=250&g=0&h=Stroeer_RON_300x250&i=&j=1065&k=1&l=&m=&n=&o=0&p=0 HTTP 307
  • https://ad4m.at/ad/rar?a=13525&b=oneidzK4SRfYf9RMapHBH8uqtzrQsXCwoneid__asuid0asuid__Stroeer_RON_300x250&f=oneid8gQhDf8fZ2zHgHJH3uqCkMKHACwoneid__asuid0asuid__Stroeer_RON_300x250&c=300&d=250&e=&g=97c231bad278c0aef7dc64f85de5fc9f%2F6607609293362353383&i=20612&j=16&k=0&l=0&m=0&n=&y=1&z=0
Request Chain 176
  • https://ad4m.at/rs?a=&b=38&c=680&d=&e=160&f=600&g=0&h=Stroeer_RON_160x600&i=&j=1065&k=1&l=&m=&n=&o=0&p=0 HTTP 307
  • https://ad4m.at/ad/rar?a=13516&b=oneidxRPFQfAfb3RSPHdH9uQtREQC1C6oneid__asuid0asuid__Stroeer_RON_160x600&f=oneidYz2Srf3f9YGtVH9H6ugCR5ZCQC1oneid__asuid0asuid__Stroeer_RON_160x600&c=160&d=600&e=&g=735bd80f6dbf1806ea624eb71cc01fdb%2F9088414369191691710&i=20612&j=16&k=0&l=0&m=0&n=&y=1&z=0
Request Chain 229
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=406234227e2a1d846150e4fae9b08605&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D406234227e2a1d846150e4fae9b08605%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=406234227e2a1d846150e4fae9b08605&userId=adscale-user:200cff74ec9843a392936e21733824be
Request Chain 230
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=406234227e2a1d846150e4fae9b08605 HTTP 307
  • https://ib.adnxs.com/bounce?%2Fsetuid%3Fentity%3D197%26code%3D406234227e2a1d846150e4fae9b08605
Request Chain 231
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=QGI0In4qHYRhUOT66bCGBQ HTTP 302
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=QGI0In4qHYRhUOT66bCGBQ&google_tc= HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 232
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=406234227e2a1d846150e4fae9b08605
Request Chain 252
  • 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
Request Chain 260
  • https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1584389322059&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=16311930&cs_ucfr=1 HTTP 302
  • https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1584389322059&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=16311930&cs_ucfr=1
Request Chain 265
  • https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=1796390970&t=event&_s=2&dl=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&ul=en-us&de=UTF-8&dt=iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=unbounce&ea=10_sec&_u=aEBAAEAB~&jid=854485460&gjid=1164420051&cid=766020357.1584389316&tid=UA-1536541-2&_gid=1542115608.1584389316&_r=1&cd1=desktopskin&cd3=1600&cd4=267940&cd5=0&z=568947992 HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1536541-2&cid=766020357.1584389316&jid=854485460&_gid=1542115608.1584389316&gjid=1164420051&_v=j81&z=568947992

284 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Redirect Chain
  • http://arabshops.xyz/
  • https://arabshops.xyz/
  • https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
126 KB
33 KB
Document
General
Full URL
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
2facbbc2ee5282ff79b27064db583dba5ab6fc3d98d0c04544b618be3ca364fe
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

:method
GET
:authority
www.pcgameshardware.de
:scheme
https
:path
/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
none
sec-fetch-mode
navigate
sec-fetch-user
?1
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Mon, 16 Mar 2020 20:08:35 GMT
content-type
text/html;charset=UTF-8
set-cookie
__cfduid=d1e11530816c75d7e9e56336c503018881584389315; expires=Wed, 15-Apr-20 20:08:35 GMT; path=/; domain=.pcgameshardware.de; HttpOnly; SameSite=Lax cfid=a0ad4982-5af7-485f-b421-7529bc66e453;Path=/;Expires=Sun, 05-Apr-2020 21:46:39 UTC;HTTPOnly cftoken=0;Path=/;Expires=Sun, 05-Apr-2020 21:46:39 UTC;HTTPOnly CPTBP=7799795;Path=/;Domain=pcgameshardware.de
x-ua-compatible
IE=edge
cache-control
max-age=0
expires
Mon, 16 Mar 2020 20:08:35 GMT
x-clacks-overhead
GNU Terry Pratchett
cf-cache-status
DYNAMIC
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
server
cloudflare
cf-ray
57511b62bd52d6d9-FRA
content-encoding
br
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400

Redirect headers

status
302
date
Mon, 16 Mar 2020 20:08:34 GMT
content-type
text/html; charset=UTF-8
set-cookie
__cfduid=da6e436c0f4f69e59bf843c45475e9aa11584389314; expires=Wed, 15-Apr-20 20:08:34 GMT; path=/; domain=.arabshops.xyz; HttpOnly; SameSite=Lax; Secure
location
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
cf-cache-status
DYNAMIC
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server
cloudflare
cf-ray
57511b612f343244-FRA
lato-v16-latin-ext-300italic.woff
www.pcgameshardware.de/commoncfm/fonts/
23 KB
24 KB
Font
General
Full URL
https://www.pcgameshardware.de/commoncfm/fonts/lato-v16-latin-ext-300italic.woff
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
bf1616bb71ecd23e8b4165960645fc704c08e37f097ad8f85b7a086d1dcf27de
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
1743427
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Tue, 26 Nov 2019 15:56:32 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/font-woff
access-control-allow-origin
*
cache-control
max-age=2592000
cf-ray
57511b64db6ed6d9-FRA
expires
Thu, 26 Mar 2020 15:51:28 GMT
lato-v16-latin-ext-400italic.woff
www.pcgameshardware.de/commoncfm/fonts/
31 KB
31 KB
Font
General
Full URL
https://www.pcgameshardware.de/commoncfm/fonts/lato-v16-latin-ext-400italic.woff
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
c97815ad3bf836134238414d63b74f94b80dcf4c82f0f3b33c80bf82e0cb566b
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
1743427
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Tue, 26 Nov 2019 15:56:32 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/font-woff
access-control-allow-origin
*
cache-control
max-age=2592000
cf-ray
57511b64db6fd6d9-FRA
expires
Thu, 26 Mar 2020 15:51:28 GMT
lato-v16-latin-ext-300.woff
www.pcgameshardware.de/commoncfm/fonts/
31 KB
31 KB
Font
General
Full URL
https://www.pcgameshardware.de/commoncfm/fonts/lato-v16-latin-ext-300.woff
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
6b4d0c29444c24800b5b71791e9648490288e23163cb48b64b03ec6c6fd5ab24
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
1462270
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Tue, 26 Nov 2019 15:56:32 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/font-woff
access-control-allow-origin
*
cache-control
max-age=2592000
cf-ray
57511b64db70d6d9-FRA
expires
Sun, 29 Mar 2020 21:57:25 GMT
lato-v16-latin-ext-400.woff
www.pcgameshardware.de/commoncfm/fonts/
30 KB
30 KB
Font
General
Full URL
https://www.pcgameshardware.de/commoncfm/fonts/lato-v16-latin-ext-400.woff
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
8badcd604652360c68c0677ba0772d2973f2cfe293b5679fec3d1d63018d396e
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
142838
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Tue, 26 Nov 2019 15:56:32 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/font-woff
access-control-allow-origin
*
cache-control
max-age=2592000
cf-ray
57511b64eb72d6d9-FRA
expires
Tue, 14 Apr 2020 04:27:57 GMT
lato-v16-latin-ext-700.woff
www.pcgameshardware.de/commoncfm/fonts/
30 KB
30 KB
Font
General
Full URL
https://www.pcgameshardware.de/commoncfm/fonts/lato-v16-latin-ext-700.woff
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
66bdd962ad3c4a394964e44600d43808fc3377e3323e00c86213c2564aae5651
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
1743425
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Tue, 26 Nov 2019 15:56:32 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/font-woff
access-control-allow-origin
*
cache-control
max-age=2592000
cf-ray
57511b64eb76d6d9-FRA
expires
Thu, 26 Mar 2020 15:51:30 GMT
lato-v16-latin-ext-900.woff
www.pcgameshardware.de/commoncfm/fonts/
29 KB
29 KB
Font
General
Full URL
https://www.pcgameshardware.de/commoncfm/fonts/lato-v16-latin-ext-900.woff
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
ce10c90083eaa6eb101084f0955b0a03410b15094d0c2fbaa0c476d0ec98e9c5
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
1743425
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Tue, 26 Nov 2019 15:56:32 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/font-woff
access-control-allow-origin
*
cache-control
max-age=2592000
cf-ray
57511b64eb78d6d9-FRA
expires
Thu, 26 Mar 2020 15:51:30 GMT
montserrat_400.woff
www.pcgameshardware.de/commoncfm/fonts/
14 KB
14 KB
Font
General
Full URL
https://www.pcgameshardware.de/commoncfm/fonts/montserrat_400.woff
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
81c3f88a8b295295195a4eb5286402a7e7e294a6524854d762f9610cb75e4360
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
155186
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Thu, 30 Jan 2014 16:59:19 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/font-woff
access-control-allow-origin
*
cache-control
max-age=2592000
cf-ray
57511b64eb79d6d9-FRA
expires
Tue, 14 Apr 2020 01:02:09 GMT
montserrat_700.woff
www.pcgameshardware.de/commoncfm/fonts/
12 KB
12 KB
Font
General
Full URL
https://www.pcgameshardware.de/commoncfm/fonts/montserrat_700.woff
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
5a81cd792636b7944f81da6c0eabc7a2c4d16895730b6f56c5de4d231affcad6
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
1655935
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Sun, 07 May 2017 05:19:04 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/font-woff
access-control-allow-origin
*
cache-control
max-age=2592000
cf-ray
57511b64eb7dd6d9-FRA
expires
Fri, 27 Mar 2020 16:09:40 GMT
montserrat_900.woff
www.pcgameshardware.de/commoncfm/fonts/
12 KB
12 KB
Font
General
Full URL
https://www.pcgameshardware.de/commoncfm/fonts/montserrat_900.woff
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
7dde4e862b9ec4153c85160c5e809d37d8da5e5c4141a2e438b3b28aa00e66f2
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
1655963
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Sun, 07 May 2017 05:19:04 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/font-woff
access-control-allow-origin
*
cache-control
max-age=2592000
cf-ray
57511b64eb7ed6d9-FRA
expires
Fri, 27 Mar 2020 16:09:12 GMT
fontello.woff
www.pcgameshardware.de/commoncfm/fonts/
28 KB
29 KB
Font
General
Full URL
https://www.pcgameshardware.de/commoncfm/fonts/fontello.woff
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
2eedf4d523d65318a57e8119d8be12c2640fec354e2961d28f42de154023cc41
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
155186
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Fri, 28 Feb 2020 09:54:12 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/font-woff
access-control-allow-origin
*
cache-control
max-age=2592000
cf-ray
57511b64eb82d6d9-FRA
expires
Tue, 14 Apr 2020 01:02:09 GMT
I99SivONLxYO
cdn.onthe.io/io.js/
74 KB
28 KB
Script
General
Full URL
https://cdn.onthe.io/io.js/I99SivONLxYO
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
116.203.211.59 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.59.211.203.116.clients.your-server.de
Software
nginx /
Resource Hash
56b412f0c66920c48c0fc59a2cec3173ccd18b4d1b06747355454dba0ffdae46

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Mon, 16 Mar 2020 20:08:35 GMT
Content-Encoding
gzip
Last-Modified
Wed, 29 Jan 2020 15:08:44 GMT
Server
nginx
ETag
W/"5e319ffc-128f8"
Transfer-Encoding
chunked
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Expires
Sat, 29 Feb 2020 15:08:56 GMT
general.css
www.pcgameshardware.de/bcommon/css/b2_pcgameshardware/
622 KB
89 KB
Stylesheet
General
Full URL
https://www.pcgameshardware.de/bcommon/css/b2_pcgameshardware/general.css?12362
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
7202db234777e26c6bf39dd6b4aaadefc016020c30c7668db098ca4c7a370fdb
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
style

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
37738
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Thu, 12 Mar 2020 15:22:25 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
text/css
cache-control
max-age=2592000
cf-ray
57511b64eb88d6d9-FRA
expires
Wed, 15 Apr 2020 09:39:37 GMT
article.css
www.pcgameshardware.de/bcommon/css/b2_pcgameshardware/
347 KB
55 KB
Stylesheet
General
Full URL
https://www.pcgameshardware.de/bcommon/css/b2_pcgameshardware/article.css?12362
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
f86e7d6581062850dac1f0eb3ad6555555590dc0f22fed734fa49758c6e127eb
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
style

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
37735
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Thu, 12 Mar 2020 15:22:40 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
text/css
cache-control
max-age=2592000
cf-ray
57511b64eb8dd6d9-FRA
expires
Wed, 15 Apr 2020 09:39:40 GMT
cfremote-min.js
www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/
342 KB
97 KB
Script
General
Full URL
https://www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/cfremote-min.js?12362
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
23cfba2cd4d82f5a2ee8ebb52ad2d86ffa5b992b3156e67c65286aff7b26e3c1
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
37738
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Thu, 27 Feb 2020 17:04:41 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/javascript
cache-control
max-age=2592000
cf-ray
57511b64eb9fd6d9-FRA
expires
Wed, 15 Apr 2020 09:39:37 GMT
general-min.js
www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/
292 KB
86 KB
Script
General
Full URL
https://www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/general-min.js?12362
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
bb14b95ff85acf21cbb8809d435950bb8580deb6f3a8f0b83360adcbc7866e17
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
37738
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Thu, 27 Feb 2020 17:04:53 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/javascript
cache-control
max-age=2592000
cf-ray
57511b64eba2d6d9-FRA
expires
Wed, 15 Apr 2020 09:39:37 GMT
article-min.js
www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/
551 KB
159 KB
Script
General
Full URL
https://www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/article-min.js?12362
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
11f68cee4a89f44fc4b20df5e06b98e37f37e5a4ebbfa43efe03599dbca67082
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
37735
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Thu, 27 Feb 2020 17:05:11 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/javascript
cache-control
max-age=2592000
cf-ray
57511b64eba3d6d9-FRA
expires
Wed, 15 Apr 2020 09:39:40 GMT
ads.js
www.pcgameshardware.de/bcommon/js/
21 B
153 B
Script
General
Full URL
https://www.pcgameshardware.de/bcommon/js/ads.js?12362
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
abd9155ac0fe0e62fdb9e2c1c333357cd33107972a57eff5224b0f3d0d2df316
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept-Encoding
cf-cache-status
HIT
age
37695
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
21
x-clacks-overhead
GNU Terry Pratchett
last-modified
Mon, 25 Mar 2019 14:51:55 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/javascript
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b64eba6d6d9-FRA
expires
Wed, 15 Apr 2020 09:40:20 GMT
iam.js
script.ioam.de/
38 KB
11 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.64 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script3.ioam.de
Software
nginx / BLACKBIRD-SRC v0.13 000f
Resource Hash
6cc7730ff989be099113fa39ff83dd0aef977ea4abca49c306a3be9cda1c0cde

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Mon, 16 Mar 2020 20:08:35 GMT
Content-Encoding
gzip
Last-Modified
Mon, 16 Mar 2020 20:08:35 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.13 000f
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
private, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Mon, 16 Mar 2020 22:08:35 GMT
metaTag.min.js
cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/
271 KB
61 KB
Script
General
Full URL
https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/metaTag.min.js
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:10:28e::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
KONICHIWA/1.0 /
Resource Hash
ce34186278780a02d3f47df85eda9599e99e8c8ba37a27df3b83b4f259a655ec

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
gzip
x-amz-request-id
103EDCFFB26CBA2E
status
200
access-control-max-age
86400
content-length
61937
x-amz-id-2
yflOBzDjCfMiRkkwzal8rxxjNwxGab6CZwxbgt4ALa70J+9+45CsPkORRk6Gu4dJ2VGXqWKFmI0=
last-modified
Mon, 16 Mar 2020 15:15:44 GMT
server
KONICHIWA/1.0
etag
"f5a168d2b912f306ceba242d53e7f1c2"
vary
Accept-Encoding
access-control-allow-methods
GET,HEAD,OPTIONS
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=815
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
fc.js
www.pcgameshardware.de/common/deliverad/
946 B
514 B
Script
General
Full URL
https://www.pcgameshardware.de/common/deliverad/fc.js?v=15
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
58b29ffd944cf81b5c16f7fbbfa6931292eae2152038644a80218e5af68fc566
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
731098
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Wed, 23 Mar 2016 10:54:50 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/javascript
cache-control
max-age=2592000
cf-ray
57511b64eba8d6d9-FRA
expires
Tue, 07 Apr 2020 09:03:37 GMT
trckUtil.min.js
www.pcgameshardware.de/bcommon/js/
2 KB
925 B
Script
General
Full URL
https://www.pcgameshardware.de/bcommon/js/trckUtil.min.js?v=6
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
e4bb456d09aad2e36bafd434bded4edac5aa7a15ff9101c31d67855a3fb53eed
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
1461071
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Tue, 04 Feb 2020 07:10:39 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/javascript
cache-control
max-age=2592000
cf-ray
57511b64eba9d6d9-FRA
expires
Sun, 29 Mar 2020 22:17:24 GMT
wz_tooltip_centerwindow_followscroll-min.js
www.pcgameshardware.de/bcommon/js/
24 KB
8 KB
Script
General
Full URL
https://www.pcgameshardware.de/bcommon/js/wz_tooltip_centerwindow_followscroll-min.js
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
d598544c0552db299731c3a25bb84fb1226b7594dfd17d2de0a1578593f699c3
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
878813
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Wed, 26 Jan 2011 13:55:03 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/javascript
cache-control
max-age=2592000
cf-ray
57511b64ebabd6d9-FRA
expires
Sun, 05 Apr 2020 16:01:42 GMT
header_logo_big.png
www.pcgameshardware.de/static/gfx/
3 KB
3 KB
Image
General
Full URL
https://www.pcgameshardware.de/static/gfx/header_logo_big.png
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
34d4e6eadae686e27a2d4ef5f1b4e9a43a3682ae26f2cdd5622716541cfdf697
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept-Encoding
cf-cache-status
HIT
age
562628
cf-polished
pngoptimizer, origSize=2795
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
2582
x-clacks-overhead
GNU Terry Pratchett
last-modified
Thu, 23 Jul 2015 08:19:28 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/png
expires
Thu, 09 Apr 2020 07:51:27 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b64ebaed6d9-FRA
cf-bgj
imgq:100
online_abo_logo.svg
www.pcgameshardware.de/static/gfx/header/
3 KB
1 KB
Image
General
Full URL
https://www.pcgameshardware.de/static/gfx/header/online_abo_logo.svg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
cfc35813922283b122afa06e56a0ad6219e1f000513b3d65fee1d43977dd2bad
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
562623
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Tue, 27 Feb 2018 10:23:22 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/svg+xml
cache-control
max-age=2592000
cf-ray
57511b652c3dd6d9-FRA
expires
Thu, 09 Apr 2020 07:51:32 GMT
pcgh_plus_invert3.svg
www.pcgameshardware.de/static/gfx/header/
2 KB
846 B
Image
General
Full URL
https://www.pcgameshardware.de/static/gfx/header/pcgh_plus_invert3.svg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
d9da9ed2eb7155b34e207489b97d7b3c8a3a99f564178ee8f2af3e84d4be7643
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
2204440
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Tue, 27 Feb 2018 11:05:00 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/svg+xml
cache-control
max-age=2592000
cf-ray
57511b656cf7d6d9-FRA
expires
Sat, 21 Mar 2020 07:47:55 GMT
logo_gw.png
www.pcgameshardware.de/static/gfx/header/
1 KB
1 KB
Image
General
Full URL
https://www.pcgameshardware.de/static/gfx/header/logo_gw.png
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
2003b66dc1b88a44328998588c72828a68e3161fef2bd811277b0f1978227224
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept
cf-cache-status
HIT
age
353048
cf-polished
origFmt=png, origSize=2884
status
200
content-disposition
inline; filename="logo_gw.webp"
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
1194
x-clacks-overhead
GNU Terry Pratchett
last-modified
Thu, 04 Feb 2016 13:36:34 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/webp
expires
Sat, 11 Apr 2020 18:04:27 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b65febed6d9-FRA
cf-bgj
imgq:85
Apple_iPhone-11-Pro_Colors_091019-pcgh_b2article_artwork.jpg
www.pcgameshardware.de/screenshots/original/2019/09/
11 KB
11 KB
Image
General
Full URL
https://www.pcgameshardware.de/screenshots/original/2019/09/Apple_iPhone-11-Pro_Colors_091019-pcgh_b2article_artwork.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
aaba6871f3726b9b780ae513b7d5fd323267dddf5ae0262f01b9376523f2b9cc
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept
cf-cache-status
HIT
age
1134761
cf-polished
qual=85, origFmt=jpeg, origSize=71890
status
200
content-disposition
inline; filename="Apple_iPhone-11-Pro_Colors_091019-pcgh_b2article_artwork.webp"
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
11206
x-clacks-overhead
GNU Terry Pratchett
last-modified
Tue, 10 Sep 2019 21:20:40 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/webp
expires
Thu, 02 Apr 2020 16:55:54 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b662f62d6d9-FRA
link
<https://www.pcgameshardware.de/screenshots/original/2019/09/Apple_iPhone-11-Pro_Colors_091019-pcgh_b2article_artwork.jpg>; rel="canonical"
cf-bgj
imgq:85
Amazon-1.png
www.pcgameshardware.de/screenshots/original/2018/11/
2 KB
2 KB
Image
General
Full URL
https://www.pcgameshardware.de/screenshots/original/2018/11/Amazon-1.png
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
43af7f7c9db712933120add636bbfa56a8ce4fe9c069b3a598d85b93136ca474
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept-Encoding
cf-cache-status
HIT
age
479721
cf-polished
origSize=17351
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
2308
x-clacks-overhead
GNU Terry Pratchett
last-modified
Fri, 23 Nov 2018 11:11:35 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/png
expires
Fri, 10 Apr 2020 06:53:14 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f63d6d9-FRA
link
<http://www.pcgameshardware.de/screenshots/original/2018/11/Amazon-1.png>; rel="canonical"
cf-bgj
imgq:100
apple-tim-cook-2017_apple_b2teaser_169.jpg
www.pcgameshardware.de/screenshots/237x133/2017/10/
2 KB
2 KB
Image
General
Full URL
https://www.pcgameshardware.de/screenshots/237x133/2017/10/apple-tim-cook-2017_apple_b2teaser_169.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
9b165d67b7e20528115805f0ebfd9f07fe06cfd37402ef2d3d0f8b05d4bca3ec
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept
cf-cache-status
HIT
age
97963
cf-polished
qual=85, origFmt=jpeg, origSize=3848
status
200
content-disposition
inline; filename="apple-tim-cook-2017_apple_b2teaser_169.webp"
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
2270
x-clacks-overhead
GNU Terry Pratchett
last-modified
Wed, 20 Nov 2019 14:47:51 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/webp
expires
Tue, 14 Apr 2020 16:55:52 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f66d6d9-FRA
link
<https://www.pcgameshardware.de/screenshots/original/2017/10/apple-tim-cook-2017_apple_b2teaser_169.jpg>; rel="canonical"
cf-bgj
imgq:85
tim_cook_billionth_iphone-pcgh_b2teaser_169.jpeg
www.pcgameshardware.de/screenshots/237x133/2016/07/
7 KB
8 KB
Image
General
Full URL
https://www.pcgameshardware.de/screenshots/237x133/2016/07/tim_cook_billionth_iphone-pcgh_b2teaser_169.jpeg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
7b11b952f13dbd2e8c6e8af03b4f5b45beb54a3a4f42d3c2030c9e8fd17b0328
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept-Encoding
cf-cache-status
HIT
age
549943
cf-polished
origSize=8060, status=webp_bigger
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
7675
x-clacks-overhead
GNU Terry Pratchett
last-modified
Sat, 30 Jul 2016 09:31:56 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/jpeg
expires
Thu, 09 Apr 2020 11:22:52 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f67d6d9-FRA
link
<https://www.pcgameshardware.de/screenshots/original/2016/07/tim_cook_billionth_iphone-pcgh_b2teaser_169.jpeg>; rel="canonical"
cf-bgj
imgq:85
Apple-iPhone-SE2-Rendering_Svetapple_02-pcgh_b2teaser_169.jpg
www.pcgameshardware.de/screenshots/237x133/2020/01/
6 KB
6 KB
Image
General
Full URL
https://www.pcgameshardware.de/screenshots/237x133/2020/01/Apple-iPhone-SE2-Rendering_Svetapple_02-pcgh_b2teaser_169.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
6f4c43ca3e0b1fd9376c0f9178cf9489517f12618a3f8df29d352a32b3105324
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Cookie, Accept-Encoding
cf-cache-status
HIT
age
251950
cf-polished
degrade=85, origSize=6573, status=vary_header_present
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
5949
x-clacks-overhead
GNU Terry Pratchett
last-modified
Tue, 28 Jan 2020 15:41:47 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/jpeg
expires
Sun, 12 Apr 2020 22:09:25 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f6ad6d9-FRA
link
<https://www.pcgameshardware.de/screenshots/original/2020/01/Apple-iPhone-SE2-Rendering_Svetapple_02-pcgh_b2teaser_169.jpg>; rel="canonical"
cf-bgj
imgq:85
aufmacher_grundlagen-pcgh2.png
www.pcgameshardware.de/screenshots/1020x/2018/04/
495 KB
495 KB
Image
General
Full URL
https://www.pcgameshardware.de/screenshots/1020x/2018/04/aufmacher_grundlagen-pcgh2.png
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
d121b006fa8860b89d47fd1e8480b3462367cb179c6fc027b395fd1d175232d5
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept-Encoding
cf-cache-status
HIT
age
561264
cf-polished
origSize=535674
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
506413
x-clacks-overhead
GNU Terry Pratchett
last-modified
Wed, 18 Apr 2018 17:16:05 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/png
expires
Thu, 09 Apr 2020 08:14:11 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f6cd6d9-FRA
link
<http://www.pcgameshardware.de/screenshots/original/2018/04/aufmacher_grundlagen-pcgh2.png>; rel="canonical"
cf-bgj
imgq:100
blank.gif
vg01.met.vgwort.de/
Redirect Chain
  • https://vg01.met.vgwort.de/na/d5d6a0d084c24736a53dc60d0ffae72c
  • https://vg01.met.vgwort.de/blank.gif
43 B
332 B
Image
General
Full URL
https://vg01.met.vgwort.de/blank.gif
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
161.156.66.178 , United States, ASN36351 (SOFTLAYER, US),
Reverse DNS
b2.42.9ca1.ip4.static.sl-reverse.com
Software
s2.51.1 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:35 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
s2.51.1
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

Date
Mon, 16 Mar 2020 20:08:35 GMT
Last-Modified
Mon, 16 Mar 2020 20:08:35 GMT
Server
s2.51.1
Location
/blank.gif
Transfer-Encoding
chunked
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
max-age=0, no-cache, must-revalidate, proxy-revalidate
Connection
keep-alive
Expires
Tue, 22 Aug 2000 15:05:01 GMT
82139.jpg
icdn.computec.de/videos/img/medium/2019/10/
139 KB
139 KB
Image
General
Full URL
https://icdn.computec.de/videos/img/medium/2019/10/82139.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.146.104.136 , Germany, ASN15598 (QSC-AG-IPX, DE),
Reverse DNS
Software
Apache/2.4.25 /
Resource Hash
c7efacbd816654df8df87cc1a5e97ad7a6b8750a2fe125c9fad492ea5c91109b

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Date
Mon, 16 Mar 2020 20:08:35 GMT
X-Clacks-Overhead
GNU Terry Pratchett
Last-Modified
Thu, 24 Oct 2019 08:28:39 GMT
Server
Apache/2.4.25
Content-Type
image/jpeg
Cache-Control
max-age=2592000
Connection
Keep-Alive
Accept-Ranges
bytes
Keep-Alive
timeout=4, max=500
Content-Length
141861
Expires
Wed, 15 Apr 2020 20:08:35 GMT
82604.jpg
icdn.computec.de/videos/img/medium/2020/2/
63 KB
63 KB
Image
General
Full URL
https://icdn.computec.de/videos/img/medium/2020/2/82604.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.146.104.136 , Germany, ASN15598 (QSC-AG-IPX, DE),
Reverse DNS
Software
Apache/2.4.25 /
Resource Hash
b6fc53b0ab2238d5a9e51f8e1e9806dd831308c1e712a7436aa2d96b372cd2bc

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Date
Mon, 16 Mar 2020 20:08:35 GMT
X-Clacks-Overhead
GNU Terry Pratchett
Last-Modified
Fri, 21 Feb 2020 07:56:04 GMT
Server
Apache/2.4.25
Content-Type
image/jpeg
Cache-Control
max-age=2592000
Connection
Keep-Alive
Accept-Ranges
bytes
Keep-Alive
timeout=4, max=500
Content-Length
64220
Expires
Wed, 15 Apr 2020 20:08:35 GMT
82670.jpg
icdn.computec.de/videos/img/medium/2020/3/
89 KB
89 KB
Image
General
Full URL
https://icdn.computec.de/videos/img/medium/2020/3/82670.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.146.104.136 , Germany, ASN15598 (QSC-AG-IPX, DE),
Reverse DNS
Software
Apache/2.4.25 /
Resource Hash
bada96c6ab215d21af3ce49ecc88b6f84650a3b768f8f6e6be93a759fbbe8b84

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Date
Mon, 16 Mar 2020 20:08:35 GMT
X-Clacks-Overhead
GNU Terry Pratchett
Last-Modified
Fri, 13 Mar 2020 09:19:03 GMT
Server
Apache/2.4.25
Content-Type
image/jpeg
Cache-Control
max-age=2592000
Connection
Keep-Alive
Accept-Ranges
bytes
Keep-Alive
timeout=4, max=500
Content-Length
90657
Expires
Wed, 15 Apr 2020 20:08:35 GMT
cms-teaser_doom_002_DOOM_64.jpg
www.pcgameshardware.de/bcommon/images/doometernal/
38 KB
38 KB
Image
General
Full URL
https://www.pcgameshardware.de/bcommon/images/doometernal/cms-teaser_doom_002_DOOM_64.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
aeb56ce2d669c7b17da5da917da0f52586eee444da9fd8601ecd4781819ac5f8
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept
cf-cache-status
HIT
age
272184
cf-polished
qual=85, origFmt=jpeg, origSize=91460
status
200
content-disposition
inline; filename="cms-teaser_doom_002_DOOM_64.webp"
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
39100
x-clacks-overhead
GNU Terry Pratchett
last-modified
Fri, 13 Mar 2020 13:19:22 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/webp
expires
Sun, 12 Apr 2020 16:32:11 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f6ed6d9-FRA
cf-bgj
imgq:85
rollen.gif
extreme.pcgameshardware.de/images/smilies/
704 B
869 B
Image
General
Full URL
https://extreme.pcgameshardware.de/images/smilies/rollen.gif
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
cad7f640b619c4106c582a266103856ff6d2cccbcbccbe6b47cdc034d3967309
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
cf-cache-status
HIT
age
349960
cf-polished
origFmt=gif, origSize=1057
status
200
content-disposition
inline; filename="rollen.webp"
strict-transport-security
max-age=15552000; preload
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
704
x-clacks-overhead
GNU Terry Pratchett
last-modified
Wed, 01 Oct 2008 08:43:02 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept
content-type
image/webp
cf-bgj
imgq:85
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663fa2d6d9-FRA
expires
Sat, 11 Apr 2020 18:55:55 GMT
s000.gif
extreme.pcgameshardware.de/images/smilies/
111 B
267 B
Image
General
Full URL
https://extreme.pcgameshardware.de/images/smilies/s000.gif
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
a3050846a05163a504898c44991f9e3a84b37c79d69024cb05974b3f56d2bf06
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
cf-cache-status
HIT
age
1602617
cf-polished
origSize=902, status=webp_bigger
status
200
strict-transport-security
max-age=15552000; preload
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
111
x-clacks-overhead
GNU Terry Pratchett
last-modified
Wed, 21 Nov 2007 15:10:24 GMT
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/gif
cf-bgj
imgq:85
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f9cd6d9-FRA
expires
Sat, 28 Mar 2020 06:58:18 GMT
cool3.gif
extreme.pcgameshardware.de/images/smilies/
228 B
357 B
Image
General
Full URL
https://extreme.pcgameshardware.de/images/smilies/cool3.gif
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
502d097eaad24c84c53d916f8ae0a6d28c9ff448294b60d2bc00a2b26546f1b3
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
cf-cache-status
HIT
age
479984
cf-polished
origSize=931
status
200
strict-transport-security
max-age=15552000; preload
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
228
x-clacks-overhead
GNU Terry Pratchett
last-modified
Tue, 20 Nov 2007 14:11:00 GMT
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/gif
cf-bgj
imgq:100
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663fa1d6d9-FRA
expires
Fri, 10 Apr 2020 06:48:51 GMT
lolaway2.gif
extreme.pcgameshardware.de/images/smilies/
5 KB
5 KB
Image
General
Full URL
https://extreme.pcgameshardware.de/images/smilies/lolaway2.gif
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
836fd3e4ba533c754e5b0ff9864a98a790d2e045862ed7a1d5e97001356aa0e8
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
cf-cache-status
HIT
age
480044
cf-polished
origSize=5441
status
200
strict-transport-security
max-age=15552000; preload
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
5244
x-clacks-overhead
GNU Terry Pratchett
last-modified
Tue, 20 Nov 2007 13:48:00 GMT
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/gif
cf-bgj
imgq:100
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f9fd6d9-FRA
expires
Fri, 10 Apr 2020 06:47:51 GMT
PCGH_0420_Cover_MAG_Web1.jpg
www.pcgameshardware.de/covers/74x96/
4 KB
5 KB
Image
General
Full URL
https://www.pcgameshardware.de/covers/74x96/PCGH_0420_Cover_MAG_Web1.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
32a3c6c7d7c5fbbeb9871f6b57cae30c72a287a07eea30d102797dbb72542446
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept
cf-cache-status
HIT
age
417716
cf-polished
qual=85, origFmt=jpeg, origSize=10526
status
200
content-disposition
inline; filename="PCGH_0420_Cover_MAG_Web1.webp"
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
4326
x-clacks-overhead
GNU Terry Pratchett
last-modified
Fri, 28 Feb 2020 13:00:00 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/webp
expires
Sat, 11 Apr 2020 00:06:39 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f70d6d9-FRA
cf-bgj
imgq:85
PCG_0320_Cover_Magazin_web.jpg
www.pcgameshardware.de/covers/74x96/
3 KB
4 KB
Image
General
Full URL
https://www.pcgameshardware.de/covers/74x96/PCG_0320_Cover_Magazin_web.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
2b582dd879de6ce77ba9b99253545aeed20bb14a913ec571a94c28cc656fc88d
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept
cf-cache-status
HIT
age
355331
cf-polished
qual=85, origFmt=jpeg, origSize=8886
status
200
content-disposition
inline; filename="PCG_0320_Cover_Magazin_web.webp"
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
3566
x-clacks-overhead
GNU Terry Pratchett
last-modified
Sat, 22 Feb 2020 09:00:02 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/webp
expires
Sat, 11 Apr 2020 17:26:24 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f72d6d9-FRA
cf-bgj
imgq:85
MMORE_03_2020_Cover_Print.png
www.pcgameshardware.de/covers/74x96/
12 KB
13 KB
Image
General
Full URL
https://www.pcgameshardware.de/covers/74x96/MMORE_03_2020_Cover_Print.png
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
27c48230a4bfe9e520f92aa4d1dcf961431280c5d30a6ef7dab31af50aa0859d
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept
cf-cache-status
HIT
age
354303
cf-polished
origFmt=png, origSize=16727
status
200
content-disposition
inline; filename="MMORE_03_2020_Cover_Print.webp"
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
12584
x-clacks-overhead
GNU Terry Pratchett
last-modified
Wed, 19 Feb 2020 09:26:30 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/webp
expires
Sat, 11 Apr 2020 17:43:32 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f75d6d9-FRA
cf-bgj
imgq:85
play4_Cover_0420_web.jpg
www.pcgameshardware.de/covers/74x96/
4 KB
4 KB
Image
General
Full URL
https://www.pcgameshardware.de/covers/74x96/play4_Cover_0420_web.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
a702593ee43003e6aad230188b8724f37cce08eecc412e71d6dff596fbe16462
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept
cf-cache-status
HIT
age
350853
cf-polished
qual=85, origFmt=jpeg, origSize=9661
status
200
content-disposition
inline; filename="play4_Cover_0420_web.webp"
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
3830
x-clacks-overhead
GNU Terry Pratchett
last-modified
Sat, 29 Feb 2020 11:00:05 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/webp
expires
Sat, 11 Apr 2020 18:41:02 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f7cd6d9-FRA
cf-bgj
imgq:85
GA2003_Titelseite_web.jpg
www.pcgameshardware.de/covers/74x96/
4 KB
4 KB
Image
General
Full URL
https://www.pcgameshardware.de/covers/74x96/GA2003_Titelseite_web.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
5c4bf2650f33f2d1060d95e525425062889336b4d672bdf2bed2b7ba68f70fcc
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Cookie, Accept-Encoding
cf-cache-status
HIT
age
416154
cf-polished
degrade=85, origSize=9297, status=vary_header_present
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
4065
x-clacks-overhead
GNU Terry Pratchett
last-modified
Fri, 14 Feb 2020 16:00:09 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/jpeg
expires
Sat, 11 Apr 2020 00:32:41 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f7fd6d9-FRA
cf-bgj
imgq:85
XBG_01-0318_U1_Cover.jpg
www.pcgameshardware.de/covers/74x96/
4 KB
4 KB
Image
General
Full URL
https://www.pcgameshardware.de/covers/74x96/XBG_01-0318_U1_Cover.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
ec154b3d01478b3b071142b233395a62a179fbb3fe8e0678bda50dc41fbafe8f
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept
cf-cache-status
HIT
age
612193
cf-polished
qual=85, origFmt=jpeg, origSize=6970
status
200
content-disposition
inline; filename="XBG_01-0318_U1_Cover.webp"
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
3604
x-clacks-overhead
GNU Terry Pratchett
last-modified
Mon, 18 Dec 2017 15:23:43 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/webp
expires
Wed, 08 Apr 2020 18:05:22 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f81d6d9-FRA
cf-bgj
imgq:85
pcgmmore.jpg
www.pcgameshardware.de/bcommon/gfx/appcover/
4 KB
4 KB
Image
General
Full URL
https://www.pcgameshardware.de/bcommon/gfx/appcover/pcgmmore.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
48f9c4165e95dfbd77f9e00f3560714e57fb55d6e13b2b3eb963b12a62480653
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept
cf-cache-status
HIT
age
349583
cf-polished
qual=85, origFmt=jpeg, origSize=6177
status
200
content-disposition
inline; filename="pcgmmore.webp"
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
4226
x-clacks-overhead
GNU Terry Pratchett
last-modified
Mon, 09 Mar 2015 15:23:48 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/webp
expires
Sat, 11 Apr 2020 19:02:12 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f84d6d9-FRA
cf-bgj
imgq:85
ct_kiosk.gif
www.pcgameshardware.de/bcommon/gfx/appcover/
2 KB
2 KB
Image
General
Full URL
https://www.pcgameshardware.de/bcommon/gfx/appcover/ct_kiosk.gif
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
c09bad8a8a725aa2c53c0cff2002b9a67e71698f30a377a0a2dfc8d1d54ef06b
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept
cf-cache-status
HIT
age
351228
cf-polished
origFmt=gif, origSize=2304
status
200
content-disposition
inline; filename="ct_kiosk.webp"
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
1782
x-clacks-overhead
GNU Terry Pratchett
last-modified
Mon, 09 Mar 2015 15:22:32 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/webp
expires
Sat, 11 Apr 2020 18:34:47 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b663f86d6d9-FRA
cf-bgj
imgq:85
loader.js
cdn.taboola.com/libtrc/stroeer-computec-pcgameshardwarede/
98 KB
20 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/stroeer-computec-pcgameshardwarede/loader.js
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
d3cf2709e10ef178a4a4a0ae0ff2c7ce6179ce99c28e6b2ed5a8f696cdac44c7

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

x-amz-version-id
.Cmy5WOSisDpUMezaGY_OE6LQUv0Vu0w
content-encoding
gzip
age
106
x-cache
HIT
status
200
date
Mon, 16 Mar 2020 20:08:35 GMT
content-length
20321
x-amz-id-2
zw6cY8tHmO3RBdZYZYrZ19uwZGxr2Res6uB9+zqaPbNq87sBa7F0RT6Eq10uUUgP37qEhhra9HE=
x-served-by
cache-fra19131-FRA
last-modified
Mon, 16 Mar 2020 09:28:56 GMT
server
AmazonS3
x-timer
S1584389316.609505,VS0,VE1
etag
"3d1dde47a9e4d42f0c233d033168f513"
vary
Accept-Encoding
x-amz-request-id
5408BDF1262E021D
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
98
x-cache-hits
1
analytics.js
www.google-analytics.com/
44 KB
18 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 06 Feb 2020 00:21:02 GMT
server
Golfe2
age
5703
date
Mon, 16 Mar 2020 18:33:32 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
18174
expires
Mon, 16 Mar 2020 20:33:32 GMT
cx.js
scdn.cxense.com/
101 KB
24 KB
Script
General
Full URL
https://scdn.cxense.com/cx.js
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_CBC
Server
2a02:26f0:6c00:180::268b , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
3d5505cfa69191d6fe9bbdb496302c779ac495706f27d85e580b8ccca2ad9662

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Mon, 16 Mar 2020 20:08:35 GMT
Content-Encoding
gzip
Last-Modified
Tue, 18 Feb 2020 11:39:06 GMT
Server
Apache
Vary
Accept-Encoding
Content-Type
application/x-javascript
Access-Control-Allow-Origin
*
Cache-Control
max-age=3600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24486
Expires
Mon, 16 Mar 2020 21:08:35 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
43 KB
15 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/metaTag.min.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
89a39fe87404de18d2607d59ba5cded97619e30186571849f6cad08357ed7753
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"458 / 528 of 1000 / last-modified: 1584029937"
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
14483
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:35 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
304 KB
92 KB
Script
General
Full URL
https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.202.12 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-202-12.fra53.r.cloudfront.net
Software
/ Express
Resource Hash
581045be2723e906e1e3f19426a11fa869704b8bc6470b5d690d1ba183dc7418

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 17:44:56 GMT
content-encoding
gzip
age
8619
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
status
200
cache-control
public, max-age=10800
x-amz-cf-pop
FRA53-C1
access-control-allow-origin
*
x-amz-cf-id
i9xMTy-eka4cp23uGcrRbxBRhQNWDZdnvbztCl6nPDGT6qaczdFt5A==
via
1.1 0cbb1ca51bf146be48b40804581e4466.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
126 KB
49 KB
Script
General
Full URL
https://s400.mxcdn.net/bb-mx/serve/mtrcs_679600.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
92.122.254.186 , Ascension Island, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a92-122-254-186.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Mon, 16 Mar 2020 20:08:35 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
49772
Expires
Mon, 16 Mar 2020 22:08:35 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
0
-1 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-53-21.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
Server
nginx
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Content-Type
text/plain; charset=utf-8
Access-Control-Allow-Origin
https://www.pcgameshardware.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72

Redirect headers

Date
Mon, 16 Mar 2020 20:08:35 GMT
Server
nginx
Access-Control-Allow-Origin
https://www.pcgameshardware.de
Content-Type
text/plain; charset=utf-8
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72
nuggad
nugmw.userreport.com/rc-ap/a50c4aea-1a1c-4b59-9225-0fbb8df2380e/si.nuggad.net/
Redirect Chain
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=323749351&nuggtg=&nuggrid=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-...
  • https://nugmw.userreport.com/rc-ap/a50c4aea-1a1c-4b59-9225-0fbb8df2380e/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=323749351&nuggtg=&nuggrid=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Sm...
2 KB
2 KB
Script
General
Full URL
https://nugmw.userreport.com/rc-ap/a50c4aea-1a1c-4b59-9225-0fbb8df2380e/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=323749351&nuggtg=&nuggrid=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:214f:3000:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
5768e8c817b17a47f348cae0181f7fe4cf43f55f58acfb6df553c69c99cd6264

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
via
1.1 fc7091924e65025d5bfb92361ec3e660.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA53-C1
access-control-allow-methods
get, post, options
content-type
text/javascript
status
200
cache-control
s-maxage=86400, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
1897
x-amz-cf-id
b9Spd1OpgD9orchDqMk4I3uHOP-EMgYcchFTsluEy2vgDbS97BfxgA==

Redirect headers

date
Mon, 16 Mar 2020 20:08:35 GMT
via
1.1 2b2e2811e641703aebf776da39317b9c.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA2-C2
location
https://nugmw.userreport.com/rc-ap/a50c4aea-1a1c-4b59-9225-0fbb8df2380e/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=323749351&nuggtg=&nuggrid=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F
access-control-allow-methods
get, post, options
status
302
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
GTHtvcfBtREIHnjG8EufSTwaonujxkEqXfmVNVh96Jg6ghNt2QUsRQ==
identitystatus
irqs.ioam.de/
25 B
211 B
XHR
General
Full URL
https://irqs.ioam.de/identitystatus?offerIdentifier=gamworld&siteIdentifier=c_pcgh_ArticlePage_TelekommunikationInternetdienste&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.18829218398263392
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

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
server
nginx
status
200
vary
Origin
content-type
application/vnd.api+json
access-control-allow-origin
https://www.pcgameshardware.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=gamworld&cp=c_pcgh_ArticlePage_TelekommunikationInternetdienste&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.pcgameshardware.de&xy=1600x1200x24&lo=BE%2FBrussels%20Hoo...
  • https://de.ioam.de/tx.io?st=gamworld&cp=c_pcgh_ArticlePage_TelekommunikationInternetdienste&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.pcgameshardware.de&xy=1600x1200x24&lo=BE%2FBrussels%20Hoo...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=gamworld&cp=c_pcgh_ArticlePage_TelekommunikationInternetdienste&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.pcgameshardware.de&xy=1600x1200x24&lo=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=000f&i2=000ff44cf303694245e6fdcc3&ep=1614308887&vr=416&id=sxnjyl&i3=000ff44cf303694245e6fdcc3%3A1613160515561%3A1584389315561%3A.pcgameshardware.de%3A1%3Agamworld%3Ac_pcgh_ArticlePage_TelekommunikationInternetdienste%3Anoevent%3A1584389315561&n1=1&dntt=0&lt=1584389315564&ev=&cs=iqlzx0&mo=1&sr=71
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.65 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de3.ioam.de
Software
nginx / BLACKBIRD-RCV v1.06.2 0041
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.06.2 0041
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
Mon, 16 Mar 2020 20:08:35 GMT
X-Powered-By
BLACKBIRD-RCV v1.06.2 0041
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
Mon, 16 Mar 2020 20:08:35 GMT
Server
nginx
Location
/tx.io?st=gamworld&cp=c_pcgh_ArticlePage_TelekommunikationInternetdienste&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.pcgameshardware.de&xy=1600x1200x24&lo=BE%2FBrussels%20Hoofdstedelijk%20Gewest&cb=000f&i2=000ff44cf303694245e6fdcc3&ep=1614308887&vr=416&id=sxnjyl&i3=000ff44cf303694245e6fdcc3%3A1613160515561%3A1584389315561%3A.pcgameshardware.de%3A1%3Agamworld%3Ac_pcgh_ArticlePage_TelekommunikationInternetdienste%3Anoevent%3A1584389315561&n1=1&dntt=0&lt=1584389315564&ev=&cs=iqlzx0&mo=1&sr=71
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Access-Control-Allow-Origin
*
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
Sat, 16 Mar 2019 20:08:35 GMT
lato400.woff
www.pcgameshardware.de/static/fonts/
45 KB
42 KB
Font
General
Full URL
https://www.pcgameshardware.de/static/fonts/lato400.woff
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
336e47855a2634b17ab1e87428f96b51e21a434dca8c8327b47dc0fd2e0d3b51
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/bcommon/css/b2_pcgameshardware/article.css?12362
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
480078
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Thu, 30 Jan 2014 15:40:02 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/font-woff
access-control-allow-origin
*
cache-control
max-age=2592000
cf-ray
57511b665ffdd6d9-FRA
expires
Fri, 10 Apr 2020 06:47:17 GMT
/
tt.onthe.io/uniques/
33 B
559 B
Script
General
Full URL
https://tt.onthe.io/uniques/?current=16&holding=108810e7aaccba71ff5759d480adc9d0&hash_user=aa0c4043a.f9d2c0cfb_1584389315604&1584389315604
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/I99SivONLxYO
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:35 GMT
Server
nginx
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
33
Expires
Thu, 01 Jan 1970 00:00:01 GMT
truncated
/
179 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d6dfe2c80ead3b3641bc066ec75ef7b27527d5ab44b0603e4c669ec62696fa04

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
truncated
/
4 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
af9926df4e72f4a6aa7973a30656ec660fdf15a6f3b1004c62a7122f66757607

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
81933.jpg
icdn.computec.de/videos/img/medium/2019/9/
106 KB
106 KB
Image
General
Full URL
https://icdn.computec.de/videos/img/medium/2019/9/81933.jpg?t=1568221080
Requested by
Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.146.104.136 , Germany, ASN15598 (QSC-AG-IPX, DE),
Reverse DNS
Software
Apache/2.4.25 /
Resource Hash
03ca4c0ca6ea501c4138d0e85e7d32b1d8878462b24317a1a020b040009fc81b

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Date
Mon, 16 Mar 2020 20:08:35 GMT
X-Clacks-Overhead
GNU Terry Pratchett
Last-Modified
Wed, 11 Sep 2019 15:00:03 GMT
Server
Apache/2.4.25
Content-Type
image/jpeg
Cache-Control
max-age=2592000
Connection
Keep-Alive
Accept-Ranges
bytes
Keep-Alive
timeout=4, max=499
Content-Length
108463
Expires
Wed, 15 Apr 2020 20:08:35 GMT
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=1796390970&t=pageview&_s=1&dl=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akk...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1536541-2&cid=766020357.1584389316&jid=348972104&_gid=1542115608.1584389316&gjid=1628207933&_v=j81&z=750171865
35 B
102 B
Image
General
Full URL
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1536541-2&cid=766020357.1584389316&jid=348972104&_gid=1542115608.1584389316&gjid=1628207933&_v=j81&z=750171865
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c0c::9d Brussels, Belgium, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
strict-transport-security
max-age=10886400; includeSubDomains; preload
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
date
Mon, 16 Mar 2020 20:08:35 GMT
content-type
image/gif
status
200
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

Redirect headers

pragma
no-cache
date
Mon, 16 Mar 2020 20:08:35 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1536541-2&cid=766020357.1584389316&jid=348972104&_gid=1542115608.1584389316&gjid=1628207933&_v=j81&z=750171865
content-type
text/html; charset=UTF-8
status
302
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
416
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
player.pcgameshardware.de/ Frame FABB
27 KB
10 KB
Document
General
Full URL
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/cfremote-min.js?12362
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
b2d230535a19145ec91163e3b639055373f97dfdecb0deb906df36640ef8cab9
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

:method
GET
:authority
player.pcgameshardware.de
:scheme
https
:path
/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
same-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
__cfduid=d1e11530816c75d7e9e56336c503018881584389315; CPTBP=7799795; ioam2018=000ff44cf303694245e6fdcc3:1613160515561:1584389315561:.pcgameshardware.de:2:gamworld:c_pcgh_ArticlePage_TelekommunikationInternetdienste:noevent:1584389315561:w5srhg; stTrUU=5e6fdcc33ca2e; __io_uh=1; __io=aa0c4043a.f9d2c0cfb_1584389315604; _ga=GA1.2.766020357.1584389316; _gid=GA1.2.1542115608.1584389316; _gat=1
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-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
date
Mon, 16 Mar 2020 20:08:35 GMT
content-type
text/html;charset=UTF-8
set-cookie
cfid=317b7341-a409-45e3-be45-766e3f32e59e;Path=/;Expires=Sun, 05-Apr-2020 21:46:39 UTC;HTTPOnly cftoken=0;Path=/;Expires=Sun, 05-Apr-2020 21:46:39 UTC;HTTPOnly
cache-control
no-cache, no-store, must-revalidate
pragma
no-cache
expires
0
x-clacks-overhead
GNU Terry Pratchett
cf-cache-status
DYNAMIC
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
server
cloudflare
cf-ray
57511b66e9cdd6d9-FRA
content-encoding
br
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
amazon-logo.png
www.pcgameshardware.de/commoncfm/gfx/
6 KB
6 KB
Image
General
Full URL
https://www.pcgameshardware.de/commoncfm/gfx/amazon-logo.png
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
fa8374431ef56512ba068fed04a9ec2d944a74d5903519d98ff31993ea5e9ef5
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/bcommon/css/b2_pcgameshardware/article.css?12362
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept-Encoding
cf-cache-status
HIT
age
562605
cf-polished
pngoptimizer, origSize=8217
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
5831
x-clacks-overhead
GNU Terry Pratchett
last-modified
Fri, 04 Nov 2016 10:13:14 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/png
expires
Thu, 09 Apr 2020 07:51:50 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b66d994d6d9-FRA
cf-bgj
imgq:100
truncated
/
2 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7c349d15a749e092fcffd6bcc4943d5fdebdf5dae48818fb3c5fdc171363c58c

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/svg+xml
nextPageLinkArrow.svg
www.pcgameshardware.de/bcommon/gfx/
404 B
345 B
Image
General
Full URL
https://www.pcgameshardware.de/bcommon/gfx/nextPageLinkArrow.svg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
3f278cac0893870edce9c0f4895150615ff63209b21e2e557721e6b6dcacd677
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/bcommon/css/b2_pcgameshardware/article.css?12362
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
731104
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Wed, 26 Apr 2017 10:01:30 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/svg+xml
cache-control
max-age=2592000
cf-ray
57511b66d9a4d6d9-FRA
expires
Tue, 07 Apr 2020 09:03:31 GMT
dmp
tracking.m6r.eu/sync/
97 B
633 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-53-21.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
0894860c3c10ee1e859b6b4a7c27da607e9fae0a2efb7e98dd511efe77a27102

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 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.pcgameshardware.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
108
6310.jpg
www.pcgameshardware.de/authors/babel/
5 KB
6 KB
Image
General
Full URL
https://www.pcgameshardware.de/authors/babel/6310.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
4f275e3771732bbad37fec49cc3b910b50d4e2eb019a5b25e6e9e0d45783704a
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept-Encoding
cf-cache-status
HIT
age
2203225
cf-polished
origSize=19026, status=webp_bigger
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
5566
x-clacks-overhead
GNU Terry Pratchett
last-modified
Tue, 26 Mar 2019 13:42:22 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/jpeg
expires
Sat, 21 Mar 2020 08:08:10 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b66fa03d6d9-FRA
cf-bgj
imgq:100
load.js
widget.perfectmarket.com/stroeer-computec-pcgameshardwarede/
3 KB
2 KB
Script
General
Full URL
https://widget.perfectmarket.com/stroeer-computec-pcgameshardwarede/load.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-computec-pcgameshardwarede/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.113.181 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
53c130ed85131f65ae707463cf9972773a921830efaf6225608b107e198ed6d7

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

x-amz-version-id
wRWugoghVnB90Xy3duUBFbomApPCLZ66
content-encoding
gzip
age
0
x-cache
HIT, MISS
status
200
date
Mon, 16 Mar 2020 20:08:35 GMT
content-length
1155
x-amz-id-2
cFNjPeO0UmLjYqcaLDt3OUPrfOH2SSo14E6TSo14yu1J3zfLqtncBdfU+3rZw307E/W0NCMZry4=
x-served-by
cache-lax8629-LAX, cache-hhn4025-HHN
last-modified
Fri, 21 Feb 2020 10:04:16 GMT
server
AmazonS3
x-timer
S1584389316.764718,VS0,VE164
etag
"fad9792dc6d601147293cfe35fb979af"
vary
Accept-Encoding,,
x-amz-request-id
5212E5D00FC720D7
via
1.1 varnish, 1.1 varnish
cache-control
max-age=300
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
x-cache-hits
1, 0
impl.20200315-35-RELEASE.js
cdn.taboola.com/libtrc/
445 KB
126 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/impl.20200315-35-RELEASE.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-computec-pcgameshardwarede/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
180d0b4abb228f7a8a1c979259041539d5af9db809a6fc02338feb2ceee96634

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

x-amz-version-id
ec0Hn9tNpNjUQkSU0dihT0e7pvNZjqym
content-encoding
gzip
age
116
x-cache
HIT
status
200
date
Mon, 16 Mar 2020 20:08:35 GMT
x-amz-replication-status
COMPLETED
content-length
128752
x-amz-id-2
dxjCKDbN54XPm8gErpYY3ulGI0bBxKBeYVDYjrjfGQJi4FRsx1la7GYmlfc9cDhkAvJNnbNNkco=
x-served-by
cache-fra19131-FRA
last-modified
Mon, 16 Mar 2020 07:48:07 GMT
server
AmazonS3
x-timer
S1584389316.714705,VS0,VE0
etag
"7b9030df4626f0e70fc7db5ace750ce4"
vary
Accept-Encoding
x-amz-request-id
CA15C50E98E583AA
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
65
x-cache-hits
1610
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-computec-pcgameshardwarede/loader.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.11.238.95 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-11-238-95.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a256529bd5b1b8846f8d2536ce7581fb6cea4479992f222d01535903dff48d79

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Mon, 16 Mar 2020 20:08:35 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
884
Expires
Tue, 17 Mar 2020 20:08:35 GMT
segment
api.cxense.com/profile/user/
77 B
647 B
Script
General
Full URL
https://api.cxense.com/profile/user/segment?callback=cXJsonpCBk7uwho5fvgkrv3bh&persisted=fc3abe261f02c0f548147da23b3675b2640ae212&json=%7B%22identities%22%3A%5B%7B%22id%22%3A%22k7uwho5egekaeoyf%22%2C%22type%22%3A%22cx%22%7D%5D%7D
Requested by
Host: scdn.cxense.com
URL: https://scdn.cxense.com/cx.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
147.75.85.120 Parsippany, United States, ASN54825 (PACKET, US),
Reverse DNS
Software
Jetty(9.2.z-SNAPSHOT) /
Resource Hash
c4f36585bc4292f006b8f5445f7f002e3205e5e33f6e92d166131f58366f9b2d
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

pragma
no-cache
date
Mon, 16 Mar 2020 20:08:35 GMT
x-content-type-options
nosniff
server
Jetty(9.2.z-SNAPSHOT)
p3p
policyref="http://www.cxense.com/w3c/p3p.xml", CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
cache-control
no-store, no-cache, must-revalidate
content-type
text/javascript; charset=UTF-8
content-length
77
expires
Mon, 26 Jul 1997 05:00:00 GMT
rep.gif
scomcluster.cxense.com/Repo/
43 B
467 B
Image
General
Full URL
https://scomcluster.cxense.com/Repo/rep.gif?ver=1&typ=pgv&rnd=k7uwho47t9rby1lb&acc=0&sid=1132874718538223433&loc=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&ref=&gol=&pgn=&ltm=1584389315671&new=0&arf=0&tzo=-60&res=1600x1200&dpr=1&col=24&jav=0&bln=en-US&cks=k7uwho5h6h3733mg&ckp=k7uwho5egekaeoyf&glb=&chs=UTF-8&wsz=1600x1200&amo=1568312880&cp_cmd-template=desktop&cp_cmd-userstatus=guest&fls=0&flv=
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.63.12.208 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
de716.cxense.com
Software
Jetty(9.2.z-SNAPSHOT) /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Date
Mon, 16 Mar 2020 20:08:35 GMT
Server
Jetty(9.2.z-SNAPSHOT)
Content-Type
image/gif
Content-Length
43
P3P
policyref="http://www.cxense.com/w3c/p3p.xml", CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
avatar_default.png
www.pcgameshardware.de/static/gfx/editors/
933 B
1 KB
Image
General
Full URL
https://www.pcgameshardware.de/static/gfx/editors/avatar_default.png
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
ae0ac548b351118d3035acaa48ed2397e244bc56d317b3bd3e9315bbfca70ab2
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Cookie, Accept-Encoding
cf-cache-status
HIT
age
2236720
cf-polished
pngoptimizer, origSize=2225, status=vary_header_present
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
933
x-clacks-overhead
GNU Terry Pratchett
last-modified
Thu, 16 Oct 2014 13:41:53 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/png
expires
Fri, 20 Mar 2020 22:49:55 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b676b26d6d9-FRA
cf-bgj
imgq:85
avatar82385_1.gif
extreme.pcgameshardware.de/customavatars/thumbs/
2 KB
2 KB
Image
General
Full URL
https://extreme.pcgameshardware.de/customavatars/thumbs/avatar82385_1.gif
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
ef0eeb62ddcb7860f2d4b731062f35a70fe508a039c06af5ebd3c5ed4479fa5b
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
cf-cache-status
HIT
age
729836
cf-polished
qual=85, origFmt=jpeg, origSize=2063
status
200
content-disposition
inline; filename="avatar82385_1.webp"
strict-transport-security
max-age=15552000; preload
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
1602
x-clacks-overhead
GNU Terry Pratchett
last-modified
Thu, 12 Jan 2012 18:05:59 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept
content-type
image/webp
cf-bgj
imgq:85
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b676b2dd6d9-FRA
expires
Tue, 07 Apr 2020 09:24:39 GMT
integrator.js
adservice.google.be/adsid/
109 B
778 B
Script
General
Full URL
https://adservice.google.be/adsid/integrator.js?domain=www.pcgameshardware.de
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
2a00:1450:4001:818::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
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"
timing-allow-origin
*
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
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.pcgameshardware.de
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
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
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"
timing-allow-origin
*
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
pubads_impl_2020030501.js
securepubads.g.doubleclick.net/gpt/
165 KB
60 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.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
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
8ee04e0441c9e51785d17ac835a93cf4d30d90826f87350b42ba233496a26f55
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 05 Mar 2020 14:08:10 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
61481
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:35 GMT
apstag.js
c.amazon-adsystem.com/aax2/
87 KB
25 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/apstag.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.201.153 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-201-153.fra53.r.cloudfront.net
Software
Server /
Resource Hash
ac2a58f9d55c4642121cfb6f7e213cbc882bbdd75ef171ca8a07ed982ef693ce

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Sun, 15 Mar 2020 22:00:55 GMT
content-encoding
gzip
server
Server
age
79660
etag
1dcfbf3986ee8b9c3abbc67eb808ab43
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
x-amz-cf-id
tgpSFWWpk-ncQI14-ZW8vJd2z5Og4EhGNZd3eRT3t7XRjYYhhooDDA==
via
1.1 80d90c7955dda88e3912960ead8e99d6.cloudfront.net (CloudFront)
session
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 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?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
access-control-allow-origin
*
date
Mon, 16 Mar 2020 20:08:35 GMT
footer_logo.png
www.pcgameshardware.de/static/gfx/
943 B
1 KB
Image
General
Full URL
https://www.pcgameshardware.de/static/gfx/footer_logo.png
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
0145284af291e8a8f9c04efb1b9b8d0bbdb422dd325a6fd6563faf5e33665e02
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/bcommon/css/b2_pcgameshardware/general.css?12362
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept-Encoding
cf-cache-status
HIT
age
480084
cf-polished
pngoptimizer, origSize=2871
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
943
x-clacks-overhead
GNU Terry Pratchett
last-modified
Fri, 20 Mar 2015 09:35:26 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/png
expires
Fri, 10 Apr 2020 06:47:11 GMT
cache-control
max-age=2592000
accept-ranges
bytes
cf-ray
57511b67abdcd6d9-FRA
cf-bgj
imgq:100
arj
yieldlove-d.openx.net/w/1.0/
172 B
575 B
XHR
General
Full URL
https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-60&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=86029a2c-6ee4-47da-a15d-bb2f2ac2f93f&nocache=1584389315812&aus=300x250&divIds=rectangle&auid=539417461&
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.179.0 /
Resource Hash
f54aa2c65627448abac09eb4845cc746f9a21a83a69d930b28b750df2dca73b6

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
gzip
server
OXGW/16.179.0
status
200
vary
Accept, Accept-Encoding
p3p
CP="CUR ADM OUR NOR STA NID"
access-control-allow-origin
https://www.pcgameshardware.de
cache-control
private, max-age=0, no-cache
access-control-allow-credentials
true
content-type
application/json
alt-svc
clear
content-length
163
via
1.1 google
expires
Mon, 26 Jul 1997 05:00:00 GMT
cygnus
as-sec.casalemedia.com/
24 B
994 B
XHR
General
Full URL
https://as-sec.casalemedia.com/cygnus?s=341871&v=7.2&r=%7B%22id%22%3A%223ef18fd968906b%22%2C%22imp%22%3A%5B%7B%22id%22%3A%2249c51eb3dea758%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%22341871%22%2C%22sid%22%3A%221%22%7D%7D%2C%7B%22id%22%3A%2254a6d02b3cefbe%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%22346698%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2269784c586efb8c%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%22346698%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2273c2be9c384804%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%22346698%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%22863fe3f90a28c1%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%22346698%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2294790d0308a532%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%22346698%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2210fc1229b0f9a86%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%22346699%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%221108c403668d4e3%22%2C%22banner%22%3A%7B%22w%22%3A728%2C%22h%22%3A180%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22346699%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%2212e7ce8c2631b93%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%22346699%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%221315ef2df5cbaa1%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%22346699%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%22144bae85731ebb6%22%2C%22banner%22%3A%7B%22w%22%3A770%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22346699%22%2C%22sid%22%3A%224%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%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?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
92.122.254.129 , Ascension Island, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a92-122-254-129.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
1261681dc554639577db178c8786ae40a6c72732d892308c7eabbe798872a0fc

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:36 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.pcgameshardware.de
Cache-Control
max-age=0, no-cache, no-store
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json
Content-Length
44
Expires
Mon, 16 Mar 2020 20:08:36 GMT
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.139.58 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:35 GMT
X-SMRT-D
6%3b11%3b70
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.pcgameshardware.de
Cache-Control
no-cache,no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
9817382,9777712,9817385
ad.yieldlab.net/yp/
2 B
770 B
XHR
General
Full URL
https://ad.yieldlab.net/yp/9817382,9777712,9817385?ts=1584389315814&json=true
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.61.243.29 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-61-243-29.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:35 GMT
Content-Encoding
gzip
p3p
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Language
en-US
Access-Control-Allow-Origin
https://www.pcgameshardware.de
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=UTF-8
Access-Control-Allow-Headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
Content-Length
28
Expires
Sun, 15 Mar 2020 20:08:35 GMT
prebid
ib.adnxs.com/ut/v3/
378 B
1 KB
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.80 , Netherlands, ASN29990 (ASN-APPNEX, US),
Reverse DNS
251.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
f11bf8423c0aaca5b0762276eecc75f2cae5987c4008145ddcce92c9bde03982
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:37 GMT
X-Proxy-Origin
194.187.251.52; 194.187.251.52; 251.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.10:80
AN-X-Request-Uuid
fd4612cb-a2ba-4e04-82e0-6015fbeb4562
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
https://www.pcgameshardware.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
378
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
translator
hbopenbid.pubmatic.com/
0
121 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?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
185.64.189.112 , United Kingdom, ASN62713 (AS-PUBMATIC, US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:35 GMT
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
access-control-allow-origin
https://www.pcgameshardware.de
v1
dmx.districtm.io/b/
0
468 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?pcgameshardware.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.16.68.69 , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

Access-Control-Request-Method
POST
Origin
https://www.pcgameshardware.de
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Access-Control-Request-Headers
content-type

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
cf-cache-status
DYNAMIC
server
cloudflare
access-control-allow-origin
https://www.pcgameshardware.de
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
status
204
access-control-max-age
14400
access-control-allow-credentials
true
strict-transport-security
max-age=31536000; includeSubDomains; preload
cf-ray
57511b682cc5bdfa-AMS
access-control-allow-headers
origin, content-type
prebid
ib.adnxs.com/ut/v3/
19 B
719 B
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.80 , Netherlands, ASN29990 (ASN-APPNEX, US),
Reverse DNS
251.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
0c09c070833c786cb25be38bc30992b30bad578f817dbc9e34beacd8b8ea44c5
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:37 GMT
X-Proxy-Origin
194.187.251.52; 194.187.251.52; 251.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.48:80
AN-X-Request-Uuid
c87c4de9-3c61-4cb3-95ad-52f288caf70d
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
https://www.pcgameshardware.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
19
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
cdb
bidder.criteo.com/
0
152 B
XHR
General
Full URL
https://bidder.criteo.com/cdb?profileId=207&av=16&wv=2.24.0&cb=48767019954
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
178.250.0.165 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
Finatra /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:35 GMT
access-control-allow-credentials
true
server
Finatra
access-control-allow-origin
https://www.pcgameshardware.de
timing-allow-origin
*
vary
Origin
bid
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 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?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
access-control-allow-origin
*
date
Mon, 16 Mar 2020 20:08:35 GMT
auction
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 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?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
access-control-allow-origin
*
date
Mon, 16 Mar 2020 20:08:35 GMT
%2F4444%2Fdisp_ctc_pcgameshardware.de_sd%2Fartikel_standard%2Fbanner,%2F4444%2Fdisp_ctc_pcgameshardware.de_sd%2Fartikel_standard%2Fsky,%2F4444%2Fdisp_ctc_pcgameshardware.de_sd%2Fartikel_standard%2F...
s385.mxcdn.net/679600/
985 B
1 KB
XHR
General
Full URL
https://s385.mxcdn.net/679600/%2F4444%2Fdisp_ctc_pcgameshardware.de_sd%2Fartikel_standard%2Fbanner,%2F4444%2Fdisp_ctc_pcgameshardware.de_sd%2Fartikel_standard%2Fsky,%2F4444%2Fdisp_ctc_pcgameshardware.de_sd%2Fartikel_standard%2Frectangle
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
92.122.254.186 , Ascension Island, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a92-122-254-186.deploy.static.akamaitechnologies.com
Software
nginx/1.10.3 /
Resource Hash
432e8930dae35dd8549c0ffa3a92a0caa1c47785194bcc45b5f65c2249b7e20c

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
Server
nginx/1.10.3
Content-Type
application/json
Access-Control-Allow-Origin
https://www.pcgameshardware.de
Access-Control-Expose-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range
Cache-Control
max-age=28447
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
985
Expires
Tue, 17 Mar 2020 04:02:42 GMT
24.gif
stats.computecmedia.de/
807 B
2 KB
Image
General
Full URL
https://stats.computecmedia.de/24.gif?c_pcgh_ArticlePage_TelekommunikationInternetdienste&content=a&tid=1&gid=-1&sid=24&bAdvertorial=false&aAuthor=[6310]&aage=2019-09-12t20-28&ptid=216880,5073&a_icategoryid=-1&aid=1332425&page=1&r=&bax=true&zRnd=20315.417456971874&a_ibanners=1&a_iskyscrapers=1&a_irectangles=3&a_ilayers=1&a_iothers=2&uuid=5e6fdcc33ca2e&cp=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.146.104.136 , Germany, ASN15598 (QSC-AG-IPX, DE),
Reverse DNS
Software
Apache/2.4.25 /
Resource Hash
7f1182ed0bcc2206a25585a3d1b49a695b65b5aeb80027d9ebba970c40f9740c

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:35 GMT
X-Clacks-Overhead
GNU Terry Pratchett
X-MWDEBUG-REF
0
X-MWDEBUG
do track article page view
Server
Apache/2.4.25
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Last-Modified
Mon, 16 Mar 2020 20:08:35 GMT
Content-Disposition
inline; filename=24.gif
Connection
Keep-Alive
Keep-Alive
timeout=4, max=500
Expires
Mon, 26 Jul 1997 05:00:00 GMT
submit
lb35.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb35.s400.meetrics.net/bb-mx/submit?/hQk4BTAAA/whF2Bo0F0wFz6BvvA33F3uBwjFnhFtlFzoFhyFk3FhyFluBklFvpEQoFvuFltBTlFypFltBTtFhyF0wFovFulFtyAx2A44AwvAOlF3zFvxAxtAQyFvtB1uFktBNhF4tBElF0hFpsFztBBrFr1FtLEhwFh6Fp0FhlF0tBSBFNtBxzAzyA0yA1vAfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSMMBPAAAAAAAAAOAAAAGBAAAAAAZwSMMBBRksFAQtjF8b/HTA
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:35 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Mon, 16 Mar 2020 20:08:34 GMT
data
lb35.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb35.s400.meetrics.net/data?/hQk4CTAAATkzFARksFAQtjFfrJNSA
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:35 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 16-Mar-20 20:08:34 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43099:uniques_instantly[domain:www.pcgameshardware.de,url:%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F,page:iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM,author:No%20Author,language:de,site_skin:desktop,custom_page_type:Article%20page,reference_time:84,article_layout:default,category:news,type_article:shortread,pub_date:12%20Sep%202019%2020%3A28%3A00%20CEST,user_agent:Mozilla%2F5.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,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:aa0c4043a.f9d2c0cfb_1584389315604,session_id:924fa9a7a.cc487ad52_1584389315919,cdn_version:16]&s=cd2ea0ee84729421a1b2d2efabec8ba5&1584389315924
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/I99SivONLxYO
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:36 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43099:visits_instantly[domain:www.pcgameshardware.de,url:%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F,page:iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM,author:No%20Author,language:de,site_skin:desktop,custom_page_type:Article%20page,reference_time:84,article_layout:default,category:news,type_article:shortread,pub_date:12%20Sep%202019%2020%3A28%3A00%20CEST,user_agent:Mozilla%2F5.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,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:aa0c4043a.f9d2c0cfb_1584389315604,session_id:924fa9a7a.cc487ad52_1584389315919,cdn_version:16]&s=cd2ea0ee84729421a1b2d2efabec8ba5&__io=aa0c4043a.f9d2c0cfb_1584389315604&1584389315927
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/I99SivONLxYO
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:36 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43099:pageviews[domain:www.pcgameshardware.de,url:%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F,page:iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM,author:No%20Author,language:de,site_skin:desktop,custom_page_type:Article%20page,reference_time:84,article_layout:default,category:news,type_article:shortread,pub_date:12%20Sep%202019%2020%3A28%3A00%20CEST,user_agent:Mozilla%2F5.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,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:aa0c4043a.f9d2c0cfb_1584389315604,session_id:924fa9a7a.cc487ad52_1584389315919,cdn_version:16]&s=cd2ea0ee84729421a1b2d2efabec8ba5&1584389315930
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/I99SivONLxYO
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:36 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
CIqNVwv8_BFDDDECE.png
www.pcgameshardware.de/screenshots/380x214/2015/
68 B
241 B
Image
General
Full URL
https://www.pcgameshardware.de/screenshots/380x214/2015/CIqNVwv8_BFDDDECE.png
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
vary
Accept-Encoding
cf-cache-status
BYPASS
x-powered-by
AdDefend GmbH
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
68
pragma
no-cache
x-clacks-overhead
GNU Terry Pratchett
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/png
cache-control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private
accept-ranges
bytes
cf-ray
57511b689ea5d6d9-FRA
expires
0
nuggad
ih.adscale.de/
49 B
278 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d7=2&d10=4&d4=3&d11=3&d8=2&d9=2&d12=3&d1=1&d3=3
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.185.150.7 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-185-150-7.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

status
200
date
Mon, 16 Mar 2020 20:08:36 GMT
server
Apache-Coyote/1.1
p3p
CP=NOI PSA OUR
content-length
49
content-type
image/gif
api
cdn.m6r.eu/sync/
1 KB
1 KB
Script
General
Full URL
https://cdn.m6r.eu/sync/api
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.60.16.116 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-60-16-116.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Mon, 16 Mar 2020 20:08:39 GMT
Content-Encoding
gzip
Last-Modified
Fri, 06 Mar 2020 11:37:42 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
max-age=86400
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
654
Expires
Tue, 17 Mar 2020 20:08:39 GMT
v1
dmx.districtm.io/b/
0
0

lato-v16-latin-ext-400.woff
player.pcgameshardware.de/fonts/ Frame FABB
30 KB
30 KB
Font
General
Full URL
https://player.pcgameshardware.de/fonts/lato-v16-latin-ext-400.woff
Requested by
Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
8badcd604652360c68c0677ba0772d2973f2cfe293b5679fec3d1d63018d396e
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Origin
https://player.pcgameshardware.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
731096
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Wed, 27 Nov 2019 10:40:27 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/font-woff
access-control-allow-origin
*
cache-control
max-age=2592000
cf-ray
57511b68aee7d6d9-FRA
expires
Tue, 07 Apr 2020 09:03:39 GMT
lato-v16-latin-ext-700.woff
player.pcgameshardware.de/fonts/ Frame FABB
30 KB
30 KB
Font
General
Full URL
https://player.pcgameshardware.de/fonts/lato-v16-latin-ext-700.woff
Requested by
Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
66bdd962ad3c4a394964e44600d43808fc3377e3323e00c86213c2564aae5651
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Origin
https://player.pcgameshardware.de
Sec-Fetch-Dest
font
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
1762074
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Wed, 27 Nov 2019 10:40:27 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/font-woff
access-control-allow-origin
*
cache-control
max-age=2592000
cf-ray
57511b68aee8d6d9-FRA
expires
Thu, 26 Mar 2020 10:40:41 GMT
b2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1584389315950&ns_c=UTF-8&cv=3.5&c8=iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM&c7=h...
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1584389315950&ns_c=UTF-8&cv=3.5&c8=iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM&c7=...
0
248 B
Image
General
Full URL
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1584389315950&ns_c=UTF-8&cv=3.5&c8=iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM&c7=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&c9=
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.11.238.95 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-11-238-95.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:36 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=1584389315950&ns_c=UTF-8&cv=3.5&c8=iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM&c7=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&c9=
Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:35 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
iam.js
script.ioam.de/ Frame FABB
24 KB
9 KB
Script
General
Full URL
https://script.ioam.de/iam.js?m=1
Requested by
Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.64 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script3.ioam.de
Software
nginx / BLACKBIRD-SRC v0.13 000f
Resource Hash
09381e339f76cfa3c58589485e77387d5f049ae28890da3d65af3c671fd6ee81

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Mon, 16 Mar 2020 20:08:35 GMT
Content-Encoding
gzip
Last-Modified
Mon, 16 Mar 2020 20:08:35 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.13 000f
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
private, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Mon, 16 Mar 2020 22:08:35 GMT
ima3.js
imasdk.googleapis.com/js/sdkloader/ Frame FABB
264 KB
90 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:80b::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
f34922bc830fe07b84412052407d933809cf522f9ba778b2511fe7575a0e3486
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 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
91752
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:35 GMT
video.full.min.css
player.pcgameshardware.de/dist/ Frame FABB
84 KB
29 KB
Stylesheet
General
Full URL
https://player.pcgameshardware.de/dist/video.full.min.css?v=d2d8535c8ac6d2e13637065718340766
Requested by
Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
2183bad6dcd8943484d95863256716aaabc71e3da28f52be9d07f4b9c4f0fc62
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
User-Agent
Mozilla/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-Dest
style

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
1762074
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Wed, 27 Nov 2019 10:40:27 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
text/css
cache-control
max-age=2592000
cf-ray
57511b68bef7d6d9-FRA
expires
Thu, 26 Mar 2020 10:40:41 GMT
video.full.min.js
player.pcgameshardware.de/dist/ Frame FABB
653 KB
160 KB
Script
General
Full URL
https://player.pcgameshardware.de/dist/video.full.min.js?v=d2d8535c8ac6d2e13637065718340766
Requested by
Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
c163ef1dca570a8e257a43d5bf848bee6876ec870822246f2f3f65fb62b3496b
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
1762074
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Wed, 26 Jun 2019 10:27:27 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
application/javascript
cache-control
max-age=2592000
cf-ray
57511b68bef9d6d9-FRA
expires
Thu, 26 Mar 2020 10:40:41 GMT
I99SivONLxYO
cdn.onthe.io/io.js/ Frame FABB
74 KB
28 KB
Script
General
Full URL
https://cdn.onthe.io/io.js/I99SivONLxYO
Requested by
Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
116.203.211.59 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.59.211.203.116.clients.your-server.de
Software
nginx /
Resource Hash
56b412f0c66920c48c0fc59a2cec3173ccd18b4d1b06747355454dba0ffdae46

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Mon, 16 Mar 2020 20:08:35 GMT
Content-Encoding
gzip
Last-Modified
Wed, 29 Jan 2020 15:08:44 GMT
Server
nginx
ETag
W/"5e319ffc-128f8"
Transfer-Encoding
chunked
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Expires
Sat, 29 Feb 2020 15:08:56 GMT
ads
securepubads.g.doubleclick.net/gampad/
25 KB
6 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=251194220074141&correlator=2537393434496966&output=ldjh&impl=fifs&adsid=NT&eid=21064522&vrg=2020030501&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200316&iu_parts=4444%2Cdisp_ctc_pcgameshardware.de_sd%2Cartikel_standard&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C728x90%7C728x180%7C31x31%2C10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31%2C10x20%7C10x10%7C300x250%7C300x601%7C34x31&prev_scp=as%3Dbanner%26adslot%3Dbanner%26af%3Dds%2Cbri%2Cf2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cstbb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cvto%26pc%3D1%26yieldlove_reload%3Dpid%253A9559.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A9559.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A9559.scenario%253Adefault%26yieldlove_meta%3Dpid%253A9559.sb%253Af%26yieldlove_pid%3D9559%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%7Cas%3Dsky%26adslot%3Dsky%26af%3Dfirepl%2Cwp%2Cvidwa%2Cbri%2Cf1x4%2Cf1x3%2Cf1x2%2Cds%2Cdds%2Csky%2Chpad%2Cband%26rfree%3D400-499%26pc%3D1%26yieldlove_reload%3Dpid%253A9560.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A9560.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A9560.scenario%253Adefault%26yieldlove_meta%3Dpid%253A9560.sb%253Af%26yieldlove_pid%3D9560%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26mtrcskv%3D100-1_75%2C50-1_75%2C50-1_100%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%7Cas%3Drectangle%26adslot%3Drectangle%26pc%3D1%26yieldlove_reload%3Dpid%253A9589.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A9589.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A9589.scenario%253Adefault%26yieldlove_meta%3Dpid%253A9589.sb%253Af%26yieldlove_pid%3D9589%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26mtrcskv%3D100-1_75%2C50-1_75%2C50-1_100%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%26af%3Df1x2%2Cf1x1%2Cmrec&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D406234227e2a1d846150e4fae9b08605%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26kvcxsegments%3D%26nuggad%3Dn127-0%252Cn31-1%252Cn121-2%252Cn116-0%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-0%252Cn160-0%252Cn28-1%252Cn107-0%252Cn21-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn36-1%252Cn119-5%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-1%252Cn26-1%252Cn99-1%252Cn128-1%252Cn73-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn16-1%252Cn79-0%252Cn93-4%252Cn90-0%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-1%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-1%252Cn33-1%252Cn59-1%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-2%252Cn32-1%252Cn67-1%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-1%252Cn41-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-0%252Cn133-1%26keywords%3Diphone%252Capple&cookie_enabled=1&bc=31&abxe=1&lmt=1584389315&dt=1584389315974&dlt=1584389315334&idt=622&frm=20&biw=1585&bih=1200&oid=3&adxs=653%2C1173%2C993&adys=120%2C220%2C247&adks=2479418200%2C3511023609%2C3888641151&ucis=1%7C2%7C3&ifi=1&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.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&dssz=62&icsg=273837762623&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1020x10%7C10x40%7C300x20&msz=1020x10%7C10x40%7C300x20&ga_vid=766020357.1584389316&ga_sid=1584389316&ga_hid=1796390970&fws=4%2C4%2C4&ohw=1585%2C1585%2C1585
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
95089852f486979770ba35460afa6ef9392b6fc143a31c804fb703075d465661
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:36 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2,-2,-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
5842
x-xss-protection
0
google-lineitem-id
5321470762,5321470762,5321470762
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138288671472,138289040128,138288738701
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.pcgameshardware.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_2020030501.js
securepubads.g.doubleclick.net/gpt/
69 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
sffe /
Resource Hash
ffdc18ac8f47bcd50dd9c33532c334e7073717a62b367d95b9cb1561048547dc
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:35 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 05 Mar 2020 14:08:10 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
25689
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:35 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
empty

Response headers

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
143.204.201.153 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-143-204-201-153.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 08:31:08 GMT
content-encoding
gzip
vary
Origin
age
41849
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
*
last-modified
Thu, 05 Mar 2020 08:28:46 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
via
1.1 befe3b8553d90339ecf78e5d7cefa60b.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA53-C1
x-amz-cf-id
O0v2IOLvdu40z3xJREo71CmBFBkQe5mTPIi12E1XsIykKJ_YtzcmSw==
config.js
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
36 KB
9 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?pcgameshardware.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, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
113b50da257d5606e80b319cf32c84f2aa9aa10deeb8e2e4d9eae38669712af3

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Mon, 16 Mar 2020 20:08:36 GMT
Content-Encoding
gzip
Age
2491
X-Cache
HIT
Connection
keep-alive
Content-Length
8187
x-amz-id-2
GZ1BvYuv970XI+YS1WOjsWJqVrU7HQBF17KLYlGAsvvbgXZHf93NMK00HqjXWdveOzlhtTmqiKU=
X-Served-By
cache-fra19129-FRA
Last-Modified
Mon, 16 Mar 2020 17:48:57 GMT
Server
AmazonS3
X-Timer
S1584389316.309962,VS0,VE0
ETag
"191e3212c54b330913ad098a4548afc7"
x-amz-request-id
1CB9AC35C7447018
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
8463
pmk-202002191.4.js
widget.perfectmarket.com/stroeer-computec-pcgameshardwarede/
111 KB
31 KB
Script
General
Full URL
https://widget.perfectmarket.com/stroeer-computec-pcgameshardwarede/pmk-202002191.4.js
Requested by
Host: widget.perfectmarket.com
URL: https://widget.perfectmarket.com/stroeer-computec-pcgameshardwarede/load.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.113.181 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
eb488650c338b2fbea85567a2b52a3ec17d643b25a030f48d3913814aaa7c1aa

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

x-amz-version-id
SPyoegktPlWa8l1yKh0izIswxP68xL4q
content-encoding
gzip
age
2109822
x-cache
HIT, HIT
status
200
date
Mon, 16 Mar 2020 20:08:36 GMT
content-length
30950
x-amz-id-2
QIE/NFxtTgpGiJvwLVss4yJvtA+Vnr23IQP2zvrBTWl4rNEGPdr5j6aanu5b4oBqPfcYe8xgcn8=
x-served-by
cache-lax8642-LAX, cache-hhn4025-HHN
last-modified
Fri, 21 Feb 2020 10:04:16 GMT
server
AmazonS3
x-timer
S1584389316.017603,VS0,VE0
etag
"6173da43f917ce54a13325d125669ffa"
vary
Accept-Encoding,,
x-amz-request-id
7CB60BB0CDA320DF
via
1.1 varnish, 1.1 varnish
cache-control
max-age=31536000
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
x-cache-hits
1, 1823
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/ Frame FABB
53 B
714 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json
Requested by
Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.178.5 Ashburn, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Origin
https://player.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:37 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
3893F09F9B68C325
Content-Length
53
x-amz-id-2
r7Rbb0p/qn3UfgXY8/Au9dxBgdfi3829F0/9lfUWKsOde+kT1hXmT53WfCZOc+dyU3GvFiSMdD8=
Last-Modified
Mon, 16 Mar 2020 19:26:04 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://player.pcgameshardware.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
0
homadConfigJson.cfm
player.pcgameshardware.de/app/ Frame FABB
334 B
264 B
XHR
General
Full URL
https://player.pcgameshardware.de/app/homadConfigJson.cfm
Requested by
Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
606dd07fdfe7b4f1440a8be46195687a04a21435a9691a7ba496759139f4ce78
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
User-Agent
Mozilla/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-Dest
empty

Response headers

date
Mon, 16 Mar 2020 20:08:36 GMT
content-encoding
br
x-clacks-overhead
GNU Terry Pratchett
cf-cache-status
DYNAMIC
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/json;charset=UTF-8
status
200
cache-control
max-age=0
strict-transport-security
max-age=15552000; preload
cf-ray
57511b69283fd6d9-FRA
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
expires
Mon, 16 Mar 2020 20:08:36 GMT
CIqNVwv8_FCDEBBFC.jpg
www.pcgameshardware.de/screenshots/147x110/2018/adinclude/
68 B
157 B
Image
General
Full URL
https://www.pcgameshardware.de/screenshots/147x110/2018/adinclude/CIqNVwv8_FCDEBBFC.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:36 GMT
vary
Accept-Encoding
cf-cache-status
BYPASS
x-powered-by
AdDefend GmbH
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
68
pragma
no-cache
x-clacks-overhead
GNU Terry Pratchett
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/png
cache-control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private
accept-ranges
bytes
cf-ray
57511b692846d6d9-FRA
expires
0
CIqNVwv8_BCBBDCCC.jpg
www.pcgameshardware.de/screenshots/74x96/2010/adinclude/
68 B
129 B
Image
General
Full URL
https://www.pcgameshardware.de/screenshots/74x96/2010/adinclude/CIqNVwv8_BCBBDCCC.jpg
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

date
Mon, 16 Mar 2020 20:08:36 GMT
vary
Accept-Encoding
cf-cache-status
BYPASS
x-powered-by
AdDefend GmbH
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
content-length
68
pragma
no-cache
x-clacks-overhead
GNU Terry Pratchett
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
image/png
cache-control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private
accept-ranges
bytes
cf-ray
57511b692849d6d9-FRA
expires
0
81933.jpg
icdn.computec.de/videos/img/medium/2019/9/ Frame FABB
106 KB
106 KB
Image
General
Full URL
https://icdn.computec.de/videos/img/medium/2019/9/81933.jpg?t=1568221080
Requested by
Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.146.104.136 , Germany, ASN15598 (QSC-AG-IPX, DE),
Reverse DNS
Software
Apache/2.4.25 /
Resource Hash
03ca4c0ca6ea501c4138d0e85e7d32b1d8878462b24317a1a020b040009fc81b

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
User-Agent
Mozilla/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-Dest
image

Response headers

Date
Mon, 16 Mar 2020 20:08:36 GMT
X-Clacks-Overhead
GNU Terry Pratchett
Last-Modified
Wed, 11 Sep 2019 15:00:03 GMT
Server
Apache/2.4.25
Content-Type
image/jpeg
Cache-Control
max-age=2592000
Connection
Keep-Alive
Accept-Ranges
bytes
Keep-Alive
timeout=4, max=498
Content-Length
108463
Expires
Wed, 15 Apr 2020 20:08:36 GMT
c0b84014-add6-4cf1-a366-402d2918eead
https://player.pcgameshardware.de/ Frame FABB
31 B
0
Other
General
Full URL
blob:https://player.pcgameshardware.de/c0b84014-add6-4cf1-a366-402d2918eead
Requested by
Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/dist/video.full.min.js?v=d2d8535c8ac6d2e13637065718340766
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d

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
Sec-Fetch-Dest
worker

Response headers

Content-Length
31
Content-Type
application/javascript
analytics.js
www.google-analytics.com/ Frame FABB
44 KB
18 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/dist/video.full.min.js?v=d2d8535c8ac6d2e13637065718340766
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
User-Agent
Mozilla/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-Dest
script

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 06 Feb 2020 00:21:02 GMT
server
Golfe2
age
5704
date
Mon, 16 Mar 2020 18:33:32 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
18174
expires
Mon, 16 Mar 2020 20:33:32 GMT
truncated
/ Frame FABB
720 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
5eedb50a3ac1e86b8c5c6f9be4e34de08759be124bf8d4237452ad16ab1c299c

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/svg+xml
config.json
hgc-cf-cache-1.svonm.com/www.pcgameshardware.de/ Frame FABB
379 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.pcgameshardware.de/config.json
Requested by
Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.194.65 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-224-194-65.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
639feb879746e27c7d840e578e49c0da546a3ad6c16851b8d1bfe085d8f50a37

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Origin
https://player.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:07:59 GMT
Via
1.1 d7e55181ad8192e74c103c6003cd4d9c.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
38
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
379
Last-Modified
Tue, 10 Mar 2020 09:58:40 GMT
Server
AmazonS3
ETag
"5f7074c3f0bef08e9d7c218d0d385fb2"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://player.pcgameshardware.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA2-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
BFG4052jV88uOEGdO5mHDv4C4Wn6HrUjJAewaJzT2uvApKfRoDMeOg==
Expires
Thu, 01 Jan 1970 00:00:00 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43067:uniques_holding&s=cd2ea0ee84729421a1b2d2efabec8ba5&__io=aa0c4043a.f9d2c0cfb_1584389315604&1584389316137
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/I99SivONLxYO
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:36 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
beacon.js
sb.scorecardresearch.com/
1 KB
1 KB
Script
General
Full URL
https://sb.scorecardresearch.com/beacon.js
Requested by
Host: widget.perfectmarket.com
URL: https://widget.perfectmarket.com/stroeer-computec-pcgameshardwarede/pmk-202002191.4.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.11.238.95 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-11-238-95.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a256529bd5b1b8846f8d2536ce7581fb6cea4479992f222d01535903dff48d79

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Mon, 16 Mar 2020 20:08:36 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
884
Expires
Tue, 17 Mar 2020 20:08:36 GMT
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/202003161204/
32 KB
13 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/202003161204/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, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
2bce7831bf8bbc8f8768b7f73e529f4957146e9ab42d442070aa5333df1d2f8f

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Mon, 16 Mar 2020 20:08:36 GMT
Content-Encoding
gzip
Age
498
X-Cache
HIT
Connection
keep-alive
Content-Length
12225
x-amz-id-2
wNuwNA5Niu2eM12a2X6InCW1Eh/wSw1ZCq3A2meBcglxT3zVyT0h1OvR3kX0Ib9PoRu8u8j5NcI=
X-Served-By
cache-fra19129-FRA
Last-Modified
Mon, 16 Mar 2020 16:05:03 GMT
Server
AmazonS3
X-Timer
S1584389316.336209,VS0,VE0
ETag
"b7198d733961633dedb25613aef920e2"
x-amz-request-id
D2B98EE3318A3ED9
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
2029
view
securepubads.g.doubleclick.net/pcs/ Frame 3797
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssGqqt66R8V17pEZR1XY9FsIYxhtwNNspX-WX_1ffGyfvHtsvJGFIIEigBo41ai9pguFFTR0a-6y5kvm1bVeRa-bVV9ULp2DHGeNfF5D-6vSeg3_EZ0-vSA89W8TP1bBT4WN3SoOUaK05uPy8hQn_iijSdd47vMK_MQvtmJZF2Zv3BlA2GgN7qUrlNtFC_6xyFCRtup86a3tfTs9-Ztm2aNHXZW4ODaUITuUV7Y4Rz4tkIo1xujjTmW4Sr23kyARvdlQrIoGhLeD-z8Qpqylckh9GHowMGGolreqhIIcjcMkmC_Q9Znc552GrDUsvdDybOHk2whJLUz_aW09Q&sai=AMfl-YRORKCVshXqnl5BISwVe_Nk-r2bvw-8bZNaBCOp5buNholvQdNZXkYDR5QxsknAnbErD-dpgsRnjFWKa7Oi5KckVT_dGYy5HIL0eNo0&sig=Cg0ArKJSzKTRXmXgvH8iEAE&urlfix=1&adurl=
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
empty

Response headers

timing-allow-origin
*
date
Mon, 16 Mar 2020 20:08:36 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
expires
Mon, 16 Mar 2020 20:08:36 GMT
itfudnuj.js
ad4m.at/ Frame 3797
48 KB
15 KB
Script
General
Full URL
https://ad4m.at/itfudnuj.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
UploadServer /
Resource Hash
e7eae6fcdd3e32fc17a22ed0e05481003e797b671a414c0953031ed84e7104a2

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 19:22:01 GMT
content-encoding
gzip
age
2795
status
200
x-guploader-uploadid
AEnB2Uo--nssP76nGZtFI0ZmuEHMl1RKWL3oCh3_3OvIiJM-Q-e2PTJDmosaIgksOyED15cBTDwetvlxlUMFH8zVN11Pfp-2sw
x-goog-storage-class
MULTI_REGIONAL
x-goog-metageneration
1
x-goog-stored-content-encoding
gzip
alt-svc
clear
content-length
14460
last-modified
Sun, 16 Feb 2020 15:08:22 GMT
server
UploadServer
etag
"976a005d2df079cd0801e468ad5fe9ce"
x-goog-hash
crc32c=HLWAxQ==, md5=l2oAXS3wec0IAeRorV/pzg==
x-goog-generation
1581865702820976
cache-control
public, max-age=3600, no-transform
x-goog-stored-content-length
14460
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
expires
Mon, 16 Mar 2020 20:22:01 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 3797
73 KB
28 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_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1584099738113808"
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
28086
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:36 GMT
osd.js
www.googletagservices.com/activeview/js/current/
73 KB
27 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
909009056877bdbc198a45c7adec7d4b0615aa97d0a4d61ac493472dd0b4a97f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1584217929168357"
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
27546
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:36 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame C870
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstiWrjq5PVbpI1mAXkGreSB6faIeaxw-9dVmJ_feta_jGPx2qVIAZ_yHGURCVNnPsL6ARkgi8w6CtJ56qah_AX0DF4UvK_fGhsgN42jap8awzNQTQPMqcRMyi9Aq_5TfiTeB7kDzptsdX_qiHzZwiD3L4OzCqFKEui5TcgeESrkF5SCmURiOLDl7-XYLaaj2doQNK3YLR0cUpVDMFxTCkLyPzLAK8h3KvStYeQylzkP2cU0VQvLPLsi_M9D3gu9aTQqCX2If31gfyVWXAgUQ6ex5fG-CbYIwFZ5BsruFO-sjHLUkFIf6XR0zr3eOjZP8fUx7N4WjK7igjiOGcIl-w&sai=AMfl-YQXXRxj1D6Wgo42Qr6P2fFBhvzQLPGYGU6hV9mTp71sMkzZeoj-EnPOXxTAhEC1UkLB1r4sAF1ZwTabdH6k2HPsUyXXy1bJBS2_qpvB&sig=Cg0ArKJSzCW8znRydy4UEAE&urlfix=1&adurl=
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
empty

Response headers

timing-allow-origin
*
date
Mon, 16 Mar 2020 20:08:36 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
expires
Mon, 16 Mar 2020 20:08:36 GMT
itfudnuj.js
ad4m.at/ Frame C870
48 KB
14 KB
Script
General
Full URL
https://ad4m.at/itfudnuj.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
UploadServer /
Resource Hash
e7eae6fcdd3e32fc17a22ed0e05481003e797b671a414c0953031ed84e7104a2

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 19:22:01 GMT
content-encoding
gzip
age
2795
status
200
x-guploader-uploadid
AEnB2Uo--nssP76nGZtFI0ZmuEHMl1RKWL3oCh3_3OvIiJM-Q-e2PTJDmosaIgksOyED15cBTDwetvlxlUMFH8zVN11Pfp-2sw
x-goog-storage-class
MULTI_REGIONAL
x-goog-metageneration
1
x-goog-stored-content-encoding
gzip
alt-svc
clear
content-length
14460
last-modified
Sun, 16 Feb 2020 15:08:22 GMT
server
UploadServer
etag
"976a005d2df079cd0801e468ad5fe9ce"
x-goog-hash
crc32c=HLWAxQ==, md5=l2oAXS3wec0IAeRorV/pzg==
x-goog-generation
1581865702820976
cache-control
public, max-age=3600, no-transform
x-goog-stored-content-length
14460
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
expires
Mon, 16 Mar 2020 20:22:01 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame C870
73 KB
28 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_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1584099738113808"
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
28086
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:36 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 0E79
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsub0cgU-5IQ0HrHSqb4ueQP_ETdKpdl2A3Ebp1dL6Ia5gsWDtvcWuhlYZozzXA2GIKYJOO1fURk2WBItTq-ax4rWzXgePP6uext45Of12cBUGSPyE_6-OoIgRf1DaTBH1SoLG2m0k40EsEAkZDMEk1OU-Bt9tIarRV8cWO13ork5wU0rM2aTZcn-Ry1M_xncBaCENJ0qzuZLh13dSPxJZnlIKQka82yfdgp5F0OZxj8LWF04ysGb5t0wSA7mrX7jhAUso0-1aH_1UM2Ll5BtdZYx1weKVKJcWvS-JqmHBvSsn6U0Pg7GXfsJPmb3JxSQEXLMvMbFY9dbQEPGw&sai=AMfl-YQvbJU-3CnSrwnjasgw3UrGEKBBQ8E1q5aW0jo58MUiikrSueoF3Nt_h7nN8WUPG8opX2uVwGkO6ogwRSWcxgCOXz8uU4O9-nxUqUMD&sig=Cg0ArKJSzBZzpWoGX3TrEAE&urlfix=1&adurl=
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
empty

Response headers

timing-allow-origin
*
date
Mon, 16 Mar 2020 20:08:36 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
expires
Mon, 16 Mar 2020 20:08:36 GMT
itfudnuj.js
ad4m.at/ Frame 0E79
48 KB
14 KB
Script
General
Full URL
https://ad4m.at/itfudnuj.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
UploadServer /
Resource Hash
e7eae6fcdd3e32fc17a22ed0e05481003e797b671a414c0953031ed84e7104a2

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 19:22:01 GMT
content-encoding
gzip
age
2795
status
200
x-guploader-uploadid
AEnB2Uo--nssP76nGZtFI0ZmuEHMl1RKWL3oCh3_3OvIiJM-Q-e2PTJDmosaIgksOyED15cBTDwetvlxlUMFH8zVN11Pfp-2sw
x-goog-storage-class
MULTI_REGIONAL
x-goog-metageneration
1
x-goog-stored-content-encoding
gzip
alt-svc
clear
content-length
14460
last-modified
Sun, 16 Feb 2020 15:08:22 GMT
server
UploadServer
etag
"976a005d2df079cd0801e468ad5fe9ce"
x-goog-hash
crc32c=HLWAxQ==, md5=l2oAXS3wec0IAeRorV/pzg==
x-goog-generation
1581865702820976
cache-control
public, max-age=3600, no-transform
x-goog-stored-content-length
14460
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
expires
Mon, 16 Mar 2020 20:22:01 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 0E79
73 KB
28 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_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1584099738113808"
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
28086
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:36 GMT
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
access-control-allow-origin
*
date
Mon, 16 Mar 2020 20:08:36 GMT
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
access-control-allow-origin
*
date
Mon, 16 Mar 2020 20:08:36 GMT
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
access-control-allow-origin
*
date
Mon, 16 Mar 2020 20:08:36 GMT
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame FABB
202 KB
59 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=GnqUzphtkk
Requested by
Host: player.pcgameshardware.de
URL: https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.194.65 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-224-194-65.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
097ebd02792cbac7d27830cd9af71b8257add220e67c7281d705dcd30b8e71d3

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Origin
https://player.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:07:59 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
37
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
https://player.pcgameshardware.de
Last-Modified
Fri, 13 Mar 2020 17:07:32 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 d7e55181ad8192e74c103c6003cd4d9c.cloudfront.net (CloudFront)
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA2-C1
X-Amz-Cf-Id
m3Agnmv6YEO7Z8-_KwVpNMxC8DHt_nghRE176nbuzEFWmq6SIuNBTw==
truncated
/ Frame 3797
213 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
75bb1e4d98779af420192e8416abdcae904b84dbdeb1280f44c9e067575f2d1a

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
frame.html
ad4m.at/ Frame 293C
0
0
Document
General
Full URL
https://ad4m.at/frame.html
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
UploadServer /
Resource Hash

Request headers

:method
GET
:authority
ad4m.at
:scheme
https
:path
/frame.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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
x-guploader-uploadid
AEnB2UoWO8PkYpg3QbWBrdsrHitJe2swBhZyBDSeZ7-V8Tkso6llRhiFMkFEyQlOPslD4zkEove5YNoy4HyPCB-NNsziNc-xgYG5xz7mi3-OZqyilxk0kYY
date
Mon, 16 Mar 2020 14:23:47 GMT
expires
Tue, 17 Mar 2020 14:23:47 GMT
last-modified
Thu, 11 Oct 2018 08:50:29 GMT
etag
"ad2f98a9fd46a0250dabddf7805fe3d2"
x-goog-generation
1539247829792189
x-goog-metageneration
4
x-goog-stored-content-encoding
utf-8
x-goog-stored-content-length
1570
content-type
text/html
content-encoding
utf-8
content-language
en
x-goog-hash
crc32c=P/mrYg== md5=rS+Yqf1GoCUNq933gF/j0g==
x-goog-storage-class
MULTI_REGIONAL
accept-ranges
bytes
content-length
1570
server
UploadServer
cache-control
public, max-age=86400
age
20689
alt-svc
clear
truncated
/ Frame C870
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
2ef5c60729ea36c1673f47c1234ea6b9209211d729f1b3dc551c90fd4252d34b

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
lb35.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb35.s400.meetrics.net/data?/hQk4DIKAAKktFLkqFFlqwF23A52AwwA/k0FzEmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A23Ax0A3yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFmwEshFjlF9hEy0FprFlsFfzF0hFukFhyFkmBhwFi9BihFuuFlyFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A40Az4A5zAx2A05AwBELlnFBUkzFkBP5JAAAAAAABcBBAPAAAFAAcBBTYeNAPBAArEA4BABYeNAZAAAOA55A55A85B55A58E55A55AEA0xA44ArYeNAPGAArEA4BAHYeNASksFRGjAAAAAAAAAAAAEAAAcBBAAAAAAAHAklFzrF0vFwBFQAhyF0pFrlFsfFz0FhuFkhFykFeAkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFGA3yA44E5wAMAxzA4yA44A23Ax0A3yAGAkpFylFj0FAAAAIAy5A53A21Az1AKA1zAyxA03Aw3A2yAGAihFuuFlyFKA1zAyxA03Aw3A2yAKA1zAyxA03Aw3A2yAEBlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEihFuuFlyFdrEA4BAYLAaBAFAAAYeNAAAAALAT1FwlFyCFhuFulFyBFAAAAAAAAAAAAAAAAQtjFW+qwUA
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:36 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 16-Mar-20 20:08:35 GMT
truncated
/ Frame 0E79
213 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9d36ae6f3144477bff24bf3ab8dc4ccc249a75f61cbffe0bb963dca9a8574ae7

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
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=251194220074141&correlator=2537393434496966&output=ldjh&impl=fifs&adsid=NT&eid=21064522&vrg=2020030501&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200316&iu_parts=4444%2Cdisp_ctc_pcgameshardware.de_sd%2Cartikel_standard&enc_prev_ius=0%2F1%2F2&prev_iu_szs=1x1&ists=1&prev_scp=as%3Dout_of_page%26adslot%3Dout_of_page%26af%3Dds%2Ctickerad%2Cfloor%26pc%3D1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D406234227e2a1d846150e4fae9b08605%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26kvcxsegments%3D%26nuggad%3Dn127-0%252Cn31-1%252Cn121-2%252Cn116-0%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-0%252Cn160-0%252Cn28-1%252Cn107-0%252Cn21-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn36-1%252Cn119-5%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-1%252Cn26-1%252Cn99-1%252Cn128-1%252Cn73-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn16-1%252Cn79-0%252Cn93-4%252Cn90-0%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-1%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-1%252Cn33-1%252Cn59-1%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-2%252Cn32-1%252Cn67-1%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-1%252Cn41-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-0%252Cn133-1%26keywords%3Diphone%252Capple%26amznbid%3D0%26amznp%3D0&cookie=ID%3D6701f103358bdb94%3AT%3D1584389316%3AS%3DALNI_MbkE-UHaWss7PQub3pbI_LukamabQ&cookie_enabled=1&bc=31&abxe=1&lmt=1584389316&dt=1584389316519&dlt=1584389315334&idt=622&frm=20&biw=1585&bih=1200&oid=3&adxs=0&adys=4876&adks=2955490964&ucis=4&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.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&dssz=68&icsg=4381404201023&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x1&msz=1585x1&psts=ABP-KfQx5sZ54QH7nZ8QijWTYaaWVoDRWn__xCnnoW4LbloI47YieDSL6MyQFwKAPZU6Qtz9-cJvxzdxD7VdImXTRJ_Gu54%2CABP-KfSbv5qXKpj9gGOVWmLri24SykRtJmyO_2QPhn_oWScD2bzlawrbTikb-a8UYVxJyc0igwhZdFynDvdFCncwFNgOsF8%2CABP-KfQc6HT2hCPBbte_qwxvnHOzbVbLrUYMu5xrCfyiLc1_lrcXC6wZV7BXtgvM78tAFksEQ-FU5sSfvnq9GMEhpbqdbQo&ga_vid=766020357.1584389316&ga_sid=1584389316&ga_hid=1796390970&fws=4&ohw=1585
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
39a86f48eccafc70cd5f72113fa46299fcf2d56af9faeb456ab2809576dbf830
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:36 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
1650
x-xss-protection
0
google-lineitem-id
97660735
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138239177030
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.pcgameshardware.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/
7 KB
3 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=251194220074141&correlator=2537393434496966&output=ldjh&impl=fifs&adsid=NT&eid=21064522&vrg=2020030501&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200316&iu_parts=4444%2Cdisp_ctc_pcgameshardware.de_sd%2Cartikel_standard&enc_prev_ius=0%2F1%2F2&prev_iu_szs=970x255%7C36x31&prev_scp=as%3Dpubperform%26adslot%3Dpubperform%26pc%3D1%26af%3Dpubperf&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D406234227e2a1d846150e4fae9b08605%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26kvcxsegments%3D%26nuggad%3Dn127-0%252Cn31-1%252Cn121-2%252Cn116-0%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-0%252Cn160-0%252Cn28-1%252Cn107-0%252Cn21-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn36-1%252Cn119-5%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-1%252Cn26-1%252Cn99-1%252Cn128-1%252Cn73-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn16-1%252Cn79-0%252Cn93-4%252Cn90-0%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-1%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-1%252Cn33-1%252Cn59-1%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-2%252Cn32-1%252Cn67-1%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-1%252Cn41-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-0%252Cn133-1%26keywords%3Diphone%252Capple%26amznbid%3D0%26amznp%3D0&cookie=ID%3D6701f103358bdb94%3AT%3D1584389316%3AS%3DALNI_MbkE-UHaWss7PQub3pbI_LukamabQ&cookie_enabled=1&bc=31&abxe=1&lmt=1584389316&dt=1584389316528&dlt=1584389315334&idt=622&frm=20&biw=1585&bih=1200&oid=3&adxs=163&adys=4579&adks=2951885302&ucis=5&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.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&dssz=68&icsg=4381404201023&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x255&msz=1000x255&psts=ABP-KfQx5sZ54QH7nZ8QijWTYaaWVoDRWn__xCnnoW4LbloI47YieDSL6MyQFwKAPZU6Qtz9-cJvxzdxD7VdImXTRJ_Gu54%2CABP-KfSbv5qXKpj9gGOVWmLri24SykRtJmyO_2QPhn_oWScD2bzlawrbTikb-a8UYVxJyc0igwhZdFynDvdFCncwFNgOsF8%2CABP-KfQc6HT2hCPBbte_qwxvnHOzbVbLrUYMu5xrCfyiLc1_lrcXC6wZV7BXtgvM78tAFksEQ-FU5sSfvnq9GMEhpbqdbQo&ga_vid=766020357.1584389316&ga_sid=1584389316&ga_hid=1796390970&fws=4&ohw=1585
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
66c1574ab1ccc629d6a086611d3676570ac92c044f97433ced8c1937d1f60b92
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:36 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
3163
x-xss-protection
0
google-lineitem-id
4885875094
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138253856699
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.pcgameshardware.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/
13 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=251194220074141&correlator=2537393434496966&output=ldjh&impl=fifs&adsid=NT&eid=21064522&vrg=2020030501&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200316&iu_parts=4444%2Cdisp_ctc_pcgameshardware.de_sd%2Cartikel_standard&enc_prev_ius=0%2F1%2F2&prev_iu_szs=800x450%7C580x500%7C580x360%7C480x360%7C42x31&prev_scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D406234227e2a1d846150e4fae9b08605%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26kvcxsegments%3D%26nuggad%3Dn127-0%252Cn31-1%252Cn121-2%252Cn116-0%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-0%252Cn160-0%252Cn28-1%252Cn107-0%252Cn21-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn36-1%252Cn119-5%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-1%252Cn26-1%252Cn99-1%252Cn128-1%252Cn73-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn16-1%252Cn79-0%252Cn93-4%252Cn90-0%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-1%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-1%252Cn33-1%252Cn59-1%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-2%252Cn32-1%252Cn67-1%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-1%252Cn41-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-0%252Cn133-1%26keywords%3Diphone%252Capple%26amznbid%3D0%26amznp%3D0&cookie=ID%3D6701f103358bdb94%3AT%3D1584389316%3AS%3DALNI_MbkE-UHaWss7PQub3pbI_LukamabQ&cookie_enabled=1&bc=31&abxe=1&lmt=1584389316&dt=1584389316534&dlt=1584389315334&idt=622&frm=20&biw=1585&bih=1200&oid=3&adxs=193&adys=1212&adks=3981034135&ucis=6&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.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&dssz=68&icsg=4381404201023&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=610x450&msz=610x450&psts=ABP-KfQx5sZ54QH7nZ8QijWTYaaWVoDRWn__xCnnoW4LbloI47YieDSL6MyQFwKAPZU6Qtz9-cJvxzdxD7VdImXTRJ_Gu54%2CABP-KfSbv5qXKpj9gGOVWmLri24SykRtJmyO_2QPhn_oWScD2bzlawrbTikb-a8UYVxJyc0igwhZdFynDvdFCncwFNgOsF8%2CABP-KfQc6HT2hCPBbte_qwxvnHOzbVbLrUYMu5xrCfyiLc1_lrcXC6wZV7BXtgvM78tAFksEQ-FU5sSfvnq9GMEhpbqdbQo&ga_vid=766020357.1584389316&ga_sid=1584389316&ga_hid=1796390970&fws=4&ohw=1585
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
b568c9877ce52d0ae234a0e6c9dbdb4cf3d415c16b2ab387b0cbaeca91b5c0a3
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:37 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
4586
x-xss-protection
0
google-lineitem-id
4921998930
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138257178978
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.pcgameshardware.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
data
lb35.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb35.s400.meetrics.net/data?/hQk4EPKAA/k0FkJmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A23Ax0A3yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFmwEshFjlF9hEy0FprFlsFfzF0hFukFhyFkmBhwFi9BihFuuFlyFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A40Az4A5zAx2A05AwmEvyFthF0jFvkFl9BTrF5zFjyFhwFlyFfxB2wAmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA45Aw0AwxAy4AmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9zEr5FmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21Aw1ALlnFCUkzFYBPIAAAAAAAABirJAPAAAFAAirJTl5/APAAAVSAwDABl5/AZAAAOA55A55A85B55A58E55A55AFAz5A21AwBErl5/ASksFRGjAAAAAAAAAAAAEAAAirJAAAAAAAHAklFzrF0vFwBFQAhyF0pFrlFsfFz0FhuFkhFykFeAkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFHAxyAw4E2wAwBEMAxzA4yA45Aw0AwxAy4AGAkpFylFj0FAAAAIAy5A53A21Az1AKA1zAyxA03Aw3A2yADAzrF5BFKA1zAyxA03Aw3A2yAKA1zAyxA03Aw3A2yABBlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEzrF5BFdVSAwDAgCAYJAFAAAl5/AAAAAOATrF5zFjyFhwFlyFfxB2wAAAAAAAAAAAAAAAAAQtjFkZAZXA
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:36 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 16-Mar-20 20:08:35 GMT
data
lb35.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb35.s400.meetrics.net/data?/hQk4FQKAA/k0FiOmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A23Ax0A3yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFmwEshFjlF9hEy0FprFlsFfzF0hFukFhyFkmBhwFi9BihFuuFlyFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A40Az4A5zAx2A05AwmEvyFthF0jFvkFl9BTrF5zFjyFhwFlyFfxB2wAmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA45Aw0AwxAy4AmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9zEr5FmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21Aw1AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A3zA43AwxAmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21AxyALlnFDTkzFARksFAQtjF7BcgXA
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:36 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 16-Mar-20 20:08:35 GMT
frame.html
ad4m.at/ Frame 134C
0
0
Document
General
Full URL
https://ad4m.at/frame.html
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
UploadServer /
Resource Hash

Request headers

:method
GET
:authority
ad4m.at
:scheme
https
:path
/frame.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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
x-guploader-uploadid
AEnB2UoWO8PkYpg3QbWBrdsrHitJe2swBhZyBDSeZ7-V8Tkso6llRhiFMkFEyQlOPslD4zkEove5YNoy4HyPCB-NNsziNc-xgYG5xz7mi3-OZqyilxk0kYY
date
Mon, 16 Mar 2020 14:23:47 GMT
expires
Tue, 17 Mar 2020 14:23:47 GMT
last-modified
Thu, 11 Oct 2018 08:50:29 GMT
etag
"ad2f98a9fd46a0250dabddf7805fe3d2"
x-goog-generation
1539247829792189
x-goog-metageneration
4
x-goog-stored-content-encoding
utf-8
x-goog-stored-content-length
1570
content-type
text/html
content-encoding
utf-8
content-language
en
x-goog-hash
crc32c=P/mrYg== md5=rS+Yqf1GoCUNq933gF/j0g==
x-goog-storage-class
MULTI_REGIONAL
accept-ranges
bytes
content-length
1570
server
UploadServer
cache-control
public, max-age=86400
age
20689
alt-svc
clear
frame.html
ad4m.at/ Frame 343F
0
0
Document
General
Full URL
https://ad4m.at/frame.html
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
UploadServer /
Resource Hash

Request headers

:method
GET
:authority
ad4m.at
:scheme
https
:path
/frame.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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
x-guploader-uploadid
AEnB2UoWO8PkYpg3QbWBrdsrHitJe2swBhZyBDSeZ7-V8Tkso6llRhiFMkFEyQlOPslD4zkEove5YNoy4HyPCB-NNsziNc-xgYG5xz7mi3-OZqyilxk0kYY
date
Mon, 16 Mar 2020 14:23:47 GMT
expires
Tue, 17 Mar 2020 14:23:47 GMT
last-modified
Thu, 11 Oct 2018 08:50:29 GMT
etag
"ad2f98a9fd46a0250dabddf7805fe3d2"
x-goog-generation
1539247829792189
x-goog-metageneration
4
x-goog-stored-content-encoding
utf-8
x-goog-stored-content-length
1570
content-type
text/html
content-encoding
utf-8
content-language
en
x-goog-hash
crc32c=P/mrYg== md5=rS+Yqf1GoCUNq933gF/j0g==
x-goog-storage-class
MULTI_REGIONAL
accept-ranges
bytes
content-length
1570
server
UploadServer
cache-control
public, max-age=86400
age
20689
alt-svc
clear
truncated
/ Frame FABB
202 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
097ebd02792cbac7d27830cd9af71b8257add220e67c7281d705dcd30b8e71d3

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
translator
hbopenbid.pubmatic.com/
0
65 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?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
185.64.189.112 , United Kingdom, ASN62713 (AS-PUBMATIC, US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:36 GMT
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
access-control-allow-origin
https://www.pcgameshardware.de
cygnus
as-sec.casalemedia.com/
25 B
1 KB
XHR
General
Full URL
https://as-sec.casalemedia.com/cygnus?s=346697&v=7.2&r=%7B%22id%22%3A%22572cd35d6f0fd74%22%2C%22imp%22%3A%5B%7B%22id%22%3A%225844216049fda93%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%22346697%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%22598a29c9c5b7811%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%22388778%22%2C%22sid%22%3A%228%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%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?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
92.122.254.129 , Ascension Island, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a92-122-254-129.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
7e5ab895bb5694aa8324f1553297cf4d4e079acd65ec72c38cccf9f19c45a64e

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:36 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.pcgameshardware.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
Mon, 16 Mar 2020 20:08:36 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
240 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=158344&zone_id=850900&size_id=15&p_pos=btf&rf=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=eea9e32b-3d82-4bf9-a77d-b87805d72f1c&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.6101806026639982
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_GCM
Server
69.173.144.140 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT, US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
d39185735f23604dc068be3e0672d570685eac008d5daa49f686028f5a1228dc

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:36 GMT
Server
RAS 2.4
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.pcgameshardware.de
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=398
Content-Length
240
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
240 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=158344&zone_id=850902&size_id=15&p_pos=btf&rf=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=8da0f59e-cb32-49da-9ab0-ce6008393105&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.3991236792107995
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_GCM
Server
69.173.144.140 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT, US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
bd78ffb515d3ae83fe62aab4955639a42447ead2e3efbb765fc2724e57ce59ed

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:36 GMT
Server
RAS 2.4
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.pcgameshardware.de
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=402
Content-Length
240
Expires
Wed, 17 Sep 1975 21:32:10 GMT
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.139.58 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:36 GMT
X-SMRT-D
6%3b3%3b99
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.pcgameshardware.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
prebid
ib.adnxs.com/ut/v3/
19 B
875 B
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.80 , Netherlands, ASN29990 (ASN-APPNEX, US),
Reverse DNS
251.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
0c09c070833c786cb25be38bc30992b30bad578f817dbc9e34beacd8b8ea44c5
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:38 GMT
X-Proxy-Origin
194.187.251.52; 194.187.251.52; 251.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.230:80
AN-X-Request-Uuid
611a724a-c075-4505-a6fb-5223faddf1eb
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
https://www.pcgameshardware.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
19
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
bid
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 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?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
access-control-allow-origin
*
date
Mon, 16 Mar 2020 20:08:36 GMT
ads
securepubads.g.doubleclick.net/gampad/
14 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=251194220074141&correlator=2537393434496966&output=ldjh&impl=fifs&adsid=NT&eid=21064522&vrg=2020030501&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200316&iu_parts=4444%2Cdisp_ctc_pcgameshardware.de_sd%2Cartikel_standard&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=10x10%7C301x250%7C34x32%2C10x10%7C302x250%7C34x33&prev_scp=as%3Drectangle2%26adslot%3Drectangle2%26pc%3D1%26yieldlove_reload%3Dpid%253A11469.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A11469.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A11469.scenario%253Adefault%26yieldlove_meta%3Dpid%253A11469.sb%253Af%26yieldlove_pid%3D11469%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle2%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse%26af%3Df1x1%2Cmrec%7Cas%3Drectangle3%26adslot%3Drectangle3%26pc%3D1%26yieldlove_reload%3Dpid%253A11470.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A11470.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A11470.scenario%253Adefault%26yieldlove_meta%3Dpid%253A11470.sb%253Af%26yieldlove_pid%3D11470%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle3%26yieldlove_reloaded%3Dfalse%26yieldlove_is_reloaded%3Dfalse%26af%3Df1x1%2Cmrec&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D406234227e2a1d846150e4fae9b08605%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26kvcxsegments%3D%26nuggad%3Dn127-0%252Cn31-1%252Cn121-2%252Cn116-0%252Cn104-0%252Cn15-1%252Cn155-0%252Cn106-0%252Cn153-0%252Cn11-2%252Cn120-6%252Cn53-1%252Cn154-0%252Cn13-1%252Cn125-0%252Cn8-4%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-0%252Cn139-0%252Cn160-0%252Cn28-1%252Cn107-0%252Cn21-1%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn36-1%252Cn119-5%252Cn22-1%252Cn18-1%252Cn161-0%252Cn126-0%252Cn92-3%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-0%252Cn105-0%252Cn159-1%252Cn20-1%252Cn80-1%252Cn12-3%252Cn141-0%252Cn157-1%252Cn26-1%252Cn99-1%252Cn128-1%252Cn73-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn16-1%252Cn79-0%252Cn93-4%252Cn90-0%252Cn55-1%252Cn142-0%252Cn7-2%252Cn103-1%252Cn158-1%252Cn124-0%252Cn75-1%252Cn91-0%252Cn114-0%252Cn69-0%252Cn10-3%252Cn3-1%252Cn82-1%252Cn33-1%252Cn59-1%252Cn84-1%252Cn5-3%252Cn48-1%252Cn109-1%252Cn122-2%252Cn32-1%252Cn67-1%252Cn115-1%252Cn89-2%252Cn123-1%252Cn17-1%252Cn78-1%252Cn41-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-0%252Cn148-0%252Cn133-1%26keywords%3Diphone%252Capple%26amznbid%3D0%26amznp%3D0&cookie=ID%3D6701f103358bdb94%3AT%3D1584389316%3AS%3DALNI_MbkE-UHaWss7PQub3pbI_LukamabQ&cookie_enabled=1&bc=31&abxe=1&lmt=1584389316&dt=1584389316606&dlt=1584389315334&idt=622&frm=20&biw=1585&bih=1200&oid=3&adxs=993%2C993&adys=1367%2C2917&adks=2466507506%2C2973274926&ucis=7%7C8&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.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&dssz=68&icsg=4381404201023&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x10%7C300x10&msz=300x10%7C300x10&psts=ABP-KfQx5sZ54QH7nZ8QijWTYaaWVoDRWn__xCnnoW4LbloI47YieDSL6MyQFwKAPZU6Qtz9-cJvxzdxD7VdImXTRJ_Gu54%2CABP-KfSbv5qXKpj9gGOVWmLri24SykRtJmyO_2QPhn_oWScD2bzlawrbTikb-a8UYVxJyc0igwhZdFynDvdFCncwFNgOsF8%2CABP-KfQc6HT2hCPBbte_qwxvnHOzbVbLrUYMu5xrCfyiLc1_lrcXC6wZV7BXtgvM78tAFksEQ-FU5sSfvnq9GMEhpbqdbQo&ga_vid=766020357.1584389316&ga_sid=1584389316&ga_hid=1796390970&fws=4%2C4&ohw=1585%2C1585
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
ce9a15b7e9192ae68522debd6b860b5278fbca7c6528ad9be09e1cbaa4724597
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:37 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2,-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
3899
x-xss-protection
0
google-lineitem-id
4933062463,4933063195
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138264340820,138264649339
content-type
text/plain; charset=UTF-8
access-control-allow-origin
https://www.pcgameshardware.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
auction
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 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?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
access-control-allow-origin
*
date
Mon, 16 Mar 2020 20:08:36 GMT
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/ Frame D6F4
Redirect Chain
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvNv4Q3IYGBcE-i_q68n_uCgOPzjHmob9WfIwEZ1hJDR9SoysVJA38hKCCuSP9DE4GzZ8vsfOzDTpVWhMSgon1ZDITYSv3-5RCMniVUKlKsVUKWm_R9p_plZ6HYlFonEfQKnZeD6b5kv...
  • 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.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:10:28e::5f76 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:36 GMT
last-modified
Wed, 29 Nov 2006 13:15:04 GMT
server
Apache
access-control-allow-origin
*
etag
"3260aadd174a1ebd50d0bd967c8fadea:1494950026"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
image/gif
status
200
cache-control
max-age=592460
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
49
expires
Mon, 23 Mar 2020 16:42:56 GMT

Redirect headers

date
Mon, 16 Mar 2020 20:08:36 GMT
x-content-type-options
nosniff
content-type
text/html; charset=UTF-8
server
cafe
access-control-allow-origin
*
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"
status
302
cache-control
private
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
0
x-xss-protection
0
frame.html
ad4mat.net/ Frame 71E7
0
0
Document
General
Full URL
https://ad4mat.net/frame.html
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
146.148.127.183 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
183.127.148.146.bc.googleusercontent.com
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
ad4mat.net
:scheme
https
:path
/frame.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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
server
nginx
date
Mon, 16 Mar 2020 20:08:36 GMT
content-type
text/html
etag
W/"5acf0fb7-57f"
content-encoding
gzip
frame.html
ad4mat.net/ Frame 6741
0
0
Document
General
Full URL
https://ad4mat.net/frame.html
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
146.148.127.183 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
183.127.148.146.bc.googleusercontent.com
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
ad4mat.net
:scheme
https
:path
/frame.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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
server
nginx
date
Mon, 16 Mar 2020 20:08:36 GMT
content-type
text/html
etag
W/"5acf0fb7-57f"
content-encoding
gzip
frame.html
ad4mat.net/ Frame 959F
0
0
Document
General
Full URL
https://ad4mat.net/frame.html
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
146.148.127.183 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
183.127.148.146.bc.googleusercontent.com
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
ad4mat.net
:scheme
https
:path
/frame.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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
server
nginx
date
Mon, 16 Mar 2020 20:08:36 GMT
content-type
text/html
etag
W/"5acf0fb7-57f"
content-encoding
gzip
data
lb35.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb35.s400.meetrics.net/data?/hQk4GNNAAUkzFYBPHAAAAAAAABaLeAPAAAFAAaLeTbosAPBAAQNALEABbosAZAAAOA55A55A85B55A58E55A55AGAxyAz2AxwArbosASksFmGjAAAAAAAAAAAAEAAAaLeAAAAAAAHAklFzrF0vFwBFQAhyF0pFrlFsfFz0FhuFkhFykFeAkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA44A3zA43AwxAGAkpFylFj0FAAAAIAy5A53A21Az1AKA1zAyxA03Aw3A2yAJAylFj0FhuFnsFlBFKA1zAyxA03Aw3A2yAKA1zAyxA03Aw3A2yAHBlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEylFj0FhuFnsFlBFdQNALEAsEA6DAFAAAbosAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjF+AE6SA
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:36 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 16-Mar-20 20:08:35 GMT
data
lb35.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb35.s400.meetrics.net/data?/hQk4HONAA/k0FYTmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A23Ax0A3yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFmwEshFjlF9hEy0FprFlsFfzF0hFukFhyFkmBhwFi9BihFuuFlyFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A40Az4A5zAx2A05AwmEvyFthF0jFvkFl9BTrF5zFjyFhwFlyFfxB2wAmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA45Aw0AwxAy4AmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9zEr5FmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21Aw1AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A3zA43AwxAmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21AxyAmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF95A32A2wA3zA1mAjpFk9BxzA4yAz5Ax3A3wAzwAmzEp6Fl9Bx4ExmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF95A32A2wA3zA1mAhwFk9B53A22Aw3Az1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA23AwyATkzFARksFAQtjF0HgcbA
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:36 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 16-Mar-20 20:08:35 GMT
rar
ad4m.at/ad/ Frame E620
Redirect Chain
  • https://ad4m.at/rs?a=&b=40&c=680&d=&e=728&f=90&g=0&h=Stroeer_RON_728x90&i=&j=1065&k=1&l=&m=&n=&o=0&p=0
  • https://ad4m.at/ad/rar?a=15255%2C11198%2C15573&b=oneidMpmUzfrf1zRuWHEHGtDt2jpCkC4oneid__asuid0asuid__Stroeer_RON_728x90%2ConeidzK4SRfYfedYSpHBHMtqtz21UXCwoneid__asuid0asuid__Stroeer_RON_728x90%2Con...
0
0
Document
General
Full URL
https://ad4m.at/ad/rar?a=15255%2C11198%2C15573&b=oneidMpmUzfrf1zRuWHEHGtDt2jpCkC4oneid__asuid0asuid__Stroeer_RON_728x90%2ConeidzK4SRfYfedYSpHBHMtqtz21UXCwoneid__asuid0asuid__Stroeer_RON_728x90%2ConeidPXJaBfbfDEQF9HjHbtMtK7xCYC9oneid__asuid0asuid__Stroeer_RON_728x90&f=oneid6k4aef3f6wmheHmHYtEC5kmtMC1oneid__asuid0asuid__Stroeer_RON_728x90%2Coneid8gQhDf8fk8qhgHJHEtqCkEdfACwoneid__asuid0asuid__Stroeer_RON_728x90%2ConeidbzwSQfZfeDVaYHbHzt8C1d8fjCJoneid__asuid0asuid__Stroeer_RON_728x90&c=728&d=90&e=&g=79b1afd827e3c037ebcda3728b628391%2F2146759660757302036&i=25174%2C20535%2C26474&j=16%2C16%2C41&k=0&l=0&m=0&n=&y=1&z=0
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
nginx /
Resource Hash
Security Headers
Name Value
Content-Security-Policy block-all-mixed-content; report-to report-endpoint; report-uri /ad/report-csp-violation; upgrade-insecure-requests; sandbox allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox
Strict-Transport-Security max-age=86400; includeSubDomains; preload
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
ad4m.at
:scheme
https
:path
/ad/rar?a=15255%2C11198%2C15573&b=oneidMpmUzfrf1zRuWHEHGtDt2jpCkC4oneid__asuid0asuid__Stroeer_RON_728x90%2ConeidzK4SRfYfedYSpHBHMtqtz21UXCwoneid__asuid0asuid__Stroeer_RON_728x90%2ConeidPXJaBfbfDEQF9HjHbtMtK7xCYC9oneid__asuid0asuid__Stroeer_RON_728x90&f=oneid6k4aef3f6wmheHmHYtEC5kmtMC1oneid__asuid0asuid__Stroeer_RON_728x90%2Coneid8gQhDf8fk8qhgHJHEtqCkEdfACwoneid__asuid0asuid__Stroeer_RON_728x90%2ConeidbzwSQfZfeDVaYHbHzt8C1d8fjCJoneid__asuid0asuid__Stroeer_RON_728x90&c=728&d=90&e=&g=79b1afd827e3c037ebcda3728b628391%2F2146759660757302036&i=25174%2C20535%2C26474&j=16%2C16%2C41&k=0&l=0&m=0&n=&y=1&z=0
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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
server
nginx
date
Mon, 16 Mar 2020 20:08:36 GMT
content-type
text/html; charset=UTF-8
content-length
5008
vary
Accept-Encoding
report-to
{"endpoints":[{"url":"/ad/violation-report-endpoint"}],"group":"report-endpoint","max_age":86400}
content-security-policy
block-all-mixed-content; report-to report-endpoint; report-uri /ad/report-csp-violation; upgrade-insecure-requests; sandbox allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox
cache-control
no-store, no-cache, must-revalidate, proxy-revalidate
expires
0
feature-policy
autoplay 'self';camera 'none';fullscreen 'none';geolocation 'none';microphone 'none';midi 'none';payment 'none';sync-xhr 'none';usb 'none';vr 'none'
pragma
no-cache
referrer-policy
same-origin
strict-transport-security
max-age=86400; includeSubDomains; preload
surrogate-control
no-store
x-content-type-options
nosniff
x-download-options
noopen
x-xss-protection
1; mode=block
nel
{"failure_fraction":"1.0","max_age":86400,"report_to":"report-endpoint","success_fraction":"0.0"}
x-fastcgi-cache
BYPASS
x-backend-server
adsrv-l0z7
via
1.1 google
alt-svc
clear

Redirect headers

status
307
server
nginx
date
Mon, 16 Mar 2020 20:08:36 GMT
location
https://ad4m.at/ad/rar?a=15255%2C11198%2C15573&b=oneidMpmUzfrf1zRuWHEHGtDt2jpCkC4oneid__asuid0asuid__Stroeer_RON_728x90%2ConeidzK4SRfYfedYSpHBHMtqtz21UXCwoneid__asuid0asuid__Stroeer_RON_728x90%2ConeidPXJaBfbfDEQF9HjHbtMtK7xCYC9oneid__asuid0asuid__Stroeer_RON_728x90&f=oneid6k4aef3f6wmheHmHYtEC5kmtMC1oneid__asuid0asuid__Stroeer_RON_728x90%2Coneid8gQhDf8fk8qhgHJHEtqCkEdfACwoneid__asuid0asuid__Stroeer_RON_728x90%2ConeidbzwSQfZfeDVaYHbHzt8C1d8fjCJoneid__asuid0asuid__Stroeer_RON_728x90&c=728&d=90&e=&g=79b1afd827e3c037ebcda3728b628391%2F2146759660757302036&i=25174%2C20535%2C26474&j=16%2C16%2C41&k=0&l=0&m=0&n=&y=1&z=0
cache-control
private, no-store, max-age=0
x-fastcgi-cache
BYPASS
x-backend-server
rs-sv2g
via
1.1 google
alt-svc
clear
rar
ad4m.at/ad/ Frame A2A7
Redirect Chain
  • https://ad4m.at/rs?a=&b=39&c=680&d=&e=300&f=250&g=0&h=Stroeer_RON_300x250&i=&j=1065&k=1&l=&m=&n=&o=0&p=0
  • https://ad4m.at/ad/rar?a=13525&b=oneidzK4SRfYf9RMapHBH8uqtzrQsXCwoneid__asuid0asuid__Stroeer_RON_300x250&f=oneid8gQhDf8fZ2zHgHJH3uqCkMKHACwoneid__asuid0asuid__Stroeer_RON_300x250&c=300&d=250&e=&g=9...
0
0
Document
General
Full URL
https://ad4m.at/ad/rar?a=13525&b=oneidzK4SRfYf9RMapHBH8uqtzrQsXCwoneid__asuid0asuid__Stroeer_RON_300x250&f=oneid8gQhDf8fZ2zHgHJH3uqCkMKHACwoneid__asuid0asuid__Stroeer_RON_300x250&c=300&d=250&e=&g=97c231bad278c0aef7dc64f85de5fc9f%2F6607609293362353383&i=20612&j=16&k=0&l=0&m=0&n=&y=1&z=0
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
nginx /
Resource Hash
Security Headers
Name Value
Content-Security-Policy block-all-mixed-content; report-to report-endpoint; report-uri /ad/report-csp-violation; upgrade-insecure-requests; sandbox allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox
Strict-Transport-Security max-age=86400; includeSubDomains; preload
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
ad4m.at
:scheme
https
:path
/ad/rar?a=13525&b=oneidzK4SRfYf9RMapHBH8uqtzrQsXCwoneid__asuid0asuid__Stroeer_RON_300x250&f=oneid8gQhDf8fZ2zHgHJH3uqCkMKHACwoneid__asuid0asuid__Stroeer_RON_300x250&c=300&d=250&e=&g=97c231bad278c0aef7dc64f85de5fc9f%2F6607609293362353383&i=20612&j=16&k=0&l=0&m=0&n=&y=1&z=0
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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
server
nginx
date
Mon, 16 Mar 2020 20:08:36 GMT
content-type
text/html; charset=UTF-8
content-length
1526
vary
Accept-Encoding
report-to
{"endpoints":[{"url":"/ad/violation-report-endpoint"}],"group":"report-endpoint","max_age":86400}
content-security-policy
block-all-mixed-content; report-to report-endpoint; report-uri /ad/report-csp-violation; upgrade-insecure-requests; sandbox allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox
cache-control
no-store, no-cache, must-revalidate, proxy-revalidate
expires
0
feature-policy
autoplay 'self';camera 'none';fullscreen 'none';geolocation 'none';microphone 'none';midi 'none';payment 'none';sync-xhr 'none';usb 'none';vr 'none'
pragma
no-cache
referrer-policy
same-origin
strict-transport-security
max-age=86400; includeSubDomains; preload
surrogate-control
no-store
x-content-type-options
nosniff
x-download-options
noopen
x-xss-protection
1; mode=block
nel
{"failure_fraction":"1.0","max_age":86400,"report_to":"report-endpoint","success_fraction":"0.0"}
x-fastcgi-cache
BYPASS
x-backend-server
adsrv-l0z7
via
1.1 google
alt-svc
clear

Redirect headers

status
307
server
nginx
date
Mon, 16 Mar 2020 20:08:36 GMT
location
https://ad4m.at/ad/rar?a=13525&b=oneidzK4SRfYf9RMapHBH8uqtzrQsXCwoneid__asuid0asuid__Stroeer_RON_300x250&f=oneid8gQhDf8fZ2zHgHJH3uqCkMKHACwoneid__asuid0asuid__Stroeer_RON_300x250&c=300&d=250&e=&g=97c231bad278c0aef7dc64f85de5fc9f%2F6607609293362353383&i=20612&j=16&k=0&l=0&m=0&n=&y=1&z=0
cache-control
private, no-store, max-age=0
x-fastcgi-cache
BYPASS
x-backend-server
rs-sv2g
via
1.1 google
alt-svc
clear
rar
ad4m.at/ad/ Frame F07A
Redirect Chain
  • https://ad4m.at/rs?a=&b=38&c=680&d=&e=160&f=600&g=0&h=Stroeer_RON_160x600&i=&j=1065&k=1&l=&m=&n=&o=0&p=0
  • https://ad4m.at/ad/rar?a=13516&b=oneidxRPFQfAfb3RSPHdH9uQtREQC1C6oneid__asuid0asuid__Stroeer_RON_160x600&f=oneidYz2Srf3f9YGtVH9H6ugCR5ZCQC1oneid__asuid0asuid__Stroeer_RON_160x600&c=160&d=600&e=&g=7...
0
0
Document
General
Full URL
https://ad4m.at/ad/rar?a=13516&b=oneidxRPFQfAfb3RSPHdH9uQtREQC1C6oneid__asuid0asuid__Stroeer_RON_160x600&f=oneidYz2Srf3f9YGtVH9H6ugCR5ZCQC1oneid__asuid0asuid__Stroeer_RON_160x600&c=160&d=600&e=&g=735bd80f6dbf1806ea624eb71cc01fdb%2F9088414369191691710&i=20612&j=16&k=0&l=0&m=0&n=&y=1&z=0
Requested by
Host: ad4m.at
URL: https://ad4m.at/itfudnuj.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.94.1 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
1.94.190.35.bc.googleusercontent.com
Software
nginx /
Resource Hash
Security Headers
Name Value
Content-Security-Policy block-all-mixed-content; report-to report-endpoint; report-uri /ad/report-csp-violation; upgrade-insecure-requests; sandbox allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox
Strict-Transport-Security max-age=86400; includeSubDomains; preload
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
ad4m.at
:scheme
https
:path
/ad/rar?a=13516&b=oneidxRPFQfAfb3RSPHdH9uQtREQC1C6oneid__asuid0asuid__Stroeer_RON_160x600&f=oneidYz2Srf3f9YGtVH9H6ugCR5ZCQC1oneid__asuid0asuid__Stroeer_RON_160x600&c=160&d=600&e=&g=735bd80f6dbf1806ea624eb71cc01fdb%2F9088414369191691710&i=20612&j=16&k=0&l=0&m=0&n=&y=1&z=0
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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
server
nginx
date
Mon, 16 Mar 2020 20:08:36 GMT
content-type
text/html; charset=UTF-8
content-length
1526
vary
Accept-Encoding
report-to
{"endpoints":[{"url":"/ad/violation-report-endpoint"}],"group":"report-endpoint","max_age":86400}
content-security-policy
block-all-mixed-content; report-to report-endpoint; report-uri /ad/report-csp-violation; upgrade-insecure-requests; sandbox allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox
cache-control
no-store, no-cache, must-revalidate, proxy-revalidate
expires
0
feature-policy
autoplay 'self';camera 'none';fullscreen 'none';geolocation 'none';microphone 'none';midi 'none';payment 'none';sync-xhr 'none';usb 'none';vr 'none'
pragma
no-cache
referrer-policy
same-origin
strict-transport-security
max-age=86400; includeSubDomains; preload
surrogate-control
no-store
x-content-type-options
nosniff
x-download-options
noopen
x-xss-protection
1; mode=block
nel
{"failure_fraction":"1.0","max_age":86400,"report_to":"report-endpoint","success_fraction":"0.0"}
x-fastcgi-cache
BYPASS
x-backend-server
adsrv-l0z7
via
1.1 google
alt-svc
clear

Redirect headers

status
307
server
nginx
date
Mon, 16 Mar 2020 20:08:36 GMT
location
https://ad4m.at/ad/rar?a=13516&b=oneidxRPFQfAfb3RSPHdH9uQtREQC1C6oneid__asuid0asuid__Stroeer_RON_160x600&f=oneidYz2Srf3f9YGtVH9H6ugCR5ZCQC1oneid__asuid0asuid__Stroeer_RON_160x600&c=160&d=600&e=&g=735bd80f6dbf1806ea624eb71cc01fdb%2F9088414369191691710&i=20612&j=16&k=0&l=0&m=0&n=&y=1&z=0
cache-control
private, no-store, max-age=0
x-fastcgi-cache
BYPASS
x-backend-server
rs-sv2g
via
1.1 google
alt-svc
clear
publishertag.prebid.js
static.criteo.net/js/ld/
66 KB
21 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?pcgameshardware.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a02:2638::3 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
96336d97988b013c2558b7026cdeccc739ead83822d59f1c1d2acf038e5b6e2f

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:36 GMT
content-encoding
gzip
last-modified
Thu, 12 Mar 2020 20:26:11 GMT
server
nginx
access-control-allow-origin
*
etag
W/"5e6a9ae3-107de"
content-type
text/javascript
status
200
cache-control
max-age=86400, public
timing-allow-origin
*
expires
Tue, 17 Mar 2020 20:08:36 GMT
specTr.php
stats.computecmedia.de/
0
300 B
Image
General
Full URL
https://stats.computecmedia.de/specTr.php?s=24&c=72&p=ta&zRnd=65749.94617798622
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.146.104.136 , Germany, ASN15598 (QSC-AG-IPX, DE),
Reverse DNS
Software
Apache/2.4.25 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Date
Mon, 16 Mar 2020 20:08:36 GMT
X-Clacks-Overhead
GNU Terry Pratchett
Server
Apache/2.4.25
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=0
Connection
Keep-Alive
Keep-Alive
timeout=4, max=499
Content-Length
0
Expires
Mon, 16 Mar 2020 20:08:36 GMT
specTr.php
stats.computecmedia.de/
0
300 B
Image
General
Full URL
https://stats.computecmedia.de/specTr.php?s=24&c=208&p=ta&zRnd=36354.03176722638
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.146.104.136 , Germany, ASN15598 (QSC-AG-IPX, DE),
Reverse DNS
Software
Apache/2.4.25 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Date
Mon, 16 Mar 2020 20:08:36 GMT
X-Clacks-Overhead
GNU Terry Pratchett
Server
Apache/2.4.25
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=0
Connection
Keep-Alive
Keep-Alive
timeout=4, max=498
Content-Length
0
Expires
Mon, 16 Mar 2020 20:08:36 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame F616
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssSKz4pENWgFeT90tz6xihHB3VAIHlHld0gxBQPpWCm7KnXFFcJQC7plEGi8ds7VvKwHXSSkY4ZxF1f18NAFerqAZVxAIfYt7KbOrX6hnxPVR2-a1zXTJ-6d5-b_ZndF0ju0TDzc4dX7p_AgBgOK3ltm1i0hk0lAZeZdpX3dRPMpf-eZumPHg4XboRsQD1dyPB2uhgG7ooZ2jilFq9Led1mGeKkLa5bwZqdPHxGZDZc6C1or3ZRAwG3bnDqwZPFfRElIN1Q9Xw0lmvXmQl-dzdlUDECKJ-dzbhxc5gbw0MjyPDzoNKRdr1aVi8&sig=Cg0ArKJSzEV_XLcCoQE-EAE&urlfix=1&adurl=
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
empty

Response headers

timing-allow-origin
*
date
Mon, 16 Mar 2020 20:08:36 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
getads.js
js.adscale.de/ Frame F616
23 KB
8 KB
Script
General
Full URL
https://js.adscale.de/getads.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.60.16.116 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-60-16-116.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
ff84301b99c39ed925a311967a1e6c05ff50b711cddd68c8fbb5c8eb4d3bbd0c

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

x-amz-version-id
v.xztckJDFLGV5AQTWz.RPh.DoUrNpt9
Content-Encoding
gzip
Last-Modified
Wed, 11 Mar 2020 22:16:27 GMT
Server
AmazonS3
x-amz-request-id
EA9EAB849377E5EA
ETag
"a412bd6525fb2e5c7ae8479cbc5a5eeb"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Mon, 16 Mar 2020 20:08:39 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
7840
x-amz-id-2
W87loYQilHNE5g20RaKJGB3i9KipYKKMl7D2f+ty+MlTEPec1QOsvKlzyojz3PTynXVR8Qno88A=
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame F616
73 KB
28 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_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1584099738113808"
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
28086
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:36 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 3797
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstuS_2OJzgJ2psonIgk5yttMZe9dRYwHrfzkhhDzDj6EMm2GJRO5PEcERqvOdWaz_L2k1A9SALUsYfaAzH8W7FQNnAZUmFqYWMmPjWLCTI&sig=Cg0ArKJSzAKCTUfYar9BEAE&adk=2479418200&tt=-1&bs=1585%2C1200&mtos=1007,1007,1007,1007,1007&tos=1007,0,0,0,0&p=120,299,210,1027&mcvt=1007&rs=0&ht=0&tfs=134&tls=1141&mc=1&lte=0&bas=0&bac=0&met=ce&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1584389316384&dlt&rpt=109&isd=0&msd=0&ext&xdi=0&ps=1660%2C5151&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-6-11-11-0-0-0&tvt=1137&is=728%2C90&iframe_loc=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200313
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

pragma
no-cache
date
Mon, 16 Mar 2020 20:08:37 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
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 C870
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssx_vvGkka1wDPK6OPhU0zLg0oiEQoZyxhhoYCS-NOQo9wFaEkdDLi6rIYnyHiESuBe3HeWvV11VtHDqEzq7jZ3RbWmeSjuRqdGP8bMuOU&sig=Cg0ArKJSzLu2s2y3eISlEAE&adk=3511023609&tt=-1&bs=1585%2C1200&mtos=1008,1008,1008,1008,1008&tos=1008,0,0,0,0&p=240,1173,840,1333&mcvt=1008&rs=0&ht=0&tfs=158&tls=1166&mc=1&lte=0&bas=0&bac=0&met=ce&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1584389316389&dlt&rpt=118&isd=0&msd=0&ext&xdi=0&ps=1660%2C5151&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-3-11-11-0-0-0&tvt=1164&is=160%2C600&iframe_loc=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200313
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

pragma
no-cache
date
Mon, 16 Mar 2020 20:08:37 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
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 0E79
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsserXy4zLa2RcIc0x2Ks_wh87ImpW3LH_cNQ68v6suuXxOfbCpRUttxuvYBrafGWrAv7yb4eEB2diBAlfd1Tqtm3TIbtN7GxDwxCbK0ygA&sig=Cg0ArKJSzJgDUwk7pAoBEAE&adk=3888641151&tt=-1&bs=1585%2C1200&mtos=1007,1007,1007,1007,1007&tos=1007,0,0,0,0&p=267,848,517,1148&mcvt=1007&rs=0&ht=0&tfs=152&tls=1159&mc=1&lte=0&bas=0&bac=0&met=ce&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1584389316393&dlt&rpt=144&isd=0&msd=0&ext&xdi=0&ps=1660%2C5151&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-2-11-11-0-0-0&tvt=1159&is=300%2C250&iframe_loc=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200313
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

pragma
no-cache
date
Mon, 16 Mar 2020 20:08:37 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
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
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/ Frame FABB
53 B
714 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=4293835775
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpeGVDZWVkVGhlZXNvaGo9YWl4ZUNlZWRUaGVlc29oanx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnduKWwuRGwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmZiKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5ZbihsKTtiLlhuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmZvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkZoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5GaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlVrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQ24uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnJoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnNqPWE7YS5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5yaFtiXSYmKHRoaXMucmhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy53bygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUWs6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LENuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLkJuKGIuZGF0YSl9LEJuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2goYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ2g6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sT2s6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5SbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sUmw6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxLbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxmaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0saW86ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLmlvKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sQWg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LApBPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPUE7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O0E9QSttJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYShBKSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LGFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCxBPTA7QTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoQSsrKSxnPWIuY2hhckNvZGVBdChBKyspLHE9Yi5jaGFyQ29kZUF0KEErKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxGbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSxBPSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksQT0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPUE7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtQaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxXaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx2bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxTajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx3azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sR2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxnazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlBpKCl8fGIuV2koKXx8Yi52bSgpfHxiLlNqKCl8fGIud2soKXx8Yi5HaigpfHxiLmdrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0saW06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEZsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LG9vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGFoOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy52aShhKSsiOiIrdGhpcy52aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnduPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSxEbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LHBvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5aZyhiKSlyZXR1cm4gdGhpcy5aZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuYWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5mYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuT2soZixiKTtyZXR1cm4gZn0sZmI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sVG06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YuYWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5mYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlRtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5mYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LERtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnNqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnJqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZ249e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucXA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSWw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuR2s9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuWG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkpsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLklrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkhrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuRGk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5rbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EucHA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuVG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5obj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkNsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuZW0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy50anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnFufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5jbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuWm4oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxabjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkVoJiZMLnZvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sa286ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sYW86ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx5cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ybSgpfHx0aGlzLktrKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxLazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxlaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFpoOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0sdHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkRrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy4kbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxmLmtmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnJpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHJpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm9iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGhvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ea30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwkbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxYbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5lanx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaGp8fG9hOyhmdW5jdGlvbihjKXtjLmlqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmlqfHxwYTsoZnVuY3Rpb24oYyl7Yy5qaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMuamp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLk9pfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5ZZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxtcTpmdW5jdGlvbigpe3JldHVybiExfSxZZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApOwp0aGlzLlcoYil9fSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9CmEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7CnJldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQmp8fHNhOyhmdW5jdGlvbihjKXtjLkFqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LG9xOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5yZT0hMTt0aGlzLnRlPTE7dGhpcy5qZD1bXTt0aGlzLkdiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmCmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnRlPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5HYj0hMCk7ZWxzZXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlIGluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciBlPTA7ZTxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmxlbmd0aDtlKyspaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZVtlXS50YWcpe3RoaXMuR2I9ITA7YnJlYWt9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5HYj0hMCk7Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5HYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkdiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7dmFyIGQ9CiJhZFBsYXkgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIik7aWYoZi5SKCJzcGllZ2VsLmRlIikmJi0xIT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpKXthLm9uKCJiZWZvcmVQbGF5IixmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5qdy12aWRlbyIpOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtiLmZvckVhY2goZnVuY3Rpb24oYil7ImF0dHJpYnV0ZXMiIT1iLnR5cGV8fCJzcmMiIT1iLmF0dHJpYnV0ZU5hbWV8fHRoaXMucm58fC0xIT1iLnRhcmdldC5zcmMuaW5kZXhPZigidmNkbjAxIil8fCh0aGlzLnJuPSEwLGIudGFyZ2V0LnNyYz0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iK2YuYWIoYi50YXJnZXQuc3JjKSx6LmJpbmQodGhpcykoKSl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSkub2JzZXJ2ZShiLAp7YXR0cmlidXRlczohMCxjaGlsZExpc3Q6ITAsY2hhcmFjdGVyRGF0YTohMH0pfS5iaW5kKHRoaXMpKTt2YXIgZyxjLGgsej1mdW5jdGlvbigpe2g9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiei0xMCIpO2Zvcih2YXIgYj0wO2I8aC5sZW5ndGg7YisrKWhbYl0uY2xhc3NMaXN0LnJlbW92ZSgiei0xMCIpO2c9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5wYXJlbnRFbGVtZW50O2I9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKTtjPWIuc3R5bGU7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSItIisoYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55LWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWFyZWE9J2hlYWRlci1iYXInXSIpLm9mZnNldEhlaWdodCkrInB4IjtiLnN0eWxlLmxlZnQ9IjBweCI7Yi5zdHlsZS53aWR0aD0iMTAwJSI7Yi5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IiwxNipiLm9mZnNldFdpZHRoLzkrInB4IiwKImltcG9ydGFudCIpO2Iuc3R5bGUuekluZGV4PTFFMztiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Yi5sb2FkKCk7Yi5wbGF5KCl9O2Eub24oImFkQ29tcGxldGUiLGZ1bmN0aW9uKCl7Zy5pbnNlcnRCZWZvcmUoandwbGF5ZXIoKS5nZXRDb250YWluZXIoKSxnLmZpcnN0Q2hpbGQpO2p3cGxheWVyKCkuZ2V0Q29udGFpbmVyKCkuc3R5bGU9Yztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXtpZihnJiZjKXtnLmluc2VydEJlZm9yZShqd3BsYXllcigpLmdldENvbnRhaW5lcigpLGcuZmlyc3RDaGlsZCk7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5zdHlsZT0KYztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSl9Zm9yKGU9MDtlPGQubGVuZ3RoO2UrKylhLm9uKGRbZV0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtlXSYmKHRoaXMucmU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtlXSYmdGhpcy5MaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLiRtJiYhdGhpcy55YSgpJiYodGhpcy5HYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsCjFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5NYjtiJiYoYi5OZCgpLGIueGQoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuVmd8fCh0aGlzLlZnPVtdKTt0aGlzLlZnLnB1c2goe2NvZGU6YS5jb2RlLG1zZzphLm1lc3NhZ2V9KTt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJgowPGEubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnRlJiZ0aGlzLmkoKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuTGU/dGhpcy5MZSsrOnRoaXMuTGU9MTp0aGlzLktlP3RoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLllnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMuQWp8fHRhOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGUmJmUoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLndifHx0aGlzLksoZSl8fHRoaXMuRW0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYuYWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9CmE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy5Ya3x8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mucms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwKJGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5xaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVWg9Zi5TYigxMCk7dGhpcy54aT0hMDt0aGlzLkNjPXRoaXMudmg9ITE7dGhpcy5lbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksCnRoaXMueWIoKSl9LGVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLlIoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuSWE/YS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5JYT90eXBlb2YgYS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlVoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sCmloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmMpe3ZhciBhPXRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy51aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLkxuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sTG46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2lmKGYuUigiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYKKHRoaXMuTWc9YS5hZHMpO3JldHVybiB0aGlzLk1nfSxobDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuTGgoKX0uYmluZCh0aGlzKSl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLAplPXRoaXMuUGMoKTtiJiZlJiYodGhpcy5DY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNjP3RoaXMudygpOih0aGlzLmRhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnZoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PQpifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuTT1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxpbDpmdW5jdGlvbigpe3RoaXMuSWN8fCh0aGlzLkljPSJ1bmtub3duIik7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkcyl7aWYodGhpcy5JYyE9YS5hZHMuc3RhdGUmJih0aGlzLkljPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkljKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlsKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/Cih0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMueWEoKXx8KGF8fCh0aGlzLnhpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLnhpLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuaXF8fCgxMDx0aGlzLmJwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYnArKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5TbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxTbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYKIXRoaXMuY3Ape3RoaXMuY3A9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5xa3x8eWE7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuaWkod2luZG93KTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmlpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGlpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmCihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuU2UoYikpe2Zvcih2YXIgZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJihhPW5ldyB4YShiW2VdKSxhLmhhfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTChhKSwobmV3IHlhKGEsdGhpcy5GKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LE86ZnVuY3Rpb24oKXt0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMuc2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy50Zj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmKGI9YS5wYXJlbnROb2RlKSwhYikpe3RoaXMuVSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0seW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fApiLk5kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy50Zj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LHVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTphLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuVWp8fFI7KGZ1bmN0aW9uKGMpe2MuVGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0KMCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBlPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWU9ITA7ZXx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChlPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5NPXRoaXMuTXx8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuTWw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5NbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLnluKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTsKdGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihjKXtjLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgUihhW2JdKTtlLmhhfHx0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBDYShlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRGE9Yy5Wanx8RGEsRWE9bmV3IERhKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuc218fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmZoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYKKGI9Yi5wYXJlbnROb2RlKX10aGlzLkFuPWEucG9zaXRpb25pbmc7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5zdHlsZS53aWR0aD1hLndpZHRoO2Uuc3R5bGUubWluV2lkdGg9YS53aWR0aDtlLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7ZS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5Bbil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTsKdGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLkFoKHRoaXMuQ2QpO2YuYWYodGhpcy5DZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFsKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy55anx8R2E7KGZ1bmN0aW9uKGMpe2MueGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMueGp8fElhOyhmdW5jdGlvbihjKXtjLnpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9Cm0uaW5yZWFkLGI9Zi5maChhLCJlbGVtZW50SUQiKTtpZihmLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuSyhhKSkpe3RoaXMuTChhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnpqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5ibHx8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT0Ke319Yy51aj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LExrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBDPWMudWp8fEM7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixhLGQsZyxjKXt0aGlzLkZhPWI7dGhpcy4kZz10aGlzLkdpPSExO3RoaXMuTWg9ZDt0aGlzLmppPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmxiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09CmgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuZGYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9Yy52aj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy4kZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5sYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuamk/dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmxiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuR2l8fAoodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMubGIuc2VuZChiKX1jYXRjaChnKXtiPXRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5Iil8fHRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTWgmJnRoaXMuTWgoKX1yZXR1cm4gdGhpcy5sYn19fSkoYyk7dmFyIE1hPWMudmp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuYWo9CmE7YS5wcm90b3R5cGU9e2VvOmZ1bmN0aW9uKGIpe3RoaXMubWU9Yn0sY286ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxRbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt4cDoiQWRDbGlja1RocnUiLHpwOiJBZEVycm9yIixBcDoiQWRTdG9wcGVkIixEcDoiQWRMaW5lYXJDaGFuZ2UiLEVwOiJBZFRhZ1BhcnNlZCIsSHA6IkFkVmlkZW9Db21wbGV0ZSIsS3A6IkFkTG9hZGVkIixMcDoiQWRTa2lwcGVkIixNcDoiQWRTdGFydGVkIixCcDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLENwOiJBZEltcHJlc3Npb24iLHlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7CmZvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5tZSxhW2RdKX0sUG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmxlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmxlKXRoaXMuR2EubGUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5HYSx0aGlzLkdhLmxlW2FdKTt0aGlzLkdhJiZ0aGlzLkdhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkdhLmdldEVycm9yKCl9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5RbigpO3RoaXMuR2EmJnRoaXMuUG4oKX19fSkoYyk7dmFyIE5hPWMuYWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnFiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLnBiPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjsKdGhpcy5lZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy4kZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy55Zj0hMTt0aGlzLmlhPVtdO3RoaXMuV2U9dGhpcy5WYj0iIjt0aGlzLmplPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLm5iPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLmFjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLldiPSIiO3RoaXMuWGI9W107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmpiPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmJiPXtnbG9iYWw6ITEsY2xpZW50OiExLApjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5FYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5ZYz10aGlzLlFkPW51bGx9Yy53aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXI6dGhpcy5wYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZWMsYWR0YWdyZWdleDp0aGlzLnFkLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmZmLHNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLApzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLldlLEhPTUFEX1ZFUklGSUVEOnRoaXMuamUsSE9NQURfQkxPQ0tFRDp0aGlzLmllLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsdGVzdFRhZ3NYSFI6dGhpcy5iZCx0ZXN0M1BDb29raWU6dGhpcy50Yyx0aHJvdHRsZTp0aGlzLlpkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubmMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5IZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmJiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuZWIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLkxmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFduOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkNhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLnFiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMucGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmZmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy56Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5lZj1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5RYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJgoodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLiRlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuV2U9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuamU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5uYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLmJkPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy50Yz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuWmQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLkhnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuV2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5iZT1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYmI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmViPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuTGY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuYWc9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5FYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LApxbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5iYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmJiW2FdJiYxPT10aGlzLmJiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuYmJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmJiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYmJbYV0mJjE9PXRoaXMuYmJbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sWGQ6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIiwKZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuJGsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIixjPSIiLGY9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5jZihiKTtjPXRoaXMuYWEoYik7Zz8odGhpcy5TYygpP2Y9YjpmPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGY9dGhpcy5xYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFifHx0aGlzLnBifHx0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5ibihoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmJtKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD0KaDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5hYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGNmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5TYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj0KYS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxkZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmNmKGIpO3JldHVybiBhfSxibTpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIiwKYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSWg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sYW46ZnVuY3Rpb24oYixhKXt2YXIgZD1mLmFhKGIpLGc9IiIsZz0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZz17fSx6PTA7ejxoLmxlbmd0aDt6Kyspe3ZhciBrPWhbel0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5JaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPQp0aGlzLkloKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmKGIrPXRoaXMucWIpO2lmKHRoaXMucGIpZm9yKHZhciBhIGluIHRoaXMucGIpdGhpcy5wYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5wYlthXSkpO2lmKGYuSmMpZm9yKHZhciBkPTA7ZDxmLkpjLmxlbmd0aDtkKyspe3ZhciBnPWYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuYW4oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmCmEuZW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmNvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxjLGYpe2w9dGhpczt0aGlzLmVmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy55Zj1kO3RoaXMuZWU9Zzt0aGlzLmljPWM7dGhpcy54YT1mfHx7fTt0aGlzLnBsKCk7dGhpcy5TbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlFtKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkdjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZ2I6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxEbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sU206ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuUWMrdGhpcy54ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5HYygpfS5iaW5kKHRoaXMpLCEwKX0sUW06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy54ZSgiY2xpZW50IiwtMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iKwp0aGlzLlNiKCkpO3RoaXMueGEmJnRoaXMueGEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnhhJiZ0aGlzLnhhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGUpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaWM9ITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPQp0aGlzLiRlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5nYih0aGlzLmllKSk7dGhpcy5CYigpO2YuTGMoay54bik7KGE9Zi5VYSh0aGlzLklkKCkpKXx8KGE9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuaXNFbmFibGVkPXRoaXMuQWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPGQuc2VydmVyLmxlbmd0aDtiKyspe3ZhciBhPQpkLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaCh6KXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8CltdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5SKCJ3ZWIuZGUiKXx8Zi5SKCJnbXgubmV0Iil8fGYuUigiZ214LmF0Iil8fGYuUigiZ214LmNoIil8fGYuUigiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5kaShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJgp0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxkaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFRjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucWMoKSksZD10aGlzLmFhKHRoaXMuVmIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGEsdGhpcy55by5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTsKYj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5bzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuV2Y9dGhpcy5BYihkLnN0cmljdCk7dGhpcy5iZT10aGlzLkFiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5lYj10aGlzLkFiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuV2I9ZC50ZXN0aGlkZXx8IiI7dGhpcy5ZYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmJkPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5xYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnBiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fApudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZmY9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnhhLnZwYWlkPXRoaXMuamI7dGhpcy5MZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkVjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmRpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5aZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMuRGI9ZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuS28oKSYmCih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnlmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuRWUoKSx0aGlzLkJiKCkpOnRoaXMuQm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5UZigpKX19LFdtOmZ1bmN0aW9uKGIpe3RoaXMuSGk9ITA7dmFyIGE9ZnVuY3Rpb24oYil7aWYoYj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2IrIj0oW147XSspIikpKXJldHVybiBiWzJdfSgiYWRwX3NlZ3MiKXx8ImUwIixhPXRoaXMuRGIudXJsLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKS5yZXBsYWNlKCJbc2Vnc10iLGVuY29kZVVSSUNvbXBvbmVudChhKSksYT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6YSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLmFiKGEpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07CmYuS2QodGhpcy5xYygpLCJQT1NUIixhLGZ1bmN0aW9uKGEpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaCh6KXtiKCl9YigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YigpfS5iaW5kKHRoaXMpLCEwKX0sQm86ZnVuY3Rpb24oKXt0aGlzLkFvKCk7dGhpcy5DbygpfSxDbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksej1mLlYoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHosZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoeikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2YuYWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChnKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9Zi5CZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLnNhKCJjc3BfIithKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxUZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sWWQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IoYSkpLHRoaXMuQmIoKSx0aGlzLkVlKCkpfSxBbzpmdW5jdGlvbigpe2lmKHRoaXMuV2Ipe3ZhciBhPWYuQmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLkhtKCkpdGhpcy5ZZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTsKZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpO2E9ZH1jYXRjaChnKXt9YT90aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm1pKCl9fWVsc2UgdGhpcy5taSgpfSxSZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy5GbyhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBkPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZigpfSxGbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZj8od2luZG93LmNsZWFyVGltZW91dChmKSwhMCk6ITF9dmFyIGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbWk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuR28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGQ9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlJmKCl9LEdvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7ZigpJiZlKCl9ZnVuY3Rpb24gYygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZSl7ZT09YSYmZigpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPQpjO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sUWY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLktkKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuQWIoYS5jYyk7dGhpcy5UZigpfS5iaW5kKHRoaXMpLHRoaXMua2kuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5raSgpfWVsc2UgdGhpcy5UZigpfSxraTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKTt0aGlzLkVlKCl9LEhtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LEJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJgooYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnhjJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5RZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMuamUpKTt0aGlzLmVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuZWUmJnRoaXMuZWUoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuSGJ9KX0sY2w6ZnVuY3Rpb24oKXt0aGlzLlljPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWWMuaWQ9Zi5WKDEwKTt0aGlzLlljLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5ZYyk7dmFyIGE9dGhpcy5ZYy5jb250ZW50V2luZG93LGU9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD0KZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5RZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5RZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi5BZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYTthPShhPWRvY3VtZW50LmNvb2tpZS5tYXRjaCgvKF58IClhZHBfc2Vncz0oW147XSspLykpP2FbMl06dm9pZCAwO2EmJmYudHJhY2soInN0YXRzX2hkX3NlZ3MiLCJlMCIhPWEsITApfS5iaW5kKHRoaXMpLDJFMyl9LG9sOmZ1bmN0aW9uKCl7aWYodGhpcy5iZSYmdGhpcy5xbSgpKXt2YXIgYT10aGlzLiRsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIiwKYS5qb2luKCJfIiksITApfX0scmk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxLYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrO3RoaXMuSGQ+dGhpcy5waCYmIXRoaXMucWgmJih0aGlzLnFoPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5waCwhMCkpO2E9bmV3IE1hKGEsZSxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtnJiYoYS5HaT0hMCk7YyYmZi5GbSgpJiYoYS4kZz0hMCk7aCYmKGEuamk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLlptfHwKKHRoaXMuWm09ITAsZi5EYSgpfHxmLmZiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihnPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGdbMF0mJihnPWdbMF0pLGcpe2c9ZyYmZy5jaGlsZE5vZGVzJiZnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKwoiOi8vIitnLmhvc3QpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Zi5uZXR3b3JrU3RhdGU9PWYuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9Zi5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFwcGVuZENoaWxkKGUpO2Yuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx6bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5Xby5iaW5kKHRoaXMpLHRoaXMuVm8uYmluZCh0aGlzKSl9LFdvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsOwp0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuS2woKX0sVm86ZnVuY3Rpb24oKXt9LEtsOmZ1bmN0aW9uKCl7Zi5MYyhrLkpsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxFZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuemIubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy56YlthXTsicmVxdWVzdCI9PWUudHlwZSYmZi5mYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWUudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztmLmZiKGUudXJsLGUuYWxpYXMsCm51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxLbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLlpkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPSIiLGQ9MDtkPGE7ZCsrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBlfSxBYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxhYjpmdW5jdGlvbihhKXtmb3IodmFyIGU9IiIsZCxnLGMsZixoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz0KYS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxmPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihjKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZX0sYWE6ZnVuY3Rpb24oYSl7dmFyIGU9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZz0xNDtnLS07KWRbZVtnXV09YVtnXXx8IiI7ZC5xdWVyeUtleT17fTtkW2VbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZSl7YiYmKGQucXVlcnlLZXlbYl09ZSl9KTtyZXR1cm4gZH0sSmY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZShhKXt2YXIgYj0iIixkLGU7Zm9yKGQ9NzswPD1kO2QtLSllPWE+Pj40KmQmMTUsYis9ZS50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZj1BcnJheSg4MCksCmg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpYz1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKylmW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO2M9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGMsNSkrKG4mcHx+biZyKSt1K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9MjA7Mzk+PWc7ZysrKXY9ZChjLDUpKyhuXnBecikrdStmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTQwOzU5Pj1nO2crKyl2PWQoYyw1KSsobiZwfG4mcnxwJnIpK3UrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YywKYz12O2g9aCtjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy53anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLldrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUGE9Yy5Xa3x8UGE7bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUsZCl7dGhpcy5hPWE7YS5jLlA/dGhpcy5oYj1hLmMuUCgpOnRoaXMuaGI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5haS5iaW5kKHRoaXMpLG11dGU6dGhpcy5vZi5iaW5kKHRoaXMpLAp1bm11dGU6dGhpcy5Rby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnNiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLllrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVmQ9e307Zi52YigibmV3QmlnQWRJZCIpO3RoaXMuYWw9Zi5WKDEwKTt0aGlzLk5mPTA7dGhpcy5vZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLm9kPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLm9kPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlJrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuV2M9dGhpcy5VZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoPwpwYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMud2U9ITE7dGhpcy51aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZmk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5mZT10aGlzLiRiPXRoaXMuSWU9dGhpcy55ZD10aGlzLldkPXRoaXMuQ2I9dGhpcy52Yz10aGlzLlBoPXRoaXMuSGU9dGhpcy5EZD10aGlzLkxvPXRoaXMuRmI9dGhpcy5RYj0hMTt0aGlzLkFjPVtdO3RoaXMucGM9e307dGhpcy50bj0yMDA7dGhpcy5kZz10aGlzLmRkPXRoaXMuRmM9dGhpcy5jZz10aGlzLnhmPSExO3RoaXMucWY9e319Yy5xaj1hO2EucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmhiXSYmdGhpcy5jb25mW3RoaXMuaGJdW2FdJiYoZT0KdGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gZX0sc2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLnJvKCk7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0samY6ZnVuY3Rpb24oYSxlLGQsYyl7dGhpcy5GYj1kO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLk5mKyssZi52YigibmV3U21hbGxBZElkIiksdGhpcy5BLm9sKCksYz1sLmdldENvbmZpZygpLGYuT2cmJih0aGlzLkEuV24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsCmtlZXBVUkw6ZSxiaXRyYXRlOmMuUGEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmpiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB4Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt4Yy5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmxvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLkFjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmttKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5iaChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlZsKGIpKSk7cmV0dXJuIGV9LFZsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0sa206ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLnFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmZuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5JbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuc28oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsucnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5zcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLlRvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLlVvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sbG86ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMua2IuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS52cT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlJrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk1rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5uaShlKSl7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5QayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmtiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMua2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuam8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sam86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuUWsodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5RaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMuemkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLm5tKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuZXAoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5mcCgpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5qcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5vcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5FaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmdwKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmhwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0saHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGpwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGZwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuaGkoKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxucDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxscDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxvcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LEVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LGVwOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkVpKCEwKX0sTWs6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBkPWIuYWEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLmFwLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5DaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm5pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlpvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLllvKCk7dGhpcy56aSgpO3RoaXMuQmcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5laSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuZWImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuR2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LEprOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZ2goYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5wbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuSmsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5rbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS53aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlpoKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkpoKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sYXA6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQ2k6ZnVuY3Rpb24oKXtpZih0aGlzLkxvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5PbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmtiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLndpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi5haCh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx0aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxPbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudWl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudGkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnRpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuaGkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5lYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuZWImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy51aT1hKX0sZ2k6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxybzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0saGk6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHNvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5lYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5lYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMubG0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLkRtKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkhrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGQpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkVsKHRoaXMuYi5PYSxhKX1jYXRjaCh6KXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5MayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLk5rKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5ZaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlloKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxOazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFloOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sdW86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sbG06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxFbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxabzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sWW86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuYWgoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnBpLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5maTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxhaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuTW0oKSYmdGhpcy5MbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLlBvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LE1tOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuamJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5qYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5qYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxMbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sYW06ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LFBvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmYudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsZS5hdmFpbGFibGUsITApO2lmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7Zi50cmFjaygic3RhdHNfd3RfY2F0Y2giLCIiLCEwKX10aGlzLnhkKCl9dmFyIGU9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzLGQ9dGhpcy5hbSgpO3RoaXMuRmM9dGhpcy5XYz10aGlzLmRkPXRoaXMuZGc9ITA7cmV0dXJuIGU/KGYuZmIoImh0dHBzOi8vd3d3LndlbGVjdC5kZS9hcGkvdjEvcHJlZmxpZ2h0L2J5X2FsaWFzLyIrZSwiZGV3ZWxlY3R3d3d3ZWxlY3RkZSIse30sYS5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSx0aGlzLkEpLAohMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMudW8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSx0aGlzLnRuKToodGhpcy5XZD0hMCx0aGlzLmEuVmUoKSx0aGlzLmEuVW4oKSx0aGlzLm9jPSExLGE9dGhpcy5iLnN8fHt9LHRoaXMuSGV8fChhLm5vQ29tcGxldGVRdWFydGlsZT0hMCksZi5vKGsueWwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLlJlKCkuWmgoKSl9LFJlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LEJnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGYuYWYodGhpcy52aWRlbyxhKT90aGlzLmFpKCk6dGhpcy5OZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZygpfS5iaW5kKHRoaXMpLDEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9CnRoaXMuYi5yYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLkFjJiYwPHRoaXMuQWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLkFjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHU6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLmFsKyItIit0aGlzLk5mO3RoaXMuYiYmdGhpcy5iLmhoJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYi5oaCgpKTtyZXR1cm4gYX0sUmc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnFqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYT1jLkhsfHxSYTtuZXcgUmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGQsYyl7dGhpcy5vcHRpb25zPWN8fHt9O2U9ZDt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5vYT1udWxsO3RoaXMuWT1bXTt0aGlzLko9bnVsbDt0aGlzLnpjPXRoaXMuQmM9ITE7dGhpcy5iYT0iIjt0aGlzLmJnPSExO3RoaXMuc2g9IiI7YyYmYy5lbXB0eT90aGlzLlZtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBiPTAsZSxkPVtdO2Mub2s9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWYuQmQoKSxiO2I9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgZD0iIjtiLnF1ZXJ5S2V5JiYoZD1iLnF1ZXJ5S2V5Lmh2cCk7ZCYmKHRoaXMub3B0aW9ucy52cGFpZD0KITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwudmEobC5YZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFmLkRhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxjPWZ1bmN0aW9uKCl7cmV0dXJuIGUoKSYmKGYuUigibWFydGhhc3Rld2FydC5jb20iKXx8Zi5SKCJmYW5kb20uY29tIil8fGYuUigiZ2lnYS5kZSIpfHxmLlIoImtpbm8uZGUiKXx8Zi5SKCJzcGllbGV0aXBwcy5kZSIpfHxmLlIoImRlc2lyZWQuZGUiKSl9LmJpbmQodGhpcyk7aWYoZSgpfHxjKCkpe3ZhciBoPWYuTmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgYz1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYKIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4oZi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG49ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihjKCl8fGsoKXx8bSgpfHwiYXBwc3BvdCI9PQpkKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlhkKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLlhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixmLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuWGQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5VbS5iaW5kKHRoaXMpLHRoaXMuUm0uYmluZCh0aGlzKSl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuTmIpdHJ5e3ZhciBlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09ZS5maXJzdENoaWxkfWNhdGNoKGMpe2RbYl09e319ZWxzZSBkLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLk5ifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5OYnx8dGhpcy5KbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC56bygpKXRyeXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Yy5sZW5ndGgmJihjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2NbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtlW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspZC5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChkKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxKbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGQ9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZT0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZT1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZSYmTWF0aC5hYnMoZS1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWQ/ITA6ITF9LFVtOmZ1bmN0aW9uKGEpe3RoaXMuRW4oYSk7dHJ5e3RoaXMub2E9YS5yZXNwb25zZVhNTCx0aGlzLm9hfHwodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuc2g9YS51cmxDYWxsZWQ7aWYodGhpcy5ZLmxlbmd0aCl0aGlzLlZjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUmEodi5mZCx7ZXJyb3I6dGhpcy5iZz8KRi5uZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuVWEodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxWbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuWS5sZW5ndGg/dGhpcy5WYygpOnRoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKX0sUm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUmEodi5mZyx7ZGVwdGg6Yn0pKX0sVmM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5ObSgpP3RoaXMuSG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5taCgpLGUse0FkU3lzdGVtOnRoaXMuVWwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5SYSh2LmlnKSk6KGI9MCx0aGlzLlJvKCkmJnRoaXMudWYodGhpcy5CbCgpKSl9LHBmOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5wZigpfSxKaDpmdW5jdGlvbigpe3RoaXMuemM/KHRoaXMuemM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQuSmgoKX0sUm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FbygpP3RoaXMuRG8oKT8hMDooLTEhPXRoaXMuTmMoKT90aGlzLnJhKHRoaXMuUmEodi5oZSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSksITEpOih0aGlzLnJhKHRoaXMuUmEodi5mZCxGLmhnKSksITEpfSx1ZjpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5nZXx8KGEuZ2U9W10pO2EuZ2UucHVzaCh0aGlzLnNoKTthLk9hPWEuT2EuY29uY2F0KHRoaXMubGYoKSk7YS5FYj1hLkViP2EuRWI6dGhpcy5CYzsKYS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7dGhpcy5wYXJlbnQudWYoYSl9LEJsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmR1cmF0aW9uPXRoaXMuTmMoKTthLk49dGhpcy5qaCgpO2EucmI9dGhpcy5XbCgpO2EuQ3E9W107YS5vcmlnaW49dGhpczthLnM9dGhpcy5UbCgpO2EuTWY9dGhpcy5qbShhLmR1cmF0aW9uKTthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fAoodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2lmKCF0aGlzLkomJnRoaXMub2EmJnRoaXMub2EuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5vYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmQubGVuZ3RoJiZmLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZSl7fX10aGlzLkomJihhLk9hPWEuZXJyb3IuY29kZSE9di5oZS5jb2RlP2EuT2EuY29uY2F0KHRoaXMuWGwoKSk6YS5PYS5jb25jYXQodGhpcy5mbSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmtjJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGtjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmtjKGEpfSxVZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxIbzpmdW5jdGlvbigpe3JldHVybiBiPGV9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5qaCgpLmxlbmd0aH0sRG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLk5jKCl9LFNmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LGxpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5TZigpJiYoYT0hMCk7cmV0dXJuIGF9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuYmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5iYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLmJhPSJVTktOT1dOIn10cnl7dGhpcy5iZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChlKXt9fSxObTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMubWgoKS5sZW5ndGh9LG1oOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUWUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIkFkU3lzdGVtIil9LGxmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1lJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiQ29tcGFuaW9uIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUpKXJldHVybn1jYXRjaChkKXt9aWYoYSYmIXRoaXMuemgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxlLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMudGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSx6aDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxYbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0samg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxQYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFVwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnRiKGFbZF0pfSk7dmFyIGU9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBjPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5QYSktTWF0aC5hYnMoZS1iLlBhKX0pLGY9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZS1hLlBhKS1NYXRoLmFicyhlLWIuUGEpfSksYj1jLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LFRsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7CmZvcih2YXIgYj0iIixkPSExLGU9W10sYj0hMSxjPSIiLGY9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2M9Yj10aGlzLkdkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWUucHVzaChkKTtmLnB1c2goYyl9MTxhLmxlbmd0aD8oYj1lLGg9Yyk6KGI9ZCxoPWYpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxOYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sam06ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxlPSExO3RyeXtkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZT1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5vbyhlLAphKSwwPmImJihiPSExKX1jYXRjaChjKXtiPSExfXJldHVybiBifSxRZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMudGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx0YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkdkKGEpOiIifSxHZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5va3x8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLnBufHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk49W107dGhpcy5yYj0iIjt0aGlzLnM9dGhpcy55Yz10aGlzLkViPSExO3RoaXMuWGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlllPSIifWMuV2o9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sZG06ZnVuY3Rpb24oKXtpZighdGhpcy5YZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm9hKXt2YXIgYT10aGlzLm9yaWdpbi5vYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZT0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGU9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1lLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLlhlPWFbZF0pfXJldHVybiB0aGlzLlhlfSwKaGg6ZnVuY3Rpb24oKXtpZih0aGlzLlllKXJldHVybiB0aGlzLlllO3ZhciBhPSIiOyhhPXRoaXMuZG0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlllPWF9LG5tOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTi5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5OW2VdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Xanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5OaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHY9e29lOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE5hOiJYTUxfUEFSU0VfRVJST1IifSxlZzp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLAptZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGZkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGlnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE5hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKTmE6IkxPQURfRVJST1IifSxrZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx1cDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixOYToiTUVESUFGSUxFX0VSUk9SIn0saGU6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTmE6IkRVTU1ZX0FEIn19LEY9e2dnOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTmE6Ik5PX0FEUyJ9LGhnOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixOYToiTk9fTUVESUFGSUxFUyJ9LHZwOnt0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG5lOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMucGt8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5lcnJvcj1hO3RoaXMuQWQ9ZTt0aGlzLk9hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuZ2p8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPQpjLm5ufHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuJGg9YTt0aGlzLnZpZGVvPWU7dGhpcy5jZT1bXTt0aGlzLlhoPVtdO3RoaXMucmY9W107dGhpcy4kbz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSSgpfWMud3A9YTthLnByb3RvdHlwZT17STpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy4kaC5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLiRoW2FdLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsCmM9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO3ZhciBoPWYuY29udGVudFdpbmRvdztoLnJxPXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkpuLmJpbmQodGhpcyl9O3ZhciBrPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2sub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2guZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtoLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7CnRoaXMuY2UucHVzaCh7c3JjOmQsZnJhbWU6Zix2bjpjLHZlbmRvcjplLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5yZi5sZW5ndGg7ZSsrKXt2YXIgZD10aGlzLnJmW2VdO2QudHlwZT09PWEmJmQuZmwodGhpcy5ZbChhKSl9fSxZbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntBcTohMCx6cTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntucToidmlkZW8iLERxOiJqc0N1c3RvbSIsRXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxGcToxLFZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsCmVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LG1tOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5jZS5sZW5ndGg7ZSsrKWlmKHRoaXMuY2VbZV0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5jZVtlXS52bjtyZXR1cm4iIn0sUm46ZnVuY3Rpb24oYSxlKXt0aGlzLlhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLm1tKGUpLHZlbmRvcjplfSk7dGhpcy5xbygpfSxKbjpmdW5jdGlvbihhLGUpeyJ2aWRlbyI9PT1hP3RoaXMuJG8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuemcoYSxlKX0uYmluZCh0aGlzKSk6dGhpcy56ZyhhLGUpfSx6ZzpmdW5jdGlvbihhLGUpe3RoaXMucmYucHVzaCh7dHlwZTphLApmbDplLHhxOiExfSl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5YaC5tYXAoZnVuY3Rpb24oYSl7YS5HbXx8KGEucXEoe2FkU2Vzc2lvbklkOmYuVigyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuQnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLkdtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuUGx8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMuc2I9YS5laCgpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9CmYuVigxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy5BZz0hMTt0aGlzLmZjPVtdfWMuY2o9YTthLnByb3RvdHlwZT17U2w6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxmPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGY9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6Zix5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5TbChhKTtmb3IodmFyIGM9MCxkPTAsZj0hMSxoPXRoaXMudW0oYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LHhvOmZ1bmN0aW9uKCl7dGhpcy5BZz0hMH0sd2k6ZnVuY3Rpb24oKXt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2YubyhrLkhjLHRoaXMuYy5sKCkpfSxVbjpmdW5jdGlvbigpe3RoaXMuQWd8fCh0aGlzLmMucGxheSgpLGYubyhrLndkLHRoaXMuYy5sKCkpKX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuc2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLnNiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5zYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5zYik7dGhpcy5jLlpjJiZ0aGlzLmMuWmMoKT90aGlzLmMuZWgoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSx1bTpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LFFsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gY30sbWM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5RbCh0aGlzLnNiKTtpZihjLnghPXRoaXMuSGEueHx8Yy55IT10aGlzLkhhLnl8fGMucG9zaXRpb24hPXRoaXMuSGEucG9zaXRpb258fGMud2lkdGghPXRoaXMuSGEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLkhhLmhlaWdodHx8YSl7aWYoMDx0aGlzLkhhLndpZHRoJiYwPHRoaXMuSGEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5WZSgpO3JldHVybn10aGlzLkhhPWM7dGhpcy5jLlpjKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD0KYy54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuZmMubGVuZ3RoO2ErKyl0aGlzLmZjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWYuUGYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0seWc6ZnVuY3Rpb24oYSl7dGhpcy5mY3x8KHRoaXMuZmM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmZjLnB1c2goYSl9LFZlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CnRoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1mLlYoMTApO00uY29udHJvbHM9ITA7RC5wdXNoKE0pfXZhciBKPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy50bXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5SZChhKTt0aGlzLlBnKCl9LFJkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxQZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVGEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxaZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sbGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLlRhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTsKdmFyIGJiPWMuUWp8fGJiOyhmdW5jdGlvbihjKXtjLlBqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuZGM9dGhpcy5kY3x8ITE7dGhpcy5xZz10aGlzLnNnPXRoaXMud2g9dGhpcy56YT10aGlzLlVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTmwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMud2gmJnRoaXMuR2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5NYjthJiZhLm9jJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpO3RoaXMuRGcoKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5kYyl7dGhpcy51ZCgpO2lmKCF0aGlzLlVmJiYhdGhpcy51ZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuVWYmJnRoaXMucWcmJiF0aGlzLnNnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0sdWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtoKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LGtoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZzpmdW5jdGlvbigpe2lmKHRoaXMudWQoKSl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLnNnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMucWc9YS5TcH10aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLmtxKCk6ITF9LE5jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5OYygpOi0xfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sTmw6ZnVuY3Rpb24oYSxiKXt0aGlzLmRjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuZGN8fDMwMj09dGhpcy5kYz90aGlzLnphPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5kYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuemE/KHRoaXMudygpLHRoaXMuamEoKSk6YS5aZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmdtKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBjYj1jLlBqfHxjYjsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEltOmZ1bmN0aW9uKCl7d2luZG93Lk9PLiRqLkVrLkNrP3dpbmRvdy5PTy4kai5Fay5Day5RcChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLlNlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgY2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMuUmp8fGRiLGViPW5ldyBkYih0KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5zbnx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5oYT0hMTt0aGlzLm5oKCl9LG5oOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTsKYSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTWE6ZnVuY3Rpb24oKXt0aGlzLlRoKCl9LFRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcyksCjEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVWl8fGdiOyhmdW5jdGlvbihjKXtjLlRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRGUoYS5hZEVycm9yRXZlbnRzW2JdKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5EZShhKX0uYmluZCh0aGlzKSk7CmEucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHNbYl0pfS5iaW5kKHRoaXMpKTthLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYjsoZnVuY3Rpb24oYyl7Yy5WaT1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFZoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwoYS5SZChNYXRoLmNlaWwoMUUxMCoKTWF0aC5yYW5kb20oKSkpLHRoaXMuTChhKSwobmV3IGhiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMuT2x8fCh0aGlzLk9sPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5WaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBpYj1jLlZpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLmJqfHwKamI7bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sWmM6ZnVuY3Rpb24oKXt2YXIgYT1tO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLmlrfHxVOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubG4oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7CncubmQoIiMiK2EsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt3LnBtKCl9LGxuOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXtiPWlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYT1bXSxiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5NZCYmKGE9Zi5GbChhLHRoaXMuTWQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5LKGQpKXt0aGlzLkwoZCk7dmFyIGc9bmV3IFYoZCx0aGlzLkYpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLk1kfHwKKHRoaXMuTWQ9W10pLHRoaXMuTWQucHVzaChhW2JdKSxkPW5ldyBVKGgpLHRoaXMuSyhkKXx8KHRoaXMuTChkKSxnPW5ldyBWKGQsdGhpcy5GKSxnLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5PKCl9LG5kOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVthXXx8KHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goYyl9LElvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5UbigpJiYodGhpcy5BZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2NdJiYwPHRoaXMuY2FbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0KMDtkPHRoaXMuY2FbYl1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2JdW2NdW2RdKGEpfX0scG06ZnVuY3Rpb24oKXtpZih0aGlzLlVjKWZvcih2YXIgYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLlVjW2FdLGM9Yi5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmNhW2NdW2RdW2ZdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5JbyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYj1jLnhrfHxsYjtuZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5RaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLm11dGVkPSExO3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LAp1YTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLmlzUGxheWluZygpJiZhLnBhdXNlKCl9KX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUWl8fG1iOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXtmLkpjLnB1c2goeyJbd2lkdGhdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0V2lkdGh9KTtmLkpjLnB1c2goeyJbaGVpZ2h0XSI6dGhpcy5wbGF5ZXIuY29udGFpbmVyLm9mZnNldEhlaWdodH0pO3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDsKYS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuUml8fG5iOyhmdW5jdGlvbihjKXtjLlNpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7CmlmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuSyhoKXx8KHRoaXMuTChoKSwobmV3IG5iKGgsdGhpcy5GKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuTygpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVthLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuU2l8fG9iLHBiPW5ldyBvYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5Wa3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLktjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9ITApO3ZhciBiPXRoaXMuWGcoYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLktjPWIpO2lmKCF0aGlzLklnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHxhLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9CmEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLkluKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGc6ZnVuY3Rpb24oYSl7dGhpcy5oY3x8KHRoaXMuaGM9W10pO3RoaXMuaGMucHVzaChhKX0sdWw6ZnVuY3Rpb24oKXtpZih0aGlzLmhjJiZ0aGlzLmhjLmxlbmd0aClmb3IodmFyIGE9CjA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuS2MpcmV0dXJuIHRoaXMuS2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuWGcoYSkpcmV0dXJuIHRoaXMuS2M9YX19LFhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxJbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2EmJmEucmVzdW1lRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnJlc3VtZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx4aDpmdW5jdGlvbihhKXt0aGlzLmZhPWF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciByYj1jLkxqfHxyYjsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm5hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpP3RoaXMuQygpOih0aGlzLkplfHwodGhpcy5KZT0xKSx0aGlzLkplKyssMTAwPHRoaXMuSmU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTApKX19KX0pKGMpO3ZhciBzYj1jLktqfHxzYjsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9CmEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLksoYyl8fCh0aGlzLkwoYyksKG5ldyBzYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5PKCl9fSl9KShjKTt2YXIgdGI9Yy5Nanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy50cHx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudWt8fHZiOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFBjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxHbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuaWJ8fCh0aGlzLmliPVtdKTt0aGlzLmliLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5qYSgpOnRoaXMubSgiYWRlcnJvciIsCmEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkduKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuUGMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7cmV0dXJufWlmKCF0aGlzLkNjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmliJiZ0aGlzLmliLmxlbmd0aCYmMTx0aGlzLmliLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuaWIubGVuZ3RoLQoxO2IrKykxMDA5IT10aGlzLmliW2JdJiYzMDMhPXRoaXMuaWJbYl0mJjQwMyE9dGhpcy5pYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTt0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkwoYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy52a3x8CnhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk5qfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlcoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy52Zj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuem4oKX0uYmluZCh0aGlzKSw1MDApfSx6bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSwKYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy52ZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy52Zik7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJgphLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx0bzpmdW5jdGlvbigpe3RoaXMudmY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWW09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnVjfHwodGhpcy51Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/Cih3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWW0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnRvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBCYj1jLmNrfHxCYjsoZnVuY3Rpb24oYyl7Yy5laz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLApiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5HbHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuYms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CnRoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSwKMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53bCgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YT10aGlzLkliKCk7CjA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUG0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LFBtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT0KYz8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTmg9YVtlXSk7cmV0dXJuIHRoaXMuTmh9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/YT90aGlzLkliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLk8oKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT1bXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD0KYltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpO2lmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLmdkfHxIYixJYj1uZXcgSGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMubmt8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/dGhpcy5XKGIpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGpxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJgooYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LFpjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFRhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Janx8WDsoZnVuY3Rpb24oYyl7Yy5Iaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy53Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLndmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMud2YmJmMhPXRoaXMud2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8Zi5SKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5zcSksdGhpcy5DKCksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhqfHxZOyhmdW5jdGlvbihjKXtjLkpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy5BZigpOnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRyxLYj1jLkpqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE1iPWMueWt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm9qPQpyLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sY2k6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2IuSXNQYXVzZWQoKSYmYi5QbGF5KCk6KGIuUGxheSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCEwKX0uYmluZCh0aGlzKSwxMCkpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMub2p8fE5iOyhmdW5jdGlvbihjKXtjLm5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2UoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmkoKSl9fSxpOmZ1bmN0aW9uKGEpe3RoaXMuQyhhKX19KX0pKGMpOwp2YXIgT2I9Yy5uanx8T2I7KGZ1bmN0aW9uKGMpe2MucGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLnBqfHxQYixRYj1uZXcgUGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmI9Yy51bnx8UmI7bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxjaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQnJpZFBsYXllciJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7CnZhciBTYj1jLlhpfHxTYjsoZnVuY3Rpb24oYyl7Yy5ZaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT1hKXRoaXMuQ2UoKTtlbHNle2lmKCJvYmplY3QiPT10eXBlb2YgYSlpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnZhc3RFcnJvckNvZGUmJihhPWFbYl0udmFzdEVycm9yQ29kZSk7CmVsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWWl8fFRiOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycyxiO2ZvcihiIGluIGEpe3ZhciBjPW5ldyBTYihhW2JdKTtjLmhhfHx0aGlzLksoYyl8fCh0aGlzLkwoYyksd2luZG93LmJyaWRwbGF5ZXI9YywobmV3IFRiKGMsdGhpcy5GKSkuZigpKX19dGhpcy5PKCl9fSl9KShjKTt2YXIgVWI9Yy5aaXx8VWIsVmI9bmV3IFViKHQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLk9tfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpO2Vsc2V7Zm9yKHZhciBiPWE7YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlUoKX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9CiExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxIbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5lZCYmCih0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkFrfHxYYjsoZnVuY3Rpb24oYyl7Yy56az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2guYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5Gaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwKMzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkZrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XaCgpO3RoaXMubGcoKTt0aGlzLktuKCl9LEtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuRm4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuRm49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy56a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQms9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYS5IbigpLGE9bmV3IFliKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksCmEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBaYj1jLkJrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMud218fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmxrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZG49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGNpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRufSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy4kZChhKX0uYmluZCh0aGlzKSl9LCRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMubGt8fE47KGZ1bmN0aW9uKGMpe2Mua2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLk9lKWlmKHRoaXMuT2J8fAoodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5obygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuT2U9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnhiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTT1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9CmEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmtrfHxPOyhmdW5jdGlvbihjKXtjLm1rPQpwLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fAp0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLkFmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgYmM9Yy5ta3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Paj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuT2p8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRWp8fFo7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE9dGhpcy5SYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5VaD1mLlNiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsCnRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09CmEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxFYTpmdW5jdGlvbigpe3RoaXMuemE9CiEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkRqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Gaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBlYz1jLkZqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5MbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5sanx8aGM7KGZ1bmN0aW9uKGMpe2Mua2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBpYz1jLmtqfHwKaWM7KGZ1bmN0aW9uKGMpe2MubWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLk8oKTtyZXR1cm59aWYoIXRoaXMuSyhhKSl7dGhpcy5MKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5PKCk7cmV0dXJufX10aGlzLk8oKX19KX0pKGMpO3ZhciBqYz1jLm1qfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Ua3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQmUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5NPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfSxCZTpmdW5jdGlvbigpe2lmKCF0aGlzLnlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuTygpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlNrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuT2Q9W107dGhpcy56Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWWo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmJpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy56Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMuemZbZF07dGhpcy5YZihjKSYmKHRoaXMuT2QucHVzaChjKSx0aGlzLmJpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQ9YVtmXSxkPXRoaXMuemZbZF0sdGhpcy5YZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxiaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sdm86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuT2QubGVuZ3RoO2ErKyl0aGlzLk9kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2RbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuWWp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuZGp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5MYyhrLlNvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5MYyhrLmhuKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7aWYoZG9jdW1lbnQuYm9keSl7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSl9ZWxzZSB0YXJnZXRXaW5kb3c9d2luZG93O3ZhciB2Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHdjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLG09ITE7SC5nYSgpO0gueWgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmdhKCksZnVuY3Rpb24oYyl7bXx8CihtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueWgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7Zi5OZSh3aW5kb3csZi5WKDEwKSx7fSk7dmFyIGlhPWYuVigxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLm1ufHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuU2g9dGhpcy5jb25mPXRoaXMuTGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkpkPTA7dGhpcy5oYj0iIjtmLnZiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtibzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5oYj10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFluOmZ1bmN0aW9uKGEpe3RoaXMuTGI9YX0sWG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5oYl0mJnRoaXMuY29uZlt0aGlzLmhiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gY30sJGM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuem0oKSl0aGlzLkxiLmcodGhpcy5MYi5RYyx0aGlzLkxiLnFhLHRoaXMuTGIueWYsZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5MYi5pYyk7ZWxzZSBpZihsLkRiJiYhbC5IaSlsLldtKGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbT1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTsKYyYmbS54bygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTtRPW09bmV3IFFhKG0sdGhpcy5MYixoKTttLlZuKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgcD0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihwPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEocCl9YXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuZ2YmJihkPXRoaXMucGxheWVyLmdmKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTttLmpmKGEsZCxnKTt0aGlzLnBsYXllci5laShtKX19LHptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuSmQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy5KZC5nZXRUaW1lKCksdGhpcy5KZD1hLDNFNTxjPyEwOiExOwp0aGlzLkpkPWE7cmV0dXJuITF9LG5vOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5XZyhhKSk/dGhpcy4kYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfSxtbzpmdW5jdGlvbihhKXtpZighdGhpcy5TaCl7Zi5GZigicG9zdHJvbGwiKTtmLnZiKCJwb3N0cm9sbCIpO3RoaXMuYm8oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuV2coZCkpP3RoaXMuJGMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8KITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfX0sV2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LE5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIua28odGhpcy5tby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5NYSgpfSxUZDpmdW5jdGlvbihhKXtmLnZiKCJtaWRyb2xsIik7Zi5GZigibWlkcm9sbCIpO2lmKCF0aGlzLkhoKXt0aGlzLkhoPSEwO3ZhciBjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLiRjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoPSExfS5iaW5kKHRoaXMpLDFFMykpOgooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LE1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuYW8odGhpcy5UZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5tZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5ubygpO3RoaXMucGxheWVyLm1mJiZ0aGlzLk1uKCk7dGhpcy5ObigpfX19KShjKTt2YXIgZmE9Yy5MaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yz1jLkpvfHx1YztuZXcgdWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoYWl4ZUNlZWRUaGVlc29oaixhaXhlQ2VlZFRoZWVzb2hqKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.178.5 Ashburn, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Origin
https://player.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:40 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
07A3584466B5D7E4
Content-Length
53
x-amz-id-2
MC2xns87In5lp/XqI2//zJjgzOuohlt7RwWN+KKhR6jnRs0nsgbK5YIbVCRsXFadMkgBPHN3JdQ=
Last-Modified
Mon, 16 Mar 2020 19:26:04 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://player.pcgameshardware.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
0
homadConfigJson.cfm
player.pcgameshardware.de/app/ Frame FABB
334 B
475 B
XHR
General
Full URL
https://player.pcgameshardware.de/app/homadConfigJson.cfm?cache=4753416138
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpeGVDZWVkVGhlZXNvaGo9YWl4ZUNlZWRUaGVlc29oanx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnduKWwuRGwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmZiKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5ZbihsKTtiLlhuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmZvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkZoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5GaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlVrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQ24uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnJoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnNqPWE7YS5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5yaFtiXSYmKHRoaXMucmhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy53bygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUWs6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LENuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLkJuKGIuZGF0YSl9LEJuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2goYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ2g6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sT2s6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5SbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sUmw6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxLbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxmaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0saW86ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLmlvKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sQWg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LApBPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPUE7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O0E9QSttJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYShBKSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LGFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCxBPTA7QTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoQSsrKSxnPWIuY2hhckNvZGVBdChBKyspLHE9Yi5jaGFyQ29kZUF0KEErKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxGbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSxBPSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksQT0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPUE7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtQaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxXaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx2bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxTajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx3azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sR2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxnazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlBpKCl8fGIuV2koKXx8Yi52bSgpfHxiLlNqKCl8fGIud2soKXx8Yi5HaigpfHxiLmdrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0saW06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEZsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LG9vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGFoOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy52aShhKSsiOiIrdGhpcy52aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnduPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSxEbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LHBvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5aZyhiKSlyZXR1cm4gdGhpcy5aZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuYWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5mYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuT2soZixiKTtyZXR1cm4gZn0sZmI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sVG06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YuYWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5mYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlRtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5mYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LERtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnNqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnJqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZ249e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucXA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSWw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuR2s9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuWG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkpsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLklrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkhrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuRGk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5rbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EucHA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuVG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5obj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkNsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuZW0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy50anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnFufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5jbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuWm4oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxabjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkVoJiZMLnZvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sa286ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sYW86ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx5cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ybSgpfHx0aGlzLktrKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxLazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxlaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFpoOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0sdHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkRrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy4kbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxmLmtmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnJpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHJpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm9iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGhvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ea30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwkbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxYbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5lanx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaGp8fG9hOyhmdW5jdGlvbihjKXtjLmlqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmlqfHxwYTsoZnVuY3Rpb24oYyl7Yy5qaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMuamp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLk9pfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5ZZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxtcTpmdW5jdGlvbigpe3JldHVybiExfSxZZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApOwp0aGlzLlcoYil9fSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9CmEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7CnJldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQmp8fHNhOyhmdW5jdGlvbihjKXtjLkFqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LG9xOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5yZT0hMTt0aGlzLnRlPTE7dGhpcy5qZD1bXTt0aGlzLkdiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmCmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnRlPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5HYj0hMCk7ZWxzZXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlIGluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciBlPTA7ZTxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmxlbmd0aDtlKyspaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZVtlXS50YWcpe3RoaXMuR2I9ITA7YnJlYWt9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5HYj0hMCk7Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5HYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkdiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7dmFyIGQ9CiJhZFBsYXkgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIik7aWYoZi5SKCJzcGllZ2VsLmRlIikmJi0xIT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpKXthLm9uKCJiZWZvcmVQbGF5IixmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5qdy12aWRlbyIpOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtiLmZvckVhY2goZnVuY3Rpb24oYil7ImF0dHJpYnV0ZXMiIT1iLnR5cGV8fCJzcmMiIT1iLmF0dHJpYnV0ZU5hbWV8fHRoaXMucm58fC0xIT1iLnRhcmdldC5zcmMuaW5kZXhPZigidmNkbjAxIil8fCh0aGlzLnJuPSEwLGIudGFyZ2V0LnNyYz0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iK2YuYWIoYi50YXJnZXQuc3JjKSx6LmJpbmQodGhpcykoKSl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSkub2JzZXJ2ZShiLAp7YXR0cmlidXRlczohMCxjaGlsZExpc3Q6ITAsY2hhcmFjdGVyRGF0YTohMH0pfS5iaW5kKHRoaXMpKTt2YXIgZyxjLGgsej1mdW5jdGlvbigpe2g9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiei0xMCIpO2Zvcih2YXIgYj0wO2I8aC5sZW5ndGg7YisrKWhbYl0uY2xhc3NMaXN0LnJlbW92ZSgiei0xMCIpO2c9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5wYXJlbnRFbGVtZW50O2I9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKTtjPWIuc3R5bGU7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSItIisoYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55LWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWFyZWE9J2hlYWRlci1iYXInXSIpLm9mZnNldEhlaWdodCkrInB4IjtiLnN0eWxlLmxlZnQ9IjBweCI7Yi5zdHlsZS53aWR0aD0iMTAwJSI7Yi5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IiwxNipiLm9mZnNldFdpZHRoLzkrInB4IiwKImltcG9ydGFudCIpO2Iuc3R5bGUuekluZGV4PTFFMztiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Yi5sb2FkKCk7Yi5wbGF5KCl9O2Eub24oImFkQ29tcGxldGUiLGZ1bmN0aW9uKCl7Zy5pbnNlcnRCZWZvcmUoandwbGF5ZXIoKS5nZXRDb250YWluZXIoKSxnLmZpcnN0Q2hpbGQpO2p3cGxheWVyKCkuZ2V0Q29udGFpbmVyKCkuc3R5bGU9Yztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXtpZihnJiZjKXtnLmluc2VydEJlZm9yZShqd3BsYXllcigpLmdldENvbnRhaW5lcigpLGcuZmlyc3RDaGlsZCk7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5zdHlsZT0KYztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSl9Zm9yKGU9MDtlPGQubGVuZ3RoO2UrKylhLm9uKGRbZV0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtlXSYmKHRoaXMucmU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtlXSYmdGhpcy5MaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLiRtJiYhdGhpcy55YSgpJiYodGhpcy5HYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsCjFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5NYjtiJiYoYi5OZCgpLGIueGQoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuVmd8fCh0aGlzLlZnPVtdKTt0aGlzLlZnLnB1c2goe2NvZGU6YS5jb2RlLG1zZzphLm1lc3NhZ2V9KTt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJgowPGEubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnRlJiZ0aGlzLmkoKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuTGU/dGhpcy5MZSsrOnRoaXMuTGU9MTp0aGlzLktlP3RoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLllnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMuQWp8fHRhOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGUmJmUoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLndifHx0aGlzLksoZSl8fHRoaXMuRW0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYuYWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9CmE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy5Ya3x8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mucms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwKJGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5xaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVWg9Zi5TYigxMCk7dGhpcy54aT0hMDt0aGlzLkNjPXRoaXMudmg9ITE7dGhpcy5lbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksCnRoaXMueWIoKSl9LGVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLlIoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuSWE/YS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5JYT90eXBlb2YgYS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlVoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sCmloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmMpe3ZhciBhPXRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy51aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLkxuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sTG46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2lmKGYuUigiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYKKHRoaXMuTWc9YS5hZHMpO3JldHVybiB0aGlzLk1nfSxobDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuTGgoKX0uYmluZCh0aGlzKSl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLAplPXRoaXMuUGMoKTtiJiZlJiYodGhpcy5DY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNjP3RoaXMudygpOih0aGlzLmRhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnZoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PQpifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuTT1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxpbDpmdW5jdGlvbigpe3RoaXMuSWN8fCh0aGlzLkljPSJ1bmtub3duIik7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkcyl7aWYodGhpcy5JYyE9YS5hZHMuc3RhdGUmJih0aGlzLkljPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkljKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlsKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/Cih0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMueWEoKXx8KGF8fCh0aGlzLnhpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLnhpLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuaXF8fCgxMDx0aGlzLmJwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYnArKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5TbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxTbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYKIXRoaXMuY3Ape3RoaXMuY3A9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5xa3x8eWE7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuaWkod2luZG93KTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmlpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGlpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmCihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuU2UoYikpe2Zvcih2YXIgZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJihhPW5ldyB4YShiW2VdKSxhLmhhfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTChhKSwobmV3IHlhKGEsdGhpcy5GKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LE86ZnVuY3Rpb24oKXt0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMuc2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy50Zj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmKGI9YS5wYXJlbnROb2RlKSwhYikpe3RoaXMuVSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0seW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fApiLk5kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy50Zj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LHVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTphLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuVWp8fFI7KGZ1bmN0aW9uKGMpe2MuVGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0KMCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBlPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWU9ITA7ZXx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChlPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5NPXRoaXMuTXx8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuTWw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5NbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLnluKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTsKdGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihjKXtjLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgUihhW2JdKTtlLmhhfHx0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBDYShlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRGE9Yy5Wanx8RGEsRWE9bmV3IERhKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuc218fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmZoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYKKGI9Yi5wYXJlbnROb2RlKX10aGlzLkFuPWEucG9zaXRpb25pbmc7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5zdHlsZS53aWR0aD1hLndpZHRoO2Uuc3R5bGUubWluV2lkdGg9YS53aWR0aDtlLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7ZS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5Bbil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTsKdGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLkFoKHRoaXMuQ2QpO2YuYWYodGhpcy5DZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFsKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy55anx8R2E7KGZ1bmN0aW9uKGMpe2MueGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMueGp8fElhOyhmdW5jdGlvbihjKXtjLnpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9Cm0uaW5yZWFkLGI9Zi5maChhLCJlbGVtZW50SUQiKTtpZihmLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuSyhhKSkpe3RoaXMuTChhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnpqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5ibHx8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT0Ke319Yy51aj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LExrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBDPWMudWp8fEM7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixhLGQsZyxjKXt0aGlzLkZhPWI7dGhpcy4kZz10aGlzLkdpPSExO3RoaXMuTWg9ZDt0aGlzLmppPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmxiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09CmgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuZGYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9Yy52aj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy4kZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5sYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuamk/dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmxiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuR2l8fAoodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMubGIuc2VuZChiKX1jYXRjaChnKXtiPXRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5Iil8fHRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTWgmJnRoaXMuTWgoKX1yZXR1cm4gdGhpcy5sYn19fSkoYyk7dmFyIE1hPWMudmp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuYWo9CmE7YS5wcm90b3R5cGU9e2VvOmZ1bmN0aW9uKGIpe3RoaXMubWU9Yn0sY286ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxRbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt4cDoiQWRDbGlja1RocnUiLHpwOiJBZEVycm9yIixBcDoiQWRTdG9wcGVkIixEcDoiQWRMaW5lYXJDaGFuZ2UiLEVwOiJBZFRhZ1BhcnNlZCIsSHA6IkFkVmlkZW9Db21wbGV0ZSIsS3A6IkFkTG9hZGVkIixMcDoiQWRTa2lwcGVkIixNcDoiQWRTdGFydGVkIixCcDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLENwOiJBZEltcHJlc3Npb24iLHlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7CmZvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5tZSxhW2RdKX0sUG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmxlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmxlKXRoaXMuR2EubGUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5HYSx0aGlzLkdhLmxlW2FdKTt0aGlzLkdhJiZ0aGlzLkdhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkdhLmdldEVycm9yKCl9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5RbigpO3RoaXMuR2EmJnRoaXMuUG4oKX19fSkoYyk7dmFyIE5hPWMuYWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnFiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLnBiPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjsKdGhpcy5lZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy4kZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy55Zj0hMTt0aGlzLmlhPVtdO3RoaXMuV2U9dGhpcy5WYj0iIjt0aGlzLmplPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLm5iPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLmFjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLldiPSIiO3RoaXMuWGI9W107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmpiPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmJiPXtnbG9iYWw6ITEsY2xpZW50OiExLApjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5FYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5ZYz10aGlzLlFkPW51bGx9Yy53aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXI6dGhpcy5wYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZWMsYWR0YWdyZWdleDp0aGlzLnFkLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmZmLHNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLApzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLldlLEhPTUFEX1ZFUklGSUVEOnRoaXMuamUsSE9NQURfQkxPQ0tFRDp0aGlzLmllLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsdGVzdFRhZ3NYSFI6dGhpcy5iZCx0ZXN0M1BDb29raWU6dGhpcy50Yyx0aHJvdHRsZTp0aGlzLlpkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubmMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5IZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmJiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuZWIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLkxmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFduOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkNhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLnFiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMucGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmZmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy56Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5lZj1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5RYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJgoodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLiRlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuV2U9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuamU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5uYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLmJkPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy50Yz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuWmQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLkhnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuV2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5iZT1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYmI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmViPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuTGY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuYWc9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5FYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LApxbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5iYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmJiW2FdJiYxPT10aGlzLmJiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuYmJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmJiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYmJbYV0mJjE9PXRoaXMuYmJbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sWGQ6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIiwKZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuJGsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIixjPSIiLGY9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5jZihiKTtjPXRoaXMuYWEoYik7Zz8odGhpcy5TYygpP2Y9YjpmPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGY9dGhpcy5xYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFifHx0aGlzLnBifHx0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5ibihoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmJtKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD0KaDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5hYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGNmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5TYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj0KYS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxkZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmNmKGIpO3JldHVybiBhfSxibTpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIiwKYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSWg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sYW46ZnVuY3Rpb24oYixhKXt2YXIgZD1mLmFhKGIpLGc9IiIsZz0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZz17fSx6PTA7ejxoLmxlbmd0aDt6Kyspe3ZhciBrPWhbel0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5JaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPQp0aGlzLkloKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmKGIrPXRoaXMucWIpO2lmKHRoaXMucGIpZm9yKHZhciBhIGluIHRoaXMucGIpdGhpcy5wYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5wYlthXSkpO2lmKGYuSmMpZm9yKHZhciBkPTA7ZDxmLkpjLmxlbmd0aDtkKyspe3ZhciBnPWYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuYW4oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmCmEuZW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmNvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxjLGYpe2w9dGhpczt0aGlzLmVmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy55Zj1kO3RoaXMuZWU9Zzt0aGlzLmljPWM7dGhpcy54YT1mfHx7fTt0aGlzLnBsKCk7dGhpcy5TbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlFtKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkdjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZ2I6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxEbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sU206ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuUWMrdGhpcy54ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5HYygpfS5iaW5kKHRoaXMpLCEwKX0sUW06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy54ZSgiY2xpZW50IiwtMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iKwp0aGlzLlNiKCkpO3RoaXMueGEmJnRoaXMueGEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnhhJiZ0aGlzLnhhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGUpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaWM9ITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPQp0aGlzLiRlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5nYih0aGlzLmllKSk7dGhpcy5CYigpO2YuTGMoay54bik7KGE9Zi5VYSh0aGlzLklkKCkpKXx8KGE9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuaXNFbmFibGVkPXRoaXMuQWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPGQuc2VydmVyLmxlbmd0aDtiKyspe3ZhciBhPQpkLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaCh6KXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8CltdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5SKCJ3ZWIuZGUiKXx8Zi5SKCJnbXgubmV0Iil8fGYuUigiZ214LmF0Iil8fGYuUigiZ214LmNoIil8fGYuUigiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5kaShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJgp0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxkaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFRjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucWMoKSksZD10aGlzLmFhKHRoaXMuVmIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGEsdGhpcy55by5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTsKYj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5bzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuV2Y9dGhpcy5BYihkLnN0cmljdCk7dGhpcy5iZT10aGlzLkFiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5lYj10aGlzLkFiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuV2I9ZC50ZXN0aGlkZXx8IiI7dGhpcy5ZYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmJkPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5xYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnBiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fApudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZmY9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnhhLnZwYWlkPXRoaXMuamI7dGhpcy5MZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkVjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmRpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5aZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMuRGI9ZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuS28oKSYmCih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnlmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuRWUoKSx0aGlzLkJiKCkpOnRoaXMuQm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5UZigpKX19LFdtOmZ1bmN0aW9uKGIpe3RoaXMuSGk9ITA7dmFyIGE9ZnVuY3Rpb24oYil7aWYoYj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2IrIj0oW147XSspIikpKXJldHVybiBiWzJdfSgiYWRwX3NlZ3MiKXx8ImUwIixhPXRoaXMuRGIudXJsLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKS5yZXBsYWNlKCJbc2Vnc10iLGVuY29kZVVSSUNvbXBvbmVudChhKSksYT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6YSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLmFiKGEpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07CmYuS2QodGhpcy5xYygpLCJQT1NUIixhLGZ1bmN0aW9uKGEpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaCh6KXtiKCl9YigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YigpfS5iaW5kKHRoaXMpLCEwKX0sQm86ZnVuY3Rpb24oKXt0aGlzLkFvKCk7dGhpcy5DbygpfSxDbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksej1mLlYoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHosZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoeikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2YuYWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChnKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9Zi5CZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLnNhKCJjc3BfIithKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxUZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sWWQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IoYSkpLHRoaXMuQmIoKSx0aGlzLkVlKCkpfSxBbzpmdW5jdGlvbigpe2lmKHRoaXMuV2Ipe3ZhciBhPWYuQmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLkhtKCkpdGhpcy5ZZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTsKZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpO2E9ZH1jYXRjaChnKXt9YT90aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm1pKCl9fWVsc2UgdGhpcy5taSgpfSxSZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy5GbyhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBkPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZigpfSxGbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZj8od2luZG93LmNsZWFyVGltZW91dChmKSwhMCk6ITF9dmFyIGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbWk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuR28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGQ9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlJmKCl9LEdvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7ZigpJiZlKCl9ZnVuY3Rpb24gYygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZSl7ZT09YSYmZigpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPQpjO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sUWY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLktkKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuQWIoYS5jYyk7dGhpcy5UZigpfS5iaW5kKHRoaXMpLHRoaXMua2kuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5raSgpfWVsc2UgdGhpcy5UZigpfSxraTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKTt0aGlzLkVlKCl9LEhtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LEJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJgooYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnhjJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5RZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMuamUpKTt0aGlzLmVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuZWUmJnRoaXMuZWUoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuSGJ9KX0sY2w6ZnVuY3Rpb24oKXt0aGlzLlljPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWWMuaWQ9Zi5WKDEwKTt0aGlzLlljLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5ZYyk7dmFyIGE9dGhpcy5ZYy5jb250ZW50V2luZG93LGU9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD0KZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5RZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5RZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi5BZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYTthPShhPWRvY3VtZW50LmNvb2tpZS5tYXRjaCgvKF58IClhZHBfc2Vncz0oW147XSspLykpP2FbMl06dm9pZCAwO2EmJmYudHJhY2soInN0YXRzX2hkX3NlZ3MiLCJlMCIhPWEsITApfS5iaW5kKHRoaXMpLDJFMyl9LG9sOmZ1bmN0aW9uKCl7aWYodGhpcy5iZSYmdGhpcy5xbSgpKXt2YXIgYT10aGlzLiRsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIiwKYS5qb2luKCJfIiksITApfX0scmk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxLYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrO3RoaXMuSGQ+dGhpcy5waCYmIXRoaXMucWgmJih0aGlzLnFoPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5waCwhMCkpO2E9bmV3IE1hKGEsZSxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtnJiYoYS5HaT0hMCk7YyYmZi5GbSgpJiYoYS4kZz0hMCk7aCYmKGEuamk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLlptfHwKKHRoaXMuWm09ITAsZi5EYSgpfHxmLmZiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihnPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGdbMF0mJihnPWdbMF0pLGcpe2c9ZyYmZy5jaGlsZE5vZGVzJiZnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKwoiOi8vIitnLmhvc3QpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Zi5uZXR3b3JrU3RhdGU9PWYuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9Zi5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFwcGVuZENoaWxkKGUpO2Yuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx6bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5Xby5iaW5kKHRoaXMpLHRoaXMuVm8uYmluZCh0aGlzKSl9LFdvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsOwp0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuS2woKX0sVm86ZnVuY3Rpb24oKXt9LEtsOmZ1bmN0aW9uKCl7Zi5MYyhrLkpsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxFZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuemIubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy56YlthXTsicmVxdWVzdCI9PWUudHlwZSYmZi5mYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWUudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztmLmZiKGUudXJsLGUuYWxpYXMsCm51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxLbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLlpkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPSIiLGQ9MDtkPGE7ZCsrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBlfSxBYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxhYjpmdW5jdGlvbihhKXtmb3IodmFyIGU9IiIsZCxnLGMsZixoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz0KYS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxmPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihjKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZX0sYWE6ZnVuY3Rpb24oYSl7dmFyIGU9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZz0xNDtnLS07KWRbZVtnXV09YVtnXXx8IiI7ZC5xdWVyeUtleT17fTtkW2VbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZSl7YiYmKGQucXVlcnlLZXlbYl09ZSl9KTtyZXR1cm4gZH0sSmY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZShhKXt2YXIgYj0iIixkLGU7Zm9yKGQ9NzswPD1kO2QtLSllPWE+Pj40KmQmMTUsYis9ZS50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZj1BcnJheSg4MCksCmg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpYz1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKylmW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO2M9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGMsNSkrKG4mcHx+biZyKSt1K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9MjA7Mzk+PWc7ZysrKXY9ZChjLDUpKyhuXnBecikrdStmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTQwOzU5Pj1nO2crKyl2PWQoYyw1KSsobiZwfG4mcnxwJnIpK3UrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YywKYz12O2g9aCtjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy53anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLldrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUGE9Yy5Xa3x8UGE7bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUsZCl7dGhpcy5hPWE7YS5jLlA/dGhpcy5oYj1hLmMuUCgpOnRoaXMuaGI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5haS5iaW5kKHRoaXMpLG11dGU6dGhpcy5vZi5iaW5kKHRoaXMpLAp1bm11dGU6dGhpcy5Rby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnNiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLllrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVmQ9e307Zi52YigibmV3QmlnQWRJZCIpO3RoaXMuYWw9Zi5WKDEwKTt0aGlzLk5mPTA7dGhpcy5vZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLm9kPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLm9kPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlJrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuV2M9dGhpcy5VZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoPwpwYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMud2U9ITE7dGhpcy51aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZmk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5mZT10aGlzLiRiPXRoaXMuSWU9dGhpcy55ZD10aGlzLldkPXRoaXMuQ2I9dGhpcy52Yz10aGlzLlBoPXRoaXMuSGU9dGhpcy5EZD10aGlzLkxvPXRoaXMuRmI9dGhpcy5RYj0hMTt0aGlzLkFjPVtdO3RoaXMucGM9e307dGhpcy50bj0yMDA7dGhpcy5kZz10aGlzLmRkPXRoaXMuRmM9dGhpcy5jZz10aGlzLnhmPSExO3RoaXMucWY9e319Yy5xaj1hO2EucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmhiXSYmdGhpcy5jb25mW3RoaXMuaGJdW2FdJiYoZT0KdGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gZX0sc2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLnJvKCk7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0samY6ZnVuY3Rpb24oYSxlLGQsYyl7dGhpcy5GYj1kO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLk5mKyssZi52YigibmV3U21hbGxBZElkIiksdGhpcy5BLm9sKCksYz1sLmdldENvbmZpZygpLGYuT2cmJih0aGlzLkEuV24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsCmtlZXBVUkw6ZSxiaXRyYXRlOmMuUGEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmpiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB4Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt4Yy5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmxvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLkFjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmttKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5iaChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlZsKGIpKSk7cmV0dXJuIGV9LFZsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0sa206ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLnFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmZuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5JbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuc28oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsucnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5zcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLlRvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLlVvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sbG86ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMua2IuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS52cT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlJrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk1rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5uaShlKSl7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5QayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmtiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMua2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuam8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sam86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuUWsodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5RaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMuemkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLm5tKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuZXAoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5mcCgpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5qcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5vcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5FaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmdwKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmhwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0saHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGpwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGZwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuaGkoKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxucDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxscDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxvcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LEVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LGVwOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkVpKCEwKX0sTWs6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBkPWIuYWEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLmFwLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5DaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm5pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlpvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLllvKCk7dGhpcy56aSgpO3RoaXMuQmcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5laSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuZWImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuR2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LEprOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZ2goYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5wbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuSmsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5rbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS53aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlpoKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkpoKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sYXA6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQ2k6ZnVuY3Rpb24oKXtpZih0aGlzLkxvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5PbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmtiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLndpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi5haCh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx0aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxPbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudWl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudGkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnRpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuaGkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5lYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuZWImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy51aT1hKX0sZ2k6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxybzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0saGk6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHNvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5lYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5lYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMubG0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLkRtKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkhrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGQpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkVsKHRoaXMuYi5PYSxhKX1jYXRjaCh6KXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5MayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLk5rKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5ZaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlloKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxOazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFloOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sdW86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sbG06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxFbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxabzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sWW86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuYWgoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnBpLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5maTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxhaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuTW0oKSYmdGhpcy5MbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLlBvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LE1tOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuamJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5qYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5qYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxMbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sYW06ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LFBvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmYudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsZS5hdmFpbGFibGUsITApO2lmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7Zi50cmFjaygic3RhdHNfd3RfY2F0Y2giLCIiLCEwKX10aGlzLnhkKCl9dmFyIGU9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzLGQ9dGhpcy5hbSgpO3RoaXMuRmM9dGhpcy5XYz10aGlzLmRkPXRoaXMuZGc9ITA7cmV0dXJuIGU/KGYuZmIoImh0dHBzOi8vd3d3LndlbGVjdC5kZS9hcGkvdjEvcHJlZmxpZ2h0L2J5X2FsaWFzLyIrZSwiZGV3ZWxlY3R3d3d3ZWxlY3RkZSIse30sYS5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSx0aGlzLkEpLAohMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMudW8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSx0aGlzLnRuKToodGhpcy5XZD0hMCx0aGlzLmEuVmUoKSx0aGlzLmEuVW4oKSx0aGlzLm9jPSExLGE9dGhpcy5iLnN8fHt9LHRoaXMuSGV8fChhLm5vQ29tcGxldGVRdWFydGlsZT0hMCksZi5vKGsueWwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLlJlKCkuWmgoKSl9LFJlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LEJnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGYuYWYodGhpcy52aWRlbyxhKT90aGlzLmFpKCk6dGhpcy5OZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZygpfS5iaW5kKHRoaXMpLDEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9CnRoaXMuYi5yYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLkFjJiYwPHRoaXMuQWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLkFjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHU6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLmFsKyItIit0aGlzLk5mO3RoaXMuYiYmdGhpcy5iLmhoJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYi5oaCgpKTtyZXR1cm4gYX0sUmc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnFqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYT1jLkhsfHxSYTtuZXcgUmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGQsYyl7dGhpcy5vcHRpb25zPWN8fHt9O2U9ZDt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5vYT1udWxsO3RoaXMuWT1bXTt0aGlzLko9bnVsbDt0aGlzLnpjPXRoaXMuQmM9ITE7dGhpcy5iYT0iIjt0aGlzLmJnPSExO3RoaXMuc2g9IiI7YyYmYy5lbXB0eT90aGlzLlZtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBiPTAsZSxkPVtdO2Mub2s9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWYuQmQoKSxiO2I9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgZD0iIjtiLnF1ZXJ5S2V5JiYoZD1iLnF1ZXJ5S2V5Lmh2cCk7ZCYmKHRoaXMub3B0aW9ucy52cGFpZD0KITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwudmEobC5YZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFmLkRhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxjPWZ1bmN0aW9uKCl7cmV0dXJuIGUoKSYmKGYuUigibWFydGhhc3Rld2FydC5jb20iKXx8Zi5SKCJmYW5kb20uY29tIil8fGYuUigiZ2lnYS5kZSIpfHxmLlIoImtpbm8uZGUiKXx8Zi5SKCJzcGllbGV0aXBwcy5kZSIpfHxmLlIoImRlc2lyZWQuZGUiKSl9LmJpbmQodGhpcyk7aWYoZSgpfHxjKCkpe3ZhciBoPWYuTmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgYz1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYKIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4oZi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG49ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihjKCl8fGsoKXx8bSgpfHwiYXBwc3BvdCI9PQpkKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlhkKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLlhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixmLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuWGQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5VbS5iaW5kKHRoaXMpLHRoaXMuUm0uYmluZCh0aGlzKSl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuTmIpdHJ5e3ZhciBlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09ZS5maXJzdENoaWxkfWNhdGNoKGMpe2RbYl09e319ZWxzZSBkLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLk5ifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5OYnx8dGhpcy5KbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC56bygpKXRyeXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Yy5sZW5ndGgmJihjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2NbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtlW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspZC5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChkKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxKbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGQ9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZT0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZT1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZSYmTWF0aC5hYnMoZS1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWQ/ITA6ITF9LFVtOmZ1bmN0aW9uKGEpe3RoaXMuRW4oYSk7dHJ5e3RoaXMub2E9YS5yZXNwb25zZVhNTCx0aGlzLm9hfHwodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuc2g9YS51cmxDYWxsZWQ7aWYodGhpcy5ZLmxlbmd0aCl0aGlzLlZjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUmEodi5mZCx7ZXJyb3I6dGhpcy5iZz8KRi5uZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuVWEodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxWbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuWS5sZW5ndGg/dGhpcy5WYygpOnRoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKX0sUm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUmEodi5mZyx7ZGVwdGg6Yn0pKX0sVmM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5ObSgpP3RoaXMuSG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5taCgpLGUse0FkU3lzdGVtOnRoaXMuVWwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5SYSh2LmlnKSk6KGI9MCx0aGlzLlJvKCkmJnRoaXMudWYodGhpcy5CbCgpKSl9LHBmOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5wZigpfSxKaDpmdW5jdGlvbigpe3RoaXMuemM/KHRoaXMuemM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQuSmgoKX0sUm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FbygpP3RoaXMuRG8oKT8hMDooLTEhPXRoaXMuTmMoKT90aGlzLnJhKHRoaXMuUmEodi5oZSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSksITEpOih0aGlzLnJhKHRoaXMuUmEodi5mZCxGLmhnKSksITEpfSx1ZjpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5nZXx8KGEuZ2U9W10pO2EuZ2UucHVzaCh0aGlzLnNoKTthLk9hPWEuT2EuY29uY2F0KHRoaXMubGYoKSk7YS5FYj1hLkViP2EuRWI6dGhpcy5CYzsKYS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7dGhpcy5wYXJlbnQudWYoYSl9LEJsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmR1cmF0aW9uPXRoaXMuTmMoKTthLk49dGhpcy5qaCgpO2EucmI9dGhpcy5XbCgpO2EuQ3E9W107YS5vcmlnaW49dGhpczthLnM9dGhpcy5UbCgpO2EuTWY9dGhpcy5qbShhLmR1cmF0aW9uKTthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fAoodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2lmKCF0aGlzLkomJnRoaXMub2EmJnRoaXMub2EuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5vYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmQubGVuZ3RoJiZmLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZSl7fX10aGlzLkomJihhLk9hPWEuZXJyb3IuY29kZSE9di5oZS5jb2RlP2EuT2EuY29uY2F0KHRoaXMuWGwoKSk6YS5PYS5jb25jYXQodGhpcy5mbSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmtjJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGtjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmtjKGEpfSxVZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxIbzpmdW5jdGlvbigpe3JldHVybiBiPGV9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5qaCgpLmxlbmd0aH0sRG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLk5jKCl9LFNmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LGxpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5TZigpJiYoYT0hMCk7cmV0dXJuIGF9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuYmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5iYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLmJhPSJVTktOT1dOIn10cnl7dGhpcy5iZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChlKXt9fSxObTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMubWgoKS5sZW5ndGh9LG1oOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUWUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIkFkU3lzdGVtIil9LGxmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1lJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiQ29tcGFuaW9uIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUpKXJldHVybn1jYXRjaChkKXt9aWYoYSYmIXRoaXMuemgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxlLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMudGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSx6aDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxYbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0samg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxQYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFVwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnRiKGFbZF0pfSk7dmFyIGU9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBjPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5QYSktTWF0aC5hYnMoZS1iLlBhKX0pLGY9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZS1hLlBhKS1NYXRoLmFicyhlLWIuUGEpfSksYj1jLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LFRsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7CmZvcih2YXIgYj0iIixkPSExLGU9W10sYj0hMSxjPSIiLGY9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2M9Yj10aGlzLkdkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWUucHVzaChkKTtmLnB1c2goYyl9MTxhLmxlbmd0aD8oYj1lLGg9Yyk6KGI9ZCxoPWYpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxOYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sam06ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxlPSExO3RyeXtkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZT1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5vbyhlLAphKSwwPmImJihiPSExKX1jYXRjaChjKXtiPSExfXJldHVybiBifSxRZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMudGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx0YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkdkKGEpOiIifSxHZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5va3x8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLnBufHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk49W107dGhpcy5yYj0iIjt0aGlzLnM9dGhpcy55Yz10aGlzLkViPSExO3RoaXMuWGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlllPSIifWMuV2o9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sZG06ZnVuY3Rpb24oKXtpZighdGhpcy5YZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm9hKXt2YXIgYT10aGlzLm9yaWdpbi5vYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZT0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGU9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1lLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLlhlPWFbZF0pfXJldHVybiB0aGlzLlhlfSwKaGg6ZnVuY3Rpb24oKXtpZih0aGlzLlllKXJldHVybiB0aGlzLlllO3ZhciBhPSIiOyhhPXRoaXMuZG0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlllPWF9LG5tOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTi5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5OW2VdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Xanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5OaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHY9e29lOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE5hOiJYTUxfUEFSU0VfRVJST1IifSxlZzp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLAptZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGZkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGlnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE5hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKTmE6IkxPQURfRVJST1IifSxrZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx1cDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixOYToiTUVESUFGSUxFX0VSUk9SIn0saGU6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTmE6IkRVTU1ZX0FEIn19LEY9e2dnOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTmE6Ik5PX0FEUyJ9LGhnOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixOYToiTk9fTUVESUFGSUxFUyJ9LHZwOnt0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG5lOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMucGt8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5lcnJvcj1hO3RoaXMuQWQ9ZTt0aGlzLk9hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuZ2p8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPQpjLm5ufHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuJGg9YTt0aGlzLnZpZGVvPWU7dGhpcy5jZT1bXTt0aGlzLlhoPVtdO3RoaXMucmY9W107dGhpcy4kbz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSSgpfWMud3A9YTthLnByb3RvdHlwZT17STpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy4kaC5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLiRoW2FdLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsCmM9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO3ZhciBoPWYuY29udGVudFdpbmRvdztoLnJxPXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkpuLmJpbmQodGhpcyl9O3ZhciBrPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2sub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2guZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtoLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7CnRoaXMuY2UucHVzaCh7c3JjOmQsZnJhbWU6Zix2bjpjLHZlbmRvcjplLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5yZi5sZW5ndGg7ZSsrKXt2YXIgZD10aGlzLnJmW2VdO2QudHlwZT09PWEmJmQuZmwodGhpcy5ZbChhKSl9fSxZbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntBcTohMCx6cTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntucToidmlkZW8iLERxOiJqc0N1c3RvbSIsRXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxGcToxLFZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsCmVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LG1tOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5jZS5sZW5ndGg7ZSsrKWlmKHRoaXMuY2VbZV0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5jZVtlXS52bjtyZXR1cm4iIn0sUm46ZnVuY3Rpb24oYSxlKXt0aGlzLlhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLm1tKGUpLHZlbmRvcjplfSk7dGhpcy5xbygpfSxKbjpmdW5jdGlvbihhLGUpeyJ2aWRlbyI9PT1hP3RoaXMuJG8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuemcoYSxlKX0uYmluZCh0aGlzKSk6dGhpcy56ZyhhLGUpfSx6ZzpmdW5jdGlvbihhLGUpe3RoaXMucmYucHVzaCh7dHlwZTphLApmbDplLHhxOiExfSl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5YaC5tYXAoZnVuY3Rpb24oYSl7YS5HbXx8KGEucXEoe2FkU2Vzc2lvbklkOmYuVigyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuQnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLkdtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuUGx8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMuc2I9YS5laCgpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9CmYuVigxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy5BZz0hMTt0aGlzLmZjPVtdfWMuY2o9YTthLnByb3RvdHlwZT17U2w6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxmPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGY9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6Zix5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5TbChhKTtmb3IodmFyIGM9MCxkPTAsZj0hMSxoPXRoaXMudW0oYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LHhvOmZ1bmN0aW9uKCl7dGhpcy5BZz0hMH0sd2k6ZnVuY3Rpb24oKXt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2YubyhrLkhjLHRoaXMuYy5sKCkpfSxVbjpmdW5jdGlvbigpe3RoaXMuQWd8fCh0aGlzLmMucGxheSgpLGYubyhrLndkLHRoaXMuYy5sKCkpKX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuc2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLnNiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5zYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5zYik7dGhpcy5jLlpjJiZ0aGlzLmMuWmMoKT90aGlzLmMuZWgoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSx1bTpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LFFsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gY30sbWM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5RbCh0aGlzLnNiKTtpZihjLnghPXRoaXMuSGEueHx8Yy55IT10aGlzLkhhLnl8fGMucG9zaXRpb24hPXRoaXMuSGEucG9zaXRpb258fGMud2lkdGghPXRoaXMuSGEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLkhhLmhlaWdodHx8YSl7aWYoMDx0aGlzLkhhLndpZHRoJiYwPHRoaXMuSGEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5WZSgpO3JldHVybn10aGlzLkhhPWM7dGhpcy5jLlpjKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD0KYy54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuZmMubGVuZ3RoO2ErKyl0aGlzLmZjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWYuUGYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0seWc6ZnVuY3Rpb24oYSl7dGhpcy5mY3x8KHRoaXMuZmM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmZjLnB1c2goYSl9LFZlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CnRoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1mLlYoMTApO00uY29udHJvbHM9ITA7RC5wdXNoKE0pfXZhciBKPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy50bXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5SZChhKTt0aGlzLlBnKCl9LFJkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxQZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVGEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxaZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sbGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLlRhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTsKdmFyIGJiPWMuUWp8fGJiOyhmdW5jdGlvbihjKXtjLlBqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuZGM9dGhpcy5kY3x8ITE7dGhpcy5xZz10aGlzLnNnPXRoaXMud2g9dGhpcy56YT10aGlzLlVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTmwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMud2gmJnRoaXMuR2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5NYjthJiZhLm9jJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpO3RoaXMuRGcoKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5kYyl7dGhpcy51ZCgpO2lmKCF0aGlzLlVmJiYhdGhpcy51ZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuVWYmJnRoaXMucWcmJiF0aGlzLnNnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0sdWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtoKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LGtoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZzpmdW5jdGlvbigpe2lmKHRoaXMudWQoKSl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLnNnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMucWc9YS5TcH10aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLmtxKCk6ITF9LE5jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5OYygpOi0xfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sTmw6ZnVuY3Rpb24oYSxiKXt0aGlzLmRjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuZGN8fDMwMj09dGhpcy5kYz90aGlzLnphPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5kYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuemE/KHRoaXMudygpLHRoaXMuamEoKSk6YS5aZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmdtKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBjYj1jLlBqfHxjYjsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEltOmZ1bmN0aW9uKCl7d2luZG93Lk9PLiRqLkVrLkNrP3dpbmRvdy5PTy4kai5Fay5Day5RcChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLlNlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgY2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMuUmp8fGRiLGViPW5ldyBkYih0KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5zbnx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5oYT0hMTt0aGlzLm5oKCl9LG5oOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTsKYSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTWE6ZnVuY3Rpb24oKXt0aGlzLlRoKCl9LFRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcyksCjEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVWl8fGdiOyhmdW5jdGlvbihjKXtjLlRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRGUoYS5hZEVycm9yRXZlbnRzW2JdKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5EZShhKX0uYmluZCh0aGlzKSk7CmEucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHNbYl0pfS5iaW5kKHRoaXMpKTthLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYjsoZnVuY3Rpb24oYyl7Yy5WaT1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFZoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwoYS5SZChNYXRoLmNlaWwoMUUxMCoKTWF0aC5yYW5kb20oKSkpLHRoaXMuTChhKSwobmV3IGhiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMuT2x8fCh0aGlzLk9sPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5WaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBpYj1jLlZpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLmJqfHwKamI7bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sWmM6ZnVuY3Rpb24oKXt2YXIgYT1tO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLmlrfHxVOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubG4oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7CncubmQoIiMiK2EsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt3LnBtKCl9LGxuOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXtiPWlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYT1bXSxiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5NZCYmKGE9Zi5GbChhLHRoaXMuTWQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5LKGQpKXt0aGlzLkwoZCk7dmFyIGc9bmV3IFYoZCx0aGlzLkYpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLk1kfHwKKHRoaXMuTWQ9W10pLHRoaXMuTWQucHVzaChhW2JdKSxkPW5ldyBVKGgpLHRoaXMuSyhkKXx8KHRoaXMuTChkKSxnPW5ldyBWKGQsdGhpcy5GKSxnLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5PKCl9LG5kOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVthXXx8KHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goYyl9LElvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5UbigpJiYodGhpcy5BZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2NdJiYwPHRoaXMuY2FbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0KMDtkPHRoaXMuY2FbYl1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2JdW2NdW2RdKGEpfX0scG06ZnVuY3Rpb24oKXtpZih0aGlzLlVjKWZvcih2YXIgYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLlVjW2FdLGM9Yi5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmNhW2NdW2RdW2ZdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5JbyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYj1jLnhrfHxsYjtuZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5RaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLm11dGVkPSExO3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LAp1YTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLmlzUGxheWluZygpJiZhLnBhdXNlKCl9KX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUWl8fG1iOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXtmLkpjLnB1c2goeyJbd2lkdGhdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0V2lkdGh9KTtmLkpjLnB1c2goeyJbaGVpZ2h0XSI6dGhpcy5wbGF5ZXIuY29udGFpbmVyLm9mZnNldEhlaWdodH0pO3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDsKYS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuUml8fG5iOyhmdW5jdGlvbihjKXtjLlNpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7CmlmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuSyhoKXx8KHRoaXMuTChoKSwobmV3IG5iKGgsdGhpcy5GKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuTygpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVthLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuU2l8fG9iLHBiPW5ldyBvYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5Wa3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLktjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9ITApO3ZhciBiPXRoaXMuWGcoYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLktjPWIpO2lmKCF0aGlzLklnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHxhLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9CmEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLkluKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGc6ZnVuY3Rpb24oYSl7dGhpcy5oY3x8KHRoaXMuaGM9W10pO3RoaXMuaGMucHVzaChhKX0sdWw6ZnVuY3Rpb24oKXtpZih0aGlzLmhjJiZ0aGlzLmhjLmxlbmd0aClmb3IodmFyIGE9CjA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuS2MpcmV0dXJuIHRoaXMuS2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuWGcoYSkpcmV0dXJuIHRoaXMuS2M9YX19LFhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxJbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2EmJmEucmVzdW1lRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnJlc3VtZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx4aDpmdW5jdGlvbihhKXt0aGlzLmZhPWF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciByYj1jLkxqfHxyYjsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm5hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpP3RoaXMuQygpOih0aGlzLkplfHwodGhpcy5KZT0xKSx0aGlzLkplKyssMTAwPHRoaXMuSmU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTApKX19KX0pKGMpO3ZhciBzYj1jLktqfHxzYjsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9CmEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLksoYyl8fCh0aGlzLkwoYyksKG5ldyBzYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5PKCl9fSl9KShjKTt2YXIgdGI9Yy5Nanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy50cHx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudWt8fHZiOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFBjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxHbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuaWJ8fCh0aGlzLmliPVtdKTt0aGlzLmliLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5qYSgpOnRoaXMubSgiYWRlcnJvciIsCmEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkduKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuUGMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7cmV0dXJufWlmKCF0aGlzLkNjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmliJiZ0aGlzLmliLmxlbmd0aCYmMTx0aGlzLmliLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuaWIubGVuZ3RoLQoxO2IrKykxMDA5IT10aGlzLmliW2JdJiYzMDMhPXRoaXMuaWJbYl0mJjQwMyE9dGhpcy5pYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTt0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkwoYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy52a3x8CnhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk5qfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlcoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy52Zj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuem4oKX0uYmluZCh0aGlzKSw1MDApfSx6bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSwKYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy52ZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy52Zik7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJgphLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx0bzpmdW5jdGlvbigpe3RoaXMudmY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWW09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnVjfHwodGhpcy51Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/Cih3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWW0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnRvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBCYj1jLmNrfHxCYjsoZnVuY3Rpb24oYyl7Yy5laz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLApiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5HbHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuYms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CnRoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSwKMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53bCgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YT10aGlzLkliKCk7CjA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUG0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LFBtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT0KYz8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTmg9YVtlXSk7cmV0dXJuIHRoaXMuTmh9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/YT90aGlzLkliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLk8oKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT1bXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD0KYltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpO2lmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLmdkfHxIYixJYj1uZXcgSGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMubmt8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/dGhpcy5XKGIpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGpxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJgooYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LFpjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFRhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Janx8WDsoZnVuY3Rpb24oYyl7Yy5Iaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy53Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLndmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMud2YmJmMhPXRoaXMud2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8Zi5SKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5zcSksdGhpcy5DKCksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhqfHxZOyhmdW5jdGlvbihjKXtjLkpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy5BZigpOnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRyxLYj1jLkpqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE1iPWMueWt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm9qPQpyLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sY2k6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2IuSXNQYXVzZWQoKSYmYi5QbGF5KCk6KGIuUGxheSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCEwKX0uYmluZCh0aGlzKSwxMCkpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMub2p8fE5iOyhmdW5jdGlvbihjKXtjLm5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2UoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmkoKSl9fSxpOmZ1bmN0aW9uKGEpe3RoaXMuQyhhKX19KX0pKGMpOwp2YXIgT2I9Yy5uanx8T2I7KGZ1bmN0aW9uKGMpe2MucGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLnBqfHxQYixRYj1uZXcgUGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmI9Yy51bnx8UmI7bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxjaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQnJpZFBsYXllciJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7CnZhciBTYj1jLlhpfHxTYjsoZnVuY3Rpb24oYyl7Yy5ZaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT1hKXRoaXMuQ2UoKTtlbHNle2lmKCJvYmplY3QiPT10eXBlb2YgYSlpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnZhc3RFcnJvckNvZGUmJihhPWFbYl0udmFzdEVycm9yQ29kZSk7CmVsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWWl8fFRiOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycyxiO2ZvcihiIGluIGEpe3ZhciBjPW5ldyBTYihhW2JdKTtjLmhhfHx0aGlzLksoYyl8fCh0aGlzLkwoYyksd2luZG93LmJyaWRwbGF5ZXI9YywobmV3IFRiKGMsdGhpcy5GKSkuZigpKX19dGhpcy5PKCl9fSl9KShjKTt2YXIgVWI9Yy5aaXx8VWIsVmI9bmV3IFViKHQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLk9tfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpO2Vsc2V7Zm9yKHZhciBiPWE7YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlUoKX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9CiExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxIbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5lZCYmCih0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkFrfHxYYjsoZnVuY3Rpb24oYyl7Yy56az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2guYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5Gaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwKMzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkZrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XaCgpO3RoaXMubGcoKTt0aGlzLktuKCl9LEtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuRm4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuRm49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy56a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQms9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYS5IbigpLGE9bmV3IFliKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksCmEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBaYj1jLkJrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMud218fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmxrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZG49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGNpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRufSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy4kZChhKX0uYmluZCh0aGlzKSl9LCRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMubGt8fE47KGZ1bmN0aW9uKGMpe2Mua2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLk9lKWlmKHRoaXMuT2J8fAoodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5obygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuT2U9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnhiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTT1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9CmEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmtrfHxPOyhmdW5jdGlvbihjKXtjLm1rPQpwLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fAp0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLkFmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgYmM9Yy5ta3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Paj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuT2p8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRWp8fFo7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE9dGhpcy5SYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5VaD1mLlNiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsCnRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09CmEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxFYTpmdW5jdGlvbigpe3RoaXMuemE9CiEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkRqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Gaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBlYz1jLkZqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5MbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5sanx8aGM7KGZ1bmN0aW9uKGMpe2Mua2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBpYz1jLmtqfHwKaWM7KGZ1bmN0aW9uKGMpe2MubWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLk8oKTtyZXR1cm59aWYoIXRoaXMuSyhhKSl7dGhpcy5MKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5PKCk7cmV0dXJufX10aGlzLk8oKX19KX0pKGMpO3ZhciBqYz1jLm1qfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Ua3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQmUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5NPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfSxCZTpmdW5jdGlvbigpe2lmKCF0aGlzLnlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuTygpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlNrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuT2Q9W107dGhpcy56Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWWo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmJpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy56Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMuemZbZF07dGhpcy5YZihjKSYmKHRoaXMuT2QucHVzaChjKSx0aGlzLmJpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQ9YVtmXSxkPXRoaXMuemZbZF0sdGhpcy5YZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxiaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sdm86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuT2QubGVuZ3RoO2ErKyl0aGlzLk9kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2RbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuWWp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuZGp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5MYyhrLlNvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5MYyhrLmhuKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7aWYoZG9jdW1lbnQuYm9keSl7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSl9ZWxzZSB0YXJnZXRXaW5kb3c9d2luZG93O3ZhciB2Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHdjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLG09ITE7SC5nYSgpO0gueWgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmdhKCksZnVuY3Rpb24oYyl7bXx8CihtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueWgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7Zi5OZSh3aW5kb3csZi5WKDEwKSx7fSk7dmFyIGlhPWYuVigxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLm1ufHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuU2g9dGhpcy5jb25mPXRoaXMuTGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkpkPTA7dGhpcy5oYj0iIjtmLnZiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtibzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5oYj10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFluOmZ1bmN0aW9uKGEpe3RoaXMuTGI9YX0sWG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5oYl0mJnRoaXMuY29uZlt0aGlzLmhiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gY30sJGM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuem0oKSl0aGlzLkxiLmcodGhpcy5MYi5RYyx0aGlzLkxiLnFhLHRoaXMuTGIueWYsZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5MYi5pYyk7ZWxzZSBpZihsLkRiJiYhbC5IaSlsLldtKGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbT1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTsKYyYmbS54bygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTtRPW09bmV3IFFhKG0sdGhpcy5MYixoKTttLlZuKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgcD0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihwPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEocCl9YXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuZ2YmJihkPXRoaXMucGxheWVyLmdmKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTttLmpmKGEsZCxnKTt0aGlzLnBsYXllci5laShtKX19LHptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuSmQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy5KZC5nZXRUaW1lKCksdGhpcy5KZD1hLDNFNTxjPyEwOiExOwp0aGlzLkpkPWE7cmV0dXJuITF9LG5vOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5XZyhhKSk/dGhpcy4kYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfSxtbzpmdW5jdGlvbihhKXtpZighdGhpcy5TaCl7Zi5GZigicG9zdHJvbGwiKTtmLnZiKCJwb3N0cm9sbCIpO3RoaXMuYm8oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuV2coZCkpP3RoaXMuJGMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8KITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfX0sV2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LE5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIua28odGhpcy5tby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5NYSgpfSxUZDpmdW5jdGlvbihhKXtmLnZiKCJtaWRyb2xsIik7Zi5GZigibWlkcm9sbCIpO2lmKCF0aGlzLkhoKXt0aGlzLkhoPSEwO3ZhciBjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLiRjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoPSExfS5iaW5kKHRoaXMpLDFFMykpOgooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LE1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuYW8odGhpcy5UZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5tZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5ubygpO3RoaXMucGxheWVyLm1mJiZ0aGlzLk1uKCk7dGhpcy5ObigpfX19KShjKTt2YXIgZmE9Yy5MaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yz1jLkpvfHx1YztuZXcgdWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoYWl4ZUNlZWRUaGVlc29oaixhaXhlQ2VlZFRoZWVzb2hqKTsK
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
606dd07fdfe7b4f1440a8be46195687a04a21435a9691a7ba496759139f4ce78
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
User-Agent
Mozilla/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-Dest
empty

Response headers

date
Mon, 16 Mar 2020 20:08:38 GMT
content-encoding
br
x-clacks-overhead
GNU Terry Pratchett
cf-cache-status
DYNAMIC
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/json;charset=UTF-8
status
200
cache-control
max-age=0
strict-transport-security
max-age=15552000; preload
cf-ray
57511b7719c6d6d9-FRA
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
expires
Mon, 16 Mar 2020 20:08:38 GMT
config.json
hgc-cf-cache-1.svonm.com/www.pcgameshardware.de/ Frame FABB
379 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.pcgameshardware.de/config.json?cache=9161707566
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpeGVDZWVkVGhlZXNvaGo9YWl4ZUNlZWRUaGVlc29oanx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnduKWwuRGwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmZiKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5ZbihsKTtiLlhuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmZvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkZoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5GaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlVrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQ24uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnJoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnNqPWE7YS5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5yaFtiXSYmKHRoaXMucmhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy53bygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUWs6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LENuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLkJuKGIuZGF0YSl9LEJuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2goYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ2g6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sT2s6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5SbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sUmw6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxLbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxmaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0saW86ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLmlvKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sQWg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LApBPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPUE7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O0E9QSttJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYShBKSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LGFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCxBPTA7QTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoQSsrKSxnPWIuY2hhckNvZGVBdChBKyspLHE9Yi5jaGFyQ29kZUF0KEErKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxGbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSxBPSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksQT0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPUE7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtQaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxXaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx2bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxTajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx3azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sR2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxnazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlBpKCl8fGIuV2koKXx8Yi52bSgpfHxiLlNqKCl8fGIud2soKXx8Yi5HaigpfHxiLmdrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0saW06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEZsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LG9vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGFoOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy52aShhKSsiOiIrdGhpcy52aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnduPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSxEbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LHBvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5aZyhiKSlyZXR1cm4gdGhpcy5aZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuYWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5mYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuT2soZixiKTtyZXR1cm4gZn0sZmI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sVG06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YuYWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5mYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlRtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5mYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LERtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnNqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnJqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZ249e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucXA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSWw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuR2s9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuWG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkpsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLklrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkhrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuRGk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5rbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EucHA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuVG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5obj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkNsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuZW0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy50anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnFufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5jbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuWm4oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxabjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkVoJiZMLnZvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sa286ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sYW86ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx5cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ybSgpfHx0aGlzLktrKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxLazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxlaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFpoOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0sdHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkRrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy4kbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxmLmtmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnJpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHJpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm9iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGhvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ea30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwkbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxYbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5lanx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaGp8fG9hOyhmdW5jdGlvbihjKXtjLmlqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmlqfHxwYTsoZnVuY3Rpb24oYyl7Yy5qaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMuamp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLk9pfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5ZZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxtcTpmdW5jdGlvbigpe3JldHVybiExfSxZZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApOwp0aGlzLlcoYil9fSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9CmEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7CnJldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQmp8fHNhOyhmdW5jdGlvbihjKXtjLkFqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LG9xOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5yZT0hMTt0aGlzLnRlPTE7dGhpcy5qZD1bXTt0aGlzLkdiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmCmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnRlPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5HYj0hMCk7ZWxzZXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlIGluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciBlPTA7ZTxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmxlbmd0aDtlKyspaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZVtlXS50YWcpe3RoaXMuR2I9ITA7YnJlYWt9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5HYj0hMCk7Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5HYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkdiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7dmFyIGQ9CiJhZFBsYXkgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIik7aWYoZi5SKCJzcGllZ2VsLmRlIikmJi0xIT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpKXthLm9uKCJiZWZvcmVQbGF5IixmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5qdy12aWRlbyIpOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtiLmZvckVhY2goZnVuY3Rpb24oYil7ImF0dHJpYnV0ZXMiIT1iLnR5cGV8fCJzcmMiIT1iLmF0dHJpYnV0ZU5hbWV8fHRoaXMucm58fC0xIT1iLnRhcmdldC5zcmMuaW5kZXhPZigidmNkbjAxIil8fCh0aGlzLnJuPSEwLGIudGFyZ2V0LnNyYz0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iK2YuYWIoYi50YXJnZXQuc3JjKSx6LmJpbmQodGhpcykoKSl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSkub2JzZXJ2ZShiLAp7YXR0cmlidXRlczohMCxjaGlsZExpc3Q6ITAsY2hhcmFjdGVyRGF0YTohMH0pfS5iaW5kKHRoaXMpKTt2YXIgZyxjLGgsej1mdW5jdGlvbigpe2g9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiei0xMCIpO2Zvcih2YXIgYj0wO2I8aC5sZW5ndGg7YisrKWhbYl0uY2xhc3NMaXN0LnJlbW92ZSgiei0xMCIpO2c9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5wYXJlbnRFbGVtZW50O2I9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKTtjPWIuc3R5bGU7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSItIisoYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55LWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWFyZWE9J2hlYWRlci1iYXInXSIpLm9mZnNldEhlaWdodCkrInB4IjtiLnN0eWxlLmxlZnQ9IjBweCI7Yi5zdHlsZS53aWR0aD0iMTAwJSI7Yi5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IiwxNipiLm9mZnNldFdpZHRoLzkrInB4IiwKImltcG9ydGFudCIpO2Iuc3R5bGUuekluZGV4PTFFMztiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Yi5sb2FkKCk7Yi5wbGF5KCl9O2Eub24oImFkQ29tcGxldGUiLGZ1bmN0aW9uKCl7Zy5pbnNlcnRCZWZvcmUoandwbGF5ZXIoKS5nZXRDb250YWluZXIoKSxnLmZpcnN0Q2hpbGQpO2p3cGxheWVyKCkuZ2V0Q29udGFpbmVyKCkuc3R5bGU9Yztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXtpZihnJiZjKXtnLmluc2VydEJlZm9yZShqd3BsYXllcigpLmdldENvbnRhaW5lcigpLGcuZmlyc3RDaGlsZCk7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5zdHlsZT0KYztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSl9Zm9yKGU9MDtlPGQubGVuZ3RoO2UrKylhLm9uKGRbZV0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtlXSYmKHRoaXMucmU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtlXSYmdGhpcy5MaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLiRtJiYhdGhpcy55YSgpJiYodGhpcy5HYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsCjFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5NYjtiJiYoYi5OZCgpLGIueGQoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuVmd8fCh0aGlzLlZnPVtdKTt0aGlzLlZnLnB1c2goe2NvZGU6YS5jb2RlLG1zZzphLm1lc3NhZ2V9KTt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJgowPGEubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnRlJiZ0aGlzLmkoKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuTGU/dGhpcy5MZSsrOnRoaXMuTGU9MTp0aGlzLktlP3RoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLllnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMuQWp8fHRhOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGUmJmUoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLndifHx0aGlzLksoZSl8fHRoaXMuRW0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYuYWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9CmE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy5Ya3x8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mucms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwKJGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5xaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVWg9Zi5TYigxMCk7dGhpcy54aT0hMDt0aGlzLkNjPXRoaXMudmg9ITE7dGhpcy5lbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksCnRoaXMueWIoKSl9LGVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLlIoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuSWE/YS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5JYT90eXBlb2YgYS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlVoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sCmloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmMpe3ZhciBhPXRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy51aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLkxuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sTG46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2lmKGYuUigiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYKKHRoaXMuTWc9YS5hZHMpO3JldHVybiB0aGlzLk1nfSxobDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuTGgoKX0uYmluZCh0aGlzKSl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLAplPXRoaXMuUGMoKTtiJiZlJiYodGhpcy5DY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNjP3RoaXMudygpOih0aGlzLmRhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnZoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PQpifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuTT1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxpbDpmdW5jdGlvbigpe3RoaXMuSWN8fCh0aGlzLkljPSJ1bmtub3duIik7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkcyl7aWYodGhpcy5JYyE9YS5hZHMuc3RhdGUmJih0aGlzLkljPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkljKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlsKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/Cih0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMueWEoKXx8KGF8fCh0aGlzLnhpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLnhpLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuaXF8fCgxMDx0aGlzLmJwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYnArKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5TbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxTbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYKIXRoaXMuY3Ape3RoaXMuY3A9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5xa3x8eWE7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuaWkod2luZG93KTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmlpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGlpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmCihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuU2UoYikpe2Zvcih2YXIgZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJihhPW5ldyB4YShiW2VdKSxhLmhhfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTChhKSwobmV3IHlhKGEsdGhpcy5GKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LE86ZnVuY3Rpb24oKXt0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMuc2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy50Zj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmKGI9YS5wYXJlbnROb2RlKSwhYikpe3RoaXMuVSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0seW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fApiLk5kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy50Zj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LHVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTphLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuVWp8fFI7KGZ1bmN0aW9uKGMpe2MuVGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0KMCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBlPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWU9ITA7ZXx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChlPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5NPXRoaXMuTXx8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuTWw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5NbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLnluKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTsKdGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihjKXtjLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgUihhW2JdKTtlLmhhfHx0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBDYShlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRGE9Yy5Wanx8RGEsRWE9bmV3IERhKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuc218fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmZoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYKKGI9Yi5wYXJlbnROb2RlKX10aGlzLkFuPWEucG9zaXRpb25pbmc7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5zdHlsZS53aWR0aD1hLndpZHRoO2Uuc3R5bGUubWluV2lkdGg9YS53aWR0aDtlLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7ZS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5Bbil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTsKdGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLkFoKHRoaXMuQ2QpO2YuYWYodGhpcy5DZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFsKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy55anx8R2E7KGZ1bmN0aW9uKGMpe2MueGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMueGp8fElhOyhmdW5jdGlvbihjKXtjLnpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9Cm0uaW5yZWFkLGI9Zi5maChhLCJlbGVtZW50SUQiKTtpZihmLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuSyhhKSkpe3RoaXMuTChhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnpqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5ibHx8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT0Ke319Yy51aj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LExrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBDPWMudWp8fEM7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixhLGQsZyxjKXt0aGlzLkZhPWI7dGhpcy4kZz10aGlzLkdpPSExO3RoaXMuTWg9ZDt0aGlzLmppPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmxiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09CmgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuZGYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9Yy52aj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy4kZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5sYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuamk/dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmxiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuR2l8fAoodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMubGIuc2VuZChiKX1jYXRjaChnKXtiPXRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5Iil8fHRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTWgmJnRoaXMuTWgoKX1yZXR1cm4gdGhpcy5sYn19fSkoYyk7dmFyIE1hPWMudmp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuYWo9CmE7YS5wcm90b3R5cGU9e2VvOmZ1bmN0aW9uKGIpe3RoaXMubWU9Yn0sY286ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxRbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt4cDoiQWRDbGlja1RocnUiLHpwOiJBZEVycm9yIixBcDoiQWRTdG9wcGVkIixEcDoiQWRMaW5lYXJDaGFuZ2UiLEVwOiJBZFRhZ1BhcnNlZCIsSHA6IkFkVmlkZW9Db21wbGV0ZSIsS3A6IkFkTG9hZGVkIixMcDoiQWRTa2lwcGVkIixNcDoiQWRTdGFydGVkIixCcDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLENwOiJBZEltcHJlc3Npb24iLHlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7CmZvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5tZSxhW2RdKX0sUG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmxlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmxlKXRoaXMuR2EubGUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5HYSx0aGlzLkdhLmxlW2FdKTt0aGlzLkdhJiZ0aGlzLkdhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkdhLmdldEVycm9yKCl9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5RbigpO3RoaXMuR2EmJnRoaXMuUG4oKX19fSkoYyk7dmFyIE5hPWMuYWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnFiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLnBiPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjsKdGhpcy5lZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy4kZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy55Zj0hMTt0aGlzLmlhPVtdO3RoaXMuV2U9dGhpcy5WYj0iIjt0aGlzLmplPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLm5iPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLmFjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLldiPSIiO3RoaXMuWGI9W107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmpiPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmJiPXtnbG9iYWw6ITEsY2xpZW50OiExLApjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5FYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5ZYz10aGlzLlFkPW51bGx9Yy53aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXI6dGhpcy5wYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZWMsYWR0YWdyZWdleDp0aGlzLnFkLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmZmLHNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLApzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLldlLEhPTUFEX1ZFUklGSUVEOnRoaXMuamUsSE9NQURfQkxPQ0tFRDp0aGlzLmllLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsdGVzdFRhZ3NYSFI6dGhpcy5iZCx0ZXN0M1BDb29raWU6dGhpcy50Yyx0aHJvdHRsZTp0aGlzLlpkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubmMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5IZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmJiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuZWIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLkxmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFduOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkNhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLnFiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMucGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmZmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy56Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5lZj1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5RYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJgoodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLiRlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuV2U9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuamU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5uYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLmJkPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy50Yz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuWmQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLkhnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuV2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5iZT1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYmI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmViPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuTGY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuYWc9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5FYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LApxbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5iYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmJiW2FdJiYxPT10aGlzLmJiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuYmJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmJiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYmJbYV0mJjE9PXRoaXMuYmJbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sWGQ6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIiwKZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuJGsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIixjPSIiLGY9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5jZihiKTtjPXRoaXMuYWEoYik7Zz8odGhpcy5TYygpP2Y9YjpmPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGY9dGhpcy5xYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFifHx0aGlzLnBifHx0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5ibihoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmJtKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD0KaDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5hYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGNmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5TYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj0KYS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxkZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmNmKGIpO3JldHVybiBhfSxibTpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIiwKYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSWg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sYW46ZnVuY3Rpb24oYixhKXt2YXIgZD1mLmFhKGIpLGc9IiIsZz0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZz17fSx6PTA7ejxoLmxlbmd0aDt6Kyspe3ZhciBrPWhbel0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5JaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPQp0aGlzLkloKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmKGIrPXRoaXMucWIpO2lmKHRoaXMucGIpZm9yKHZhciBhIGluIHRoaXMucGIpdGhpcy5wYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5wYlthXSkpO2lmKGYuSmMpZm9yKHZhciBkPTA7ZDxmLkpjLmxlbmd0aDtkKyspe3ZhciBnPWYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuYW4oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmCmEuZW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmNvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxjLGYpe2w9dGhpczt0aGlzLmVmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy55Zj1kO3RoaXMuZWU9Zzt0aGlzLmljPWM7dGhpcy54YT1mfHx7fTt0aGlzLnBsKCk7dGhpcy5TbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlFtKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkdjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZ2I6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxEbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sU206ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuUWMrdGhpcy54ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5HYygpfS5iaW5kKHRoaXMpLCEwKX0sUW06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy54ZSgiY2xpZW50IiwtMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iKwp0aGlzLlNiKCkpO3RoaXMueGEmJnRoaXMueGEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnhhJiZ0aGlzLnhhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGUpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaWM9ITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPQp0aGlzLiRlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5nYih0aGlzLmllKSk7dGhpcy5CYigpO2YuTGMoay54bik7KGE9Zi5VYSh0aGlzLklkKCkpKXx8KGE9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuaXNFbmFibGVkPXRoaXMuQWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPGQuc2VydmVyLmxlbmd0aDtiKyspe3ZhciBhPQpkLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaCh6KXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8CltdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5SKCJ3ZWIuZGUiKXx8Zi5SKCJnbXgubmV0Iil8fGYuUigiZ214LmF0Iil8fGYuUigiZ214LmNoIil8fGYuUigiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5kaShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJgp0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxkaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFRjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucWMoKSksZD10aGlzLmFhKHRoaXMuVmIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGEsdGhpcy55by5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTsKYj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5bzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuV2Y9dGhpcy5BYihkLnN0cmljdCk7dGhpcy5iZT10aGlzLkFiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5lYj10aGlzLkFiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuV2I9ZC50ZXN0aGlkZXx8IiI7dGhpcy5ZYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmJkPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5xYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnBiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fApudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZmY9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnhhLnZwYWlkPXRoaXMuamI7dGhpcy5MZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkVjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmRpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5aZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMuRGI9ZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuS28oKSYmCih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnlmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuRWUoKSx0aGlzLkJiKCkpOnRoaXMuQm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5UZigpKX19LFdtOmZ1bmN0aW9uKGIpe3RoaXMuSGk9ITA7dmFyIGE9ZnVuY3Rpb24oYil7aWYoYj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2IrIj0oW147XSspIikpKXJldHVybiBiWzJdfSgiYWRwX3NlZ3MiKXx8ImUwIixhPXRoaXMuRGIudXJsLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKS5yZXBsYWNlKCJbc2Vnc10iLGVuY29kZVVSSUNvbXBvbmVudChhKSksYT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6YSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLmFiKGEpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07CmYuS2QodGhpcy5xYygpLCJQT1NUIixhLGZ1bmN0aW9uKGEpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaCh6KXtiKCl9YigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YigpfS5iaW5kKHRoaXMpLCEwKX0sQm86ZnVuY3Rpb24oKXt0aGlzLkFvKCk7dGhpcy5DbygpfSxDbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksej1mLlYoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHosZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoeikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2YuYWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChnKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9Zi5CZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLnNhKCJjc3BfIithKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxUZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sWWQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IoYSkpLHRoaXMuQmIoKSx0aGlzLkVlKCkpfSxBbzpmdW5jdGlvbigpe2lmKHRoaXMuV2Ipe3ZhciBhPWYuQmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLkhtKCkpdGhpcy5ZZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTsKZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpO2E9ZH1jYXRjaChnKXt9YT90aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm1pKCl9fWVsc2UgdGhpcy5taSgpfSxSZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy5GbyhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBkPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZigpfSxGbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZj8od2luZG93LmNsZWFyVGltZW91dChmKSwhMCk6ITF9dmFyIGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbWk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuR28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGQ9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlJmKCl9LEdvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7ZigpJiZlKCl9ZnVuY3Rpb24gYygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZSl7ZT09YSYmZigpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPQpjO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sUWY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLktkKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuQWIoYS5jYyk7dGhpcy5UZigpfS5iaW5kKHRoaXMpLHRoaXMua2kuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5raSgpfWVsc2UgdGhpcy5UZigpfSxraTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKTt0aGlzLkVlKCl9LEhtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LEJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJgooYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnhjJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5RZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMuamUpKTt0aGlzLmVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuZWUmJnRoaXMuZWUoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuSGJ9KX0sY2w6ZnVuY3Rpb24oKXt0aGlzLlljPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWWMuaWQ9Zi5WKDEwKTt0aGlzLlljLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5ZYyk7dmFyIGE9dGhpcy5ZYy5jb250ZW50V2luZG93LGU9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD0KZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5RZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5RZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi5BZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYTthPShhPWRvY3VtZW50LmNvb2tpZS5tYXRjaCgvKF58IClhZHBfc2Vncz0oW147XSspLykpP2FbMl06dm9pZCAwO2EmJmYudHJhY2soInN0YXRzX2hkX3NlZ3MiLCJlMCIhPWEsITApfS5iaW5kKHRoaXMpLDJFMyl9LG9sOmZ1bmN0aW9uKCl7aWYodGhpcy5iZSYmdGhpcy5xbSgpKXt2YXIgYT10aGlzLiRsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIiwKYS5qb2luKCJfIiksITApfX0scmk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxLYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrO3RoaXMuSGQ+dGhpcy5waCYmIXRoaXMucWgmJih0aGlzLnFoPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5waCwhMCkpO2E9bmV3IE1hKGEsZSxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtnJiYoYS5HaT0hMCk7YyYmZi5GbSgpJiYoYS4kZz0hMCk7aCYmKGEuamk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLlptfHwKKHRoaXMuWm09ITAsZi5EYSgpfHxmLmZiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihnPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGdbMF0mJihnPWdbMF0pLGcpe2c9ZyYmZy5jaGlsZE5vZGVzJiZnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKwoiOi8vIitnLmhvc3QpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Zi5uZXR3b3JrU3RhdGU9PWYuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9Zi5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFwcGVuZENoaWxkKGUpO2Yuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx6bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5Xby5iaW5kKHRoaXMpLHRoaXMuVm8uYmluZCh0aGlzKSl9LFdvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsOwp0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuS2woKX0sVm86ZnVuY3Rpb24oKXt9LEtsOmZ1bmN0aW9uKCl7Zi5MYyhrLkpsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxFZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuemIubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy56YlthXTsicmVxdWVzdCI9PWUudHlwZSYmZi5mYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWUudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztmLmZiKGUudXJsLGUuYWxpYXMsCm51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxLbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLlpkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPSIiLGQ9MDtkPGE7ZCsrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBlfSxBYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxhYjpmdW5jdGlvbihhKXtmb3IodmFyIGU9IiIsZCxnLGMsZixoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz0KYS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxmPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihjKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZX0sYWE6ZnVuY3Rpb24oYSl7dmFyIGU9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZz0xNDtnLS07KWRbZVtnXV09YVtnXXx8IiI7ZC5xdWVyeUtleT17fTtkW2VbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZSl7YiYmKGQucXVlcnlLZXlbYl09ZSl9KTtyZXR1cm4gZH0sSmY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZShhKXt2YXIgYj0iIixkLGU7Zm9yKGQ9NzswPD1kO2QtLSllPWE+Pj40KmQmMTUsYis9ZS50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZj1BcnJheSg4MCksCmg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpYz1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKylmW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO2M9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGMsNSkrKG4mcHx+biZyKSt1K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9MjA7Mzk+PWc7ZysrKXY9ZChjLDUpKyhuXnBecikrdStmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTQwOzU5Pj1nO2crKyl2PWQoYyw1KSsobiZwfG4mcnxwJnIpK3UrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YywKYz12O2g9aCtjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy53anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLldrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUGE9Yy5Xa3x8UGE7bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUsZCl7dGhpcy5hPWE7YS5jLlA/dGhpcy5oYj1hLmMuUCgpOnRoaXMuaGI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5haS5iaW5kKHRoaXMpLG11dGU6dGhpcy5vZi5iaW5kKHRoaXMpLAp1bm11dGU6dGhpcy5Rby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnNiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLllrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVmQ9e307Zi52YigibmV3QmlnQWRJZCIpO3RoaXMuYWw9Zi5WKDEwKTt0aGlzLk5mPTA7dGhpcy5vZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLm9kPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLm9kPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlJrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuV2M9dGhpcy5VZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoPwpwYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMud2U9ITE7dGhpcy51aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZmk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5mZT10aGlzLiRiPXRoaXMuSWU9dGhpcy55ZD10aGlzLldkPXRoaXMuQ2I9dGhpcy52Yz10aGlzLlBoPXRoaXMuSGU9dGhpcy5EZD10aGlzLkxvPXRoaXMuRmI9dGhpcy5RYj0hMTt0aGlzLkFjPVtdO3RoaXMucGM9e307dGhpcy50bj0yMDA7dGhpcy5kZz10aGlzLmRkPXRoaXMuRmM9dGhpcy5jZz10aGlzLnhmPSExO3RoaXMucWY9e319Yy5xaj1hO2EucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmhiXSYmdGhpcy5jb25mW3RoaXMuaGJdW2FdJiYoZT0KdGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gZX0sc2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLnJvKCk7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0samY6ZnVuY3Rpb24oYSxlLGQsYyl7dGhpcy5GYj1kO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLk5mKyssZi52YigibmV3U21hbGxBZElkIiksdGhpcy5BLm9sKCksYz1sLmdldENvbmZpZygpLGYuT2cmJih0aGlzLkEuV24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsCmtlZXBVUkw6ZSxiaXRyYXRlOmMuUGEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmpiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB4Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt4Yy5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmxvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLkFjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmttKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5iaChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlZsKGIpKSk7cmV0dXJuIGV9LFZsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0sa206ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLnFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmZuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5JbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuc28oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsucnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5zcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLlRvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLlVvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sbG86ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMua2IuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS52cT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlJrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk1rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5uaShlKSl7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5QayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmtiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMua2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuam8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sam86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuUWsodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5RaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMuemkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLm5tKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuZXAoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5mcCgpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5qcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5vcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5FaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmdwKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmhwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0saHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGpwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGZwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuaGkoKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxucDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxscDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxvcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LEVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LGVwOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkVpKCEwKX0sTWs6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBkPWIuYWEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLmFwLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5DaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm5pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlpvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLllvKCk7dGhpcy56aSgpO3RoaXMuQmcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5laSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuZWImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuR2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LEprOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZ2goYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5wbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuSmsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5rbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS53aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlpoKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkpoKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sYXA6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQ2k6ZnVuY3Rpb24oKXtpZih0aGlzLkxvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5PbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmtiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLndpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi5haCh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx0aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxPbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudWl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudGkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnRpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuaGkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5lYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuZWImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy51aT1hKX0sZ2k6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxybzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0saGk6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHNvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5lYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5lYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMubG0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLkRtKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkhrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGQpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkVsKHRoaXMuYi5PYSxhKX1jYXRjaCh6KXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5MayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLk5rKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5ZaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlloKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxOazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFloOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sdW86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sbG06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxFbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxabzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sWW86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuYWgoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnBpLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5maTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxhaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuTW0oKSYmdGhpcy5MbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLlBvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LE1tOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuamJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5qYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5qYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxMbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sYW06ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LFBvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmYudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsZS5hdmFpbGFibGUsITApO2lmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7Zi50cmFjaygic3RhdHNfd3RfY2F0Y2giLCIiLCEwKX10aGlzLnhkKCl9dmFyIGU9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzLGQ9dGhpcy5hbSgpO3RoaXMuRmM9dGhpcy5XYz10aGlzLmRkPXRoaXMuZGc9ITA7cmV0dXJuIGU/KGYuZmIoImh0dHBzOi8vd3d3LndlbGVjdC5kZS9hcGkvdjEvcHJlZmxpZ2h0L2J5X2FsaWFzLyIrZSwiZGV3ZWxlY3R3d3d3ZWxlY3RkZSIse30sYS5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSx0aGlzLkEpLAohMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMudW8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSx0aGlzLnRuKToodGhpcy5XZD0hMCx0aGlzLmEuVmUoKSx0aGlzLmEuVW4oKSx0aGlzLm9jPSExLGE9dGhpcy5iLnN8fHt9LHRoaXMuSGV8fChhLm5vQ29tcGxldGVRdWFydGlsZT0hMCksZi5vKGsueWwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLlJlKCkuWmgoKSl9LFJlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LEJnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGYuYWYodGhpcy52aWRlbyxhKT90aGlzLmFpKCk6dGhpcy5OZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZygpfS5iaW5kKHRoaXMpLDEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9CnRoaXMuYi5yYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLkFjJiYwPHRoaXMuQWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLkFjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHU6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLmFsKyItIit0aGlzLk5mO3RoaXMuYiYmdGhpcy5iLmhoJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYi5oaCgpKTtyZXR1cm4gYX0sUmc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnFqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYT1jLkhsfHxSYTtuZXcgUmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGQsYyl7dGhpcy5vcHRpb25zPWN8fHt9O2U9ZDt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5vYT1udWxsO3RoaXMuWT1bXTt0aGlzLko9bnVsbDt0aGlzLnpjPXRoaXMuQmM9ITE7dGhpcy5iYT0iIjt0aGlzLmJnPSExO3RoaXMuc2g9IiI7YyYmYy5lbXB0eT90aGlzLlZtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBiPTAsZSxkPVtdO2Mub2s9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWYuQmQoKSxiO2I9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgZD0iIjtiLnF1ZXJ5S2V5JiYoZD1iLnF1ZXJ5S2V5Lmh2cCk7ZCYmKHRoaXMub3B0aW9ucy52cGFpZD0KITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwudmEobC5YZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFmLkRhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxjPWZ1bmN0aW9uKCl7cmV0dXJuIGUoKSYmKGYuUigibWFydGhhc3Rld2FydC5jb20iKXx8Zi5SKCJmYW5kb20uY29tIil8fGYuUigiZ2lnYS5kZSIpfHxmLlIoImtpbm8uZGUiKXx8Zi5SKCJzcGllbGV0aXBwcy5kZSIpfHxmLlIoImRlc2lyZWQuZGUiKSl9LmJpbmQodGhpcyk7aWYoZSgpfHxjKCkpe3ZhciBoPWYuTmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgYz1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYKIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4oZi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG49ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihjKCl8fGsoKXx8bSgpfHwiYXBwc3BvdCI9PQpkKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlhkKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLlhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixmLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuWGQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5VbS5iaW5kKHRoaXMpLHRoaXMuUm0uYmluZCh0aGlzKSl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuTmIpdHJ5e3ZhciBlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09ZS5maXJzdENoaWxkfWNhdGNoKGMpe2RbYl09e319ZWxzZSBkLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLk5ifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5OYnx8dGhpcy5KbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC56bygpKXRyeXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Yy5sZW5ndGgmJihjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2NbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtlW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspZC5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChkKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxKbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGQ9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZT0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZT1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZSYmTWF0aC5hYnMoZS1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWQ/ITA6ITF9LFVtOmZ1bmN0aW9uKGEpe3RoaXMuRW4oYSk7dHJ5e3RoaXMub2E9YS5yZXNwb25zZVhNTCx0aGlzLm9hfHwodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuc2g9YS51cmxDYWxsZWQ7aWYodGhpcy5ZLmxlbmd0aCl0aGlzLlZjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUmEodi5mZCx7ZXJyb3I6dGhpcy5iZz8KRi5uZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuVWEodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxWbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuWS5sZW5ndGg/dGhpcy5WYygpOnRoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKX0sUm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUmEodi5mZyx7ZGVwdGg6Yn0pKX0sVmM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5ObSgpP3RoaXMuSG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5taCgpLGUse0FkU3lzdGVtOnRoaXMuVWwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5SYSh2LmlnKSk6KGI9MCx0aGlzLlJvKCkmJnRoaXMudWYodGhpcy5CbCgpKSl9LHBmOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5wZigpfSxKaDpmdW5jdGlvbigpe3RoaXMuemM/KHRoaXMuemM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQuSmgoKX0sUm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FbygpP3RoaXMuRG8oKT8hMDooLTEhPXRoaXMuTmMoKT90aGlzLnJhKHRoaXMuUmEodi5oZSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSksITEpOih0aGlzLnJhKHRoaXMuUmEodi5mZCxGLmhnKSksITEpfSx1ZjpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5nZXx8KGEuZ2U9W10pO2EuZ2UucHVzaCh0aGlzLnNoKTthLk9hPWEuT2EuY29uY2F0KHRoaXMubGYoKSk7YS5FYj1hLkViP2EuRWI6dGhpcy5CYzsKYS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7dGhpcy5wYXJlbnQudWYoYSl9LEJsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmR1cmF0aW9uPXRoaXMuTmMoKTthLk49dGhpcy5qaCgpO2EucmI9dGhpcy5XbCgpO2EuQ3E9W107YS5vcmlnaW49dGhpczthLnM9dGhpcy5UbCgpO2EuTWY9dGhpcy5qbShhLmR1cmF0aW9uKTthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fAoodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2lmKCF0aGlzLkomJnRoaXMub2EmJnRoaXMub2EuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5vYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmQubGVuZ3RoJiZmLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZSl7fX10aGlzLkomJihhLk9hPWEuZXJyb3IuY29kZSE9di5oZS5jb2RlP2EuT2EuY29uY2F0KHRoaXMuWGwoKSk6YS5PYS5jb25jYXQodGhpcy5mbSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmtjJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGtjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmtjKGEpfSxVZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxIbzpmdW5jdGlvbigpe3JldHVybiBiPGV9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5qaCgpLmxlbmd0aH0sRG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLk5jKCl9LFNmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LGxpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5TZigpJiYoYT0hMCk7cmV0dXJuIGF9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuYmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5iYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLmJhPSJVTktOT1dOIn10cnl7dGhpcy5iZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChlKXt9fSxObTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMubWgoKS5sZW5ndGh9LG1oOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUWUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIkFkU3lzdGVtIil9LGxmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1lJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiQ29tcGFuaW9uIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUpKXJldHVybn1jYXRjaChkKXt9aWYoYSYmIXRoaXMuemgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxlLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMudGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSx6aDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxYbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0samg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxQYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFVwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnRiKGFbZF0pfSk7dmFyIGU9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBjPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5QYSktTWF0aC5hYnMoZS1iLlBhKX0pLGY9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZS1hLlBhKS1NYXRoLmFicyhlLWIuUGEpfSksYj1jLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LFRsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7CmZvcih2YXIgYj0iIixkPSExLGU9W10sYj0hMSxjPSIiLGY9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2M9Yj10aGlzLkdkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWUucHVzaChkKTtmLnB1c2goYyl9MTxhLmxlbmd0aD8oYj1lLGg9Yyk6KGI9ZCxoPWYpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxOYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sam06ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxlPSExO3RyeXtkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZT1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5vbyhlLAphKSwwPmImJihiPSExKX1jYXRjaChjKXtiPSExfXJldHVybiBifSxRZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMudGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx0YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkdkKGEpOiIifSxHZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5va3x8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLnBufHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk49W107dGhpcy5yYj0iIjt0aGlzLnM9dGhpcy55Yz10aGlzLkViPSExO3RoaXMuWGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlllPSIifWMuV2o9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sZG06ZnVuY3Rpb24oKXtpZighdGhpcy5YZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm9hKXt2YXIgYT10aGlzLm9yaWdpbi5vYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZT0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGU9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1lLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLlhlPWFbZF0pfXJldHVybiB0aGlzLlhlfSwKaGg6ZnVuY3Rpb24oKXtpZih0aGlzLlllKXJldHVybiB0aGlzLlllO3ZhciBhPSIiOyhhPXRoaXMuZG0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlllPWF9LG5tOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTi5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5OW2VdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Xanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5OaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHY9e29lOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE5hOiJYTUxfUEFSU0VfRVJST1IifSxlZzp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLAptZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGZkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGlnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE5hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKTmE6IkxPQURfRVJST1IifSxrZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx1cDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixOYToiTUVESUFGSUxFX0VSUk9SIn0saGU6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTmE6IkRVTU1ZX0FEIn19LEY9e2dnOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTmE6Ik5PX0FEUyJ9LGhnOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixOYToiTk9fTUVESUFGSUxFUyJ9LHZwOnt0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG5lOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMucGt8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5lcnJvcj1hO3RoaXMuQWQ9ZTt0aGlzLk9hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuZ2p8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPQpjLm5ufHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuJGg9YTt0aGlzLnZpZGVvPWU7dGhpcy5jZT1bXTt0aGlzLlhoPVtdO3RoaXMucmY9W107dGhpcy4kbz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSSgpfWMud3A9YTthLnByb3RvdHlwZT17STpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy4kaC5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLiRoW2FdLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsCmM9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO3ZhciBoPWYuY29udGVudFdpbmRvdztoLnJxPXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkpuLmJpbmQodGhpcyl9O3ZhciBrPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2sub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2guZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtoLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7CnRoaXMuY2UucHVzaCh7c3JjOmQsZnJhbWU6Zix2bjpjLHZlbmRvcjplLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5yZi5sZW5ndGg7ZSsrKXt2YXIgZD10aGlzLnJmW2VdO2QudHlwZT09PWEmJmQuZmwodGhpcy5ZbChhKSl9fSxZbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntBcTohMCx6cTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntucToidmlkZW8iLERxOiJqc0N1c3RvbSIsRXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxGcToxLFZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsCmVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LG1tOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5jZS5sZW5ndGg7ZSsrKWlmKHRoaXMuY2VbZV0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5jZVtlXS52bjtyZXR1cm4iIn0sUm46ZnVuY3Rpb24oYSxlKXt0aGlzLlhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLm1tKGUpLHZlbmRvcjplfSk7dGhpcy5xbygpfSxKbjpmdW5jdGlvbihhLGUpeyJ2aWRlbyI9PT1hP3RoaXMuJG8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuemcoYSxlKX0uYmluZCh0aGlzKSk6dGhpcy56ZyhhLGUpfSx6ZzpmdW5jdGlvbihhLGUpe3RoaXMucmYucHVzaCh7dHlwZTphLApmbDplLHhxOiExfSl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5YaC5tYXAoZnVuY3Rpb24oYSl7YS5HbXx8KGEucXEoe2FkU2Vzc2lvbklkOmYuVigyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuQnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLkdtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuUGx8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMuc2I9YS5laCgpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9CmYuVigxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy5BZz0hMTt0aGlzLmZjPVtdfWMuY2o9YTthLnByb3RvdHlwZT17U2w6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxmPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGY9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6Zix5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5TbChhKTtmb3IodmFyIGM9MCxkPTAsZj0hMSxoPXRoaXMudW0oYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LHhvOmZ1bmN0aW9uKCl7dGhpcy5BZz0hMH0sd2k6ZnVuY3Rpb24oKXt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2YubyhrLkhjLHRoaXMuYy5sKCkpfSxVbjpmdW5jdGlvbigpe3RoaXMuQWd8fCh0aGlzLmMucGxheSgpLGYubyhrLndkLHRoaXMuYy5sKCkpKX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuc2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLnNiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5zYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5zYik7dGhpcy5jLlpjJiZ0aGlzLmMuWmMoKT90aGlzLmMuZWgoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSx1bTpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LFFsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gY30sbWM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5RbCh0aGlzLnNiKTtpZihjLnghPXRoaXMuSGEueHx8Yy55IT10aGlzLkhhLnl8fGMucG9zaXRpb24hPXRoaXMuSGEucG9zaXRpb258fGMud2lkdGghPXRoaXMuSGEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLkhhLmhlaWdodHx8YSl7aWYoMDx0aGlzLkhhLndpZHRoJiYwPHRoaXMuSGEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5WZSgpO3JldHVybn10aGlzLkhhPWM7dGhpcy5jLlpjKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD0KYy54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuZmMubGVuZ3RoO2ErKyl0aGlzLmZjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWYuUGYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0seWc6ZnVuY3Rpb24oYSl7dGhpcy5mY3x8KHRoaXMuZmM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmZjLnB1c2goYSl9LFZlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CnRoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1mLlYoMTApO00uY29udHJvbHM9ITA7RC5wdXNoKE0pfXZhciBKPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy50bXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5SZChhKTt0aGlzLlBnKCl9LFJkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxQZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVGEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxaZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sbGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLlRhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTsKdmFyIGJiPWMuUWp8fGJiOyhmdW5jdGlvbihjKXtjLlBqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuZGM9dGhpcy5kY3x8ITE7dGhpcy5xZz10aGlzLnNnPXRoaXMud2g9dGhpcy56YT10aGlzLlVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTmwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMud2gmJnRoaXMuR2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5NYjthJiZhLm9jJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpO3RoaXMuRGcoKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5kYyl7dGhpcy51ZCgpO2lmKCF0aGlzLlVmJiYhdGhpcy51ZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuVWYmJnRoaXMucWcmJiF0aGlzLnNnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0sdWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtoKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LGtoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZzpmdW5jdGlvbigpe2lmKHRoaXMudWQoKSl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLnNnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMucWc9YS5TcH10aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLmtxKCk6ITF9LE5jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5OYygpOi0xfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sTmw6ZnVuY3Rpb24oYSxiKXt0aGlzLmRjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuZGN8fDMwMj09dGhpcy5kYz90aGlzLnphPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5kYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuemE/KHRoaXMudygpLHRoaXMuamEoKSk6YS5aZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmdtKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBjYj1jLlBqfHxjYjsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEltOmZ1bmN0aW9uKCl7d2luZG93Lk9PLiRqLkVrLkNrP3dpbmRvdy5PTy4kai5Fay5Day5RcChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLlNlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgY2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMuUmp8fGRiLGViPW5ldyBkYih0KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5zbnx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5oYT0hMTt0aGlzLm5oKCl9LG5oOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTsKYSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTWE6ZnVuY3Rpb24oKXt0aGlzLlRoKCl9LFRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcyksCjEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVWl8fGdiOyhmdW5jdGlvbihjKXtjLlRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRGUoYS5hZEVycm9yRXZlbnRzW2JdKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5EZShhKX0uYmluZCh0aGlzKSk7CmEucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHNbYl0pfS5iaW5kKHRoaXMpKTthLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYjsoZnVuY3Rpb24oYyl7Yy5WaT1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFZoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwoYS5SZChNYXRoLmNlaWwoMUUxMCoKTWF0aC5yYW5kb20oKSkpLHRoaXMuTChhKSwobmV3IGhiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMuT2x8fCh0aGlzLk9sPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5WaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBpYj1jLlZpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLmJqfHwKamI7bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sWmM6ZnVuY3Rpb24oKXt2YXIgYT1tO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLmlrfHxVOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubG4oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7CncubmQoIiMiK2EsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt3LnBtKCl9LGxuOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXtiPWlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYT1bXSxiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5NZCYmKGE9Zi5GbChhLHRoaXMuTWQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5LKGQpKXt0aGlzLkwoZCk7dmFyIGc9bmV3IFYoZCx0aGlzLkYpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLk1kfHwKKHRoaXMuTWQ9W10pLHRoaXMuTWQucHVzaChhW2JdKSxkPW5ldyBVKGgpLHRoaXMuSyhkKXx8KHRoaXMuTChkKSxnPW5ldyBWKGQsdGhpcy5GKSxnLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5PKCl9LG5kOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVthXXx8KHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goYyl9LElvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5UbigpJiYodGhpcy5BZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2NdJiYwPHRoaXMuY2FbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0KMDtkPHRoaXMuY2FbYl1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2JdW2NdW2RdKGEpfX0scG06ZnVuY3Rpb24oKXtpZih0aGlzLlVjKWZvcih2YXIgYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLlVjW2FdLGM9Yi5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmNhW2NdW2RdW2ZdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5JbyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYj1jLnhrfHxsYjtuZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5RaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLm11dGVkPSExO3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LAp1YTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLmlzUGxheWluZygpJiZhLnBhdXNlKCl9KX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUWl8fG1iOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXtmLkpjLnB1c2goeyJbd2lkdGhdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0V2lkdGh9KTtmLkpjLnB1c2goeyJbaGVpZ2h0XSI6dGhpcy5wbGF5ZXIuY29udGFpbmVyLm9mZnNldEhlaWdodH0pO3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDsKYS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuUml8fG5iOyhmdW5jdGlvbihjKXtjLlNpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7CmlmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuSyhoKXx8KHRoaXMuTChoKSwobmV3IG5iKGgsdGhpcy5GKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuTygpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVthLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuU2l8fG9iLHBiPW5ldyBvYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5Wa3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLktjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9ITApO3ZhciBiPXRoaXMuWGcoYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLktjPWIpO2lmKCF0aGlzLklnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHxhLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9CmEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLkluKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGc6ZnVuY3Rpb24oYSl7dGhpcy5oY3x8KHRoaXMuaGM9W10pO3RoaXMuaGMucHVzaChhKX0sdWw6ZnVuY3Rpb24oKXtpZih0aGlzLmhjJiZ0aGlzLmhjLmxlbmd0aClmb3IodmFyIGE9CjA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuS2MpcmV0dXJuIHRoaXMuS2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuWGcoYSkpcmV0dXJuIHRoaXMuS2M9YX19LFhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxJbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2EmJmEucmVzdW1lRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnJlc3VtZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx4aDpmdW5jdGlvbihhKXt0aGlzLmZhPWF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciByYj1jLkxqfHxyYjsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm5hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpP3RoaXMuQygpOih0aGlzLkplfHwodGhpcy5KZT0xKSx0aGlzLkplKyssMTAwPHRoaXMuSmU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTApKX19KX0pKGMpO3ZhciBzYj1jLktqfHxzYjsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9CmEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLksoYyl8fCh0aGlzLkwoYyksKG5ldyBzYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5PKCl9fSl9KShjKTt2YXIgdGI9Yy5Nanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy50cHx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudWt8fHZiOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFBjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxHbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuaWJ8fCh0aGlzLmliPVtdKTt0aGlzLmliLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5qYSgpOnRoaXMubSgiYWRlcnJvciIsCmEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkduKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuUGMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7cmV0dXJufWlmKCF0aGlzLkNjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmliJiZ0aGlzLmliLmxlbmd0aCYmMTx0aGlzLmliLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuaWIubGVuZ3RoLQoxO2IrKykxMDA5IT10aGlzLmliW2JdJiYzMDMhPXRoaXMuaWJbYl0mJjQwMyE9dGhpcy5pYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTt0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkwoYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy52a3x8CnhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk5qfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlcoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy52Zj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuem4oKX0uYmluZCh0aGlzKSw1MDApfSx6bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSwKYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy52ZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy52Zik7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJgphLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx0bzpmdW5jdGlvbigpe3RoaXMudmY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWW09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnVjfHwodGhpcy51Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/Cih3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWW0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnRvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBCYj1jLmNrfHxCYjsoZnVuY3Rpb24oYyl7Yy5laz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLApiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5HbHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuYms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CnRoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSwKMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53bCgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YT10aGlzLkliKCk7CjA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUG0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LFBtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT0KYz8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTmg9YVtlXSk7cmV0dXJuIHRoaXMuTmh9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/YT90aGlzLkliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLk8oKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT1bXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD0KYltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpO2lmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLmdkfHxIYixJYj1uZXcgSGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMubmt8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/dGhpcy5XKGIpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGpxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJgooYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LFpjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFRhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Janx8WDsoZnVuY3Rpb24oYyl7Yy5Iaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy53Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLndmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMud2YmJmMhPXRoaXMud2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8Zi5SKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5zcSksdGhpcy5DKCksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhqfHxZOyhmdW5jdGlvbihjKXtjLkpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy5BZigpOnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRyxLYj1jLkpqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE1iPWMueWt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm9qPQpyLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sY2k6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2IuSXNQYXVzZWQoKSYmYi5QbGF5KCk6KGIuUGxheSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCEwKX0uYmluZCh0aGlzKSwxMCkpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMub2p8fE5iOyhmdW5jdGlvbihjKXtjLm5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2UoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmkoKSl9fSxpOmZ1bmN0aW9uKGEpe3RoaXMuQyhhKX19KX0pKGMpOwp2YXIgT2I9Yy5uanx8T2I7KGZ1bmN0aW9uKGMpe2MucGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLnBqfHxQYixRYj1uZXcgUGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmI9Yy51bnx8UmI7bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxjaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQnJpZFBsYXllciJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7CnZhciBTYj1jLlhpfHxTYjsoZnVuY3Rpb24oYyl7Yy5ZaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT1hKXRoaXMuQ2UoKTtlbHNle2lmKCJvYmplY3QiPT10eXBlb2YgYSlpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnZhc3RFcnJvckNvZGUmJihhPWFbYl0udmFzdEVycm9yQ29kZSk7CmVsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWWl8fFRiOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycyxiO2ZvcihiIGluIGEpe3ZhciBjPW5ldyBTYihhW2JdKTtjLmhhfHx0aGlzLksoYyl8fCh0aGlzLkwoYyksd2luZG93LmJyaWRwbGF5ZXI9YywobmV3IFRiKGMsdGhpcy5GKSkuZigpKX19dGhpcy5PKCl9fSl9KShjKTt2YXIgVWI9Yy5aaXx8VWIsVmI9bmV3IFViKHQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLk9tfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpO2Vsc2V7Zm9yKHZhciBiPWE7YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlUoKX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9CiExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxIbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5lZCYmCih0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkFrfHxYYjsoZnVuY3Rpb24oYyl7Yy56az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2guYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5Gaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwKMzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkZrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XaCgpO3RoaXMubGcoKTt0aGlzLktuKCl9LEtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuRm4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuRm49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy56a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQms9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYS5IbigpLGE9bmV3IFliKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksCmEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBaYj1jLkJrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMud218fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmxrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZG49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGNpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRufSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy4kZChhKX0uYmluZCh0aGlzKSl9LCRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMubGt8fE47KGZ1bmN0aW9uKGMpe2Mua2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLk9lKWlmKHRoaXMuT2J8fAoodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5obygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuT2U9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnhiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTT1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9CmEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmtrfHxPOyhmdW5jdGlvbihjKXtjLm1rPQpwLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fAp0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLkFmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgYmM9Yy5ta3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Paj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuT2p8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRWp8fFo7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE9dGhpcy5SYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5VaD1mLlNiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsCnRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09CmEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxFYTpmdW5jdGlvbigpe3RoaXMuemE9CiEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkRqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Gaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBlYz1jLkZqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5MbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5sanx8aGM7KGZ1bmN0aW9uKGMpe2Mua2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBpYz1jLmtqfHwKaWM7KGZ1bmN0aW9uKGMpe2MubWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLk8oKTtyZXR1cm59aWYoIXRoaXMuSyhhKSl7dGhpcy5MKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5PKCk7cmV0dXJufX10aGlzLk8oKX19KX0pKGMpO3ZhciBqYz1jLm1qfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Ua3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQmUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5NPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfSxCZTpmdW5jdGlvbigpe2lmKCF0aGlzLnlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuTygpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlNrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuT2Q9W107dGhpcy56Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWWo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmJpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy56Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMuemZbZF07dGhpcy5YZihjKSYmKHRoaXMuT2QucHVzaChjKSx0aGlzLmJpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQ9YVtmXSxkPXRoaXMuemZbZF0sdGhpcy5YZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxiaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sdm86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuT2QubGVuZ3RoO2ErKyl0aGlzLk9kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2RbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuWWp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuZGp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5MYyhrLlNvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5MYyhrLmhuKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7aWYoZG9jdW1lbnQuYm9keSl7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSl9ZWxzZSB0YXJnZXRXaW5kb3c9d2luZG93O3ZhciB2Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHdjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLG09ITE7SC5nYSgpO0gueWgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmdhKCksZnVuY3Rpb24oYyl7bXx8CihtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueWgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7Zi5OZSh3aW5kb3csZi5WKDEwKSx7fSk7dmFyIGlhPWYuVigxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLm1ufHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuU2g9dGhpcy5jb25mPXRoaXMuTGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkpkPTA7dGhpcy5oYj0iIjtmLnZiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtibzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5oYj10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFluOmZ1bmN0aW9uKGEpe3RoaXMuTGI9YX0sWG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5oYl0mJnRoaXMuY29uZlt0aGlzLmhiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gY30sJGM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuem0oKSl0aGlzLkxiLmcodGhpcy5MYi5RYyx0aGlzLkxiLnFhLHRoaXMuTGIueWYsZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5MYi5pYyk7ZWxzZSBpZihsLkRiJiYhbC5IaSlsLldtKGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbT1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTsKYyYmbS54bygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTtRPW09bmV3IFFhKG0sdGhpcy5MYixoKTttLlZuKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgcD0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihwPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEocCl9YXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuZ2YmJihkPXRoaXMucGxheWVyLmdmKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTttLmpmKGEsZCxnKTt0aGlzLnBsYXllci5laShtKX19LHptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuSmQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy5KZC5nZXRUaW1lKCksdGhpcy5KZD1hLDNFNTxjPyEwOiExOwp0aGlzLkpkPWE7cmV0dXJuITF9LG5vOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5XZyhhKSk/dGhpcy4kYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfSxtbzpmdW5jdGlvbihhKXtpZighdGhpcy5TaCl7Zi5GZigicG9zdHJvbGwiKTtmLnZiKCJwb3N0cm9sbCIpO3RoaXMuYm8oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuV2coZCkpP3RoaXMuJGMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8KITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfX0sV2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LE5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIua28odGhpcy5tby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5NYSgpfSxUZDpmdW5jdGlvbihhKXtmLnZiKCJtaWRyb2xsIik7Zi5GZigibWlkcm9sbCIpO2lmKCF0aGlzLkhoKXt0aGlzLkhoPSEwO3ZhciBjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLiRjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoPSExfS5iaW5kKHRoaXMpLDFFMykpOgooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LE1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuYW8odGhpcy5UZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5tZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5ubygpO3RoaXMucGxheWVyLm1mJiZ0aGlzLk1uKCk7dGhpcy5ObigpfX19KShjKTt2YXIgZmE9Yy5MaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yz1jLkpvfHx1YztuZXcgdWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoYWl4ZUNlZWRUaGVlc29oaixhaXhlQ2VlZFRoZWVzb2hqKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.194.65 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-224-194-65.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
639feb879746e27c7d840e578e49c0da546a3ad6c16851b8d1bfe085d8f50a37

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Origin
https://player.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:07:59 GMT
Via
1.1 d7e55181ad8192e74c103c6003cd4d9c.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
41
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
379
Last-Modified
Tue, 10 Mar 2020 09:58:40 GMT
Server
AmazonS3
ETag
"5f7074c3f0bef08e9d7c218d0d385fb2"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://player.pcgameshardware.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Amz-Cf-Pop
FRA2-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
MLKc0tf4N0n9AKPoltN6a_SBtWbjYZufjTqEOccvgroQNRCmfJlSEQ==
Expires
Thu, 01 Jan 1970 00:00:00 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 77A0
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvU6RYEDuktOna34RoAk3cg3lU8KLf4YhSTQgEqsNBoBFPAeCYm_wOV4IFhXoiEzpBbgqcbvrEcestOVE_M6yKXLXVrrEUpU2f9ywfxwOiQkFmiA-0uGP_x0aTsAzXoAXPknHUWP8cZlhqv-AnnrDcxjtZchTurcKq8gyX5qPJKOsXMD9H0sX6JYgSwXhgbrmLnEaaEDiEBTn1930vTHMbXqPIzrCh4UUNYgnSK1S1TF021pXdBjfDgsFdX4TC_i4sXTUX9mzjrJx0v2YYdp4k0ezVExjlkGhew9lJ4n0qrm6aty2OCtzHOBoHqftrg9-M&sig=Cg0ArKJSzMeIDSrgf_tAEAE&urlfix=1&adurl=
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
empty

Response headers

timing-allow-origin
*
date
Mon, 16 Mar 2020 20:08:39 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
video.php
media.oadts.com/www/delivery/ Frame 77A0
108 KB
36 KB
Script
General
Full URL
https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
69eaf34725f538776cc9e6c582db28b64bff8f43dd1538650151257a6c977b69

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:39 GMT
Content-Encoding
gzip
Server
lighttpd/1.4.45
Vary
Accept-Encoding
Content-type
text/javascript; charset=UTF-8
Cache-Control
private, max-age=0, no-cache
Content-Length
36077
Expires
Mon, 26 Jul 1997 05:00:00 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 77A0
73 KB
28 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_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1584099738113808"
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
28086
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:39 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 4F2C
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssbQx3ZLLOdtE3PoIG7pOgN8NGCx4otsHfnnU_6SlT9EAct4jzkjQaeyZ4svvlD_BFF5QNPFulioUbqwWpV9179wBfifFzN2yMMcQxV5A1ajY9Y2iWOOzn1JnZ267RQZQc6ltl9-hxf5cIAPauXMF-HA6zHr4PYDV883-H1OolkwR6p1TyWnUuIdh3VBA-qLpLkI6TvFsMwxViVkwI5vLWH36DnS-H3AZDvACv64H9tJEZ7-xqWmzA0KJYyJfrXidcrpdyXPMvPsNRsdRg-fkC5MxWZPHmGqPaP4JUnZLKLi7Gy386GEZLjv9g&sig=Cg0ArKJSzAtpotZ2TGy6EAE&urlfix=1&adurl=
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
empty

Response headers

timing-allow-origin
*
date
Mon, 16 Mar 2020 20:08:39 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
getads.js
js.adscale.de/ Frame 4F2C
23 KB
8 KB
Script
General
Full URL
https://js.adscale.de/getads.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.60.16.116 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-60-16-116.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
ff84301b99c39ed925a311967a1e6c05ff50b711cddd68c8fbb5c8eb4d3bbd0c

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

x-amz-version-id
v.xztckJDFLGV5AQTWz.RPh.DoUrNpt9
Content-Encoding
gzip
Last-Modified
Wed, 11 Mar 2020 22:16:27 GMT
Server
AmazonS3
x-amz-request-id
EA9EAB849377E5EA
ETag
"a412bd6525fb2e5c7ae8479cbc5a5eeb"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Mon, 16 Mar 2020 20:08:39 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
7840
x-amz-id-2
W87loYQilHNE5g20RaKJGB3i9KipYKKMl7D2f+ty+MlTEPec1QOsvKlzyojz3PTynXVR8Qno88A=
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 4F2C
73 KB
28 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_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1584099738113808"
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
28086
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:39 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame BDAB
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssvyKLNM_heuVS2FzlO4KN339NvQ-JYA6Chq7rFoOSEsNqqLEl1vt5hg2ZKmKceorqH1cINrV8asX1f5xOcwrAov0Gd2W9lfFLxdmpG0RebBoeB1MQc1VYj4v-0R1u0Dv6Z7Am5wsz0dHT1x31fO1eTvprhmYbHzaWiZRqm2EMIhfxWMxQffqATWPxDubeKaV39ihqj13pzdCuw4hBIQQGcLKn6Ri3LejMzSD320VjJDpRlx-jMDPLw2qmQ_rNEPCLz-AZ4kr2sh0vmDYAm7n5HMgs17myqIdq0JNvefCsa88xp0AWv2L1cgNE&sig=Cg0ArKJSzGcebjco6ozSEAE&urlfix=1&adurl=
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
216.58.206.2 Mountain View, United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s20-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
empty

Response headers

timing-allow-origin
*
date
Mon, 16 Mar 2020 20:08:39 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
getads.js
js.adscale.de/ Frame BDAB
23 KB
8 KB
Script
General
Full URL
https://js.adscale.de/getads.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.60.16.116 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-60-16-116.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
ff84301b99c39ed925a311967a1e6c05ff50b711cddd68c8fbb5c8eb4d3bbd0c

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

x-amz-version-id
v.xztckJDFLGV5AQTWz.RPh.DoUrNpt9
Content-Encoding
gzip
Last-Modified
Wed, 11 Mar 2020 22:16:27 GMT
Server
AmazonS3
x-amz-request-id
EA9EAB849377E5EA
ETag
"a412bd6525fb2e5c7ae8479cbc5a5eeb"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Mon, 16 Mar 2020 20:08:39 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
7840
x-amz-id-2
W87loYQilHNE5g20RaKJGB3i9KipYKKMl7D2f+ty+MlTEPec1QOsvKlzyojz3PTynXVR8Qno88A=
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame BDAB
73 KB
28 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_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1584099738113808"
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
28086
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:39 GMT
4933062463
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/4933062463
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.194.21.214 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-194-21-214.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:39 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/4933062463
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
4933063195
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/4933063195
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.194.21.214 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-194-21-214.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:39 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/4933063195
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
/
ssl.2.damoh.pcgameshardware.de/cf099a5dff816484aeb01008d8536f011a9ffadd/ Frame FABB
379 B
1 KB
XHR
General
Full URL
https://ssl.2.damoh.pcgameshardware.de/cf099a5dff816484aeb01008d8536f011a9ffadd/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpeGVDZWVkVGhlZXNvaGo9YWl4ZUNlZWRUaGVlc29oanx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnduKWwuRGwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmZiKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5ZbihsKTtiLlhuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmZvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkZoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5GaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlVrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQ24uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnJoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnNqPWE7YS5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5yaFtiXSYmKHRoaXMucmhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy53bygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUWs6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LENuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLkJuKGIuZGF0YSl9LEJuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2goYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ2g6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sT2s6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5SbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sUmw6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxLbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxmaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0saW86ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLmlvKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sQWg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LApBPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPUE7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O0E9QSttJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYShBKSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LGFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCxBPTA7QTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoQSsrKSxnPWIuY2hhckNvZGVBdChBKyspLHE9Yi5jaGFyQ29kZUF0KEErKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxGbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSxBPSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksQT0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPUE7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtQaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxXaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx2bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxTajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx3azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sR2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxnazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlBpKCl8fGIuV2koKXx8Yi52bSgpfHxiLlNqKCl8fGIud2soKXx8Yi5HaigpfHxiLmdrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0saW06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEZsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LG9vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGFoOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy52aShhKSsiOiIrdGhpcy52aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnduPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSxEbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LHBvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5aZyhiKSlyZXR1cm4gdGhpcy5aZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuYWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5mYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuT2soZixiKTtyZXR1cm4gZn0sZmI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sVG06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YuYWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5mYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlRtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5mYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LERtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnNqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnJqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZ249e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucXA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSWw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuR2s9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuWG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkpsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLklrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkhrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuRGk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5rbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EucHA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuVG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5obj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkNsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuZW0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy50anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnFufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5jbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuWm4oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxabjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkVoJiZMLnZvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sa286ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sYW86ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx5cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ybSgpfHx0aGlzLktrKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxLazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxlaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFpoOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0sdHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkRrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy4kbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxmLmtmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnJpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHJpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm9iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGhvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ea30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwkbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxYbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5lanx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaGp8fG9hOyhmdW5jdGlvbihjKXtjLmlqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmlqfHxwYTsoZnVuY3Rpb24oYyl7Yy5qaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMuamp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLk9pfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5ZZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxtcTpmdW5jdGlvbigpe3JldHVybiExfSxZZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApOwp0aGlzLlcoYil9fSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9CmEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7CnJldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQmp8fHNhOyhmdW5jdGlvbihjKXtjLkFqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LG9xOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5yZT0hMTt0aGlzLnRlPTE7dGhpcy5qZD1bXTt0aGlzLkdiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmCmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnRlPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5HYj0hMCk7ZWxzZXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlIGluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciBlPTA7ZTxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmxlbmd0aDtlKyspaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZVtlXS50YWcpe3RoaXMuR2I9ITA7YnJlYWt9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5HYj0hMCk7Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5HYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkdiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7dmFyIGQ9CiJhZFBsYXkgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIik7aWYoZi5SKCJzcGllZ2VsLmRlIikmJi0xIT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpKXthLm9uKCJiZWZvcmVQbGF5IixmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5qdy12aWRlbyIpOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtiLmZvckVhY2goZnVuY3Rpb24oYil7ImF0dHJpYnV0ZXMiIT1iLnR5cGV8fCJzcmMiIT1iLmF0dHJpYnV0ZU5hbWV8fHRoaXMucm58fC0xIT1iLnRhcmdldC5zcmMuaW5kZXhPZigidmNkbjAxIil8fCh0aGlzLnJuPSEwLGIudGFyZ2V0LnNyYz0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iK2YuYWIoYi50YXJnZXQuc3JjKSx6LmJpbmQodGhpcykoKSl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSkub2JzZXJ2ZShiLAp7YXR0cmlidXRlczohMCxjaGlsZExpc3Q6ITAsY2hhcmFjdGVyRGF0YTohMH0pfS5iaW5kKHRoaXMpKTt2YXIgZyxjLGgsej1mdW5jdGlvbigpe2g9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiei0xMCIpO2Zvcih2YXIgYj0wO2I8aC5sZW5ndGg7YisrKWhbYl0uY2xhc3NMaXN0LnJlbW92ZSgiei0xMCIpO2c9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5wYXJlbnRFbGVtZW50O2I9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKTtjPWIuc3R5bGU7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSItIisoYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55LWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWFyZWE9J2hlYWRlci1iYXInXSIpLm9mZnNldEhlaWdodCkrInB4IjtiLnN0eWxlLmxlZnQ9IjBweCI7Yi5zdHlsZS53aWR0aD0iMTAwJSI7Yi5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IiwxNipiLm9mZnNldFdpZHRoLzkrInB4IiwKImltcG9ydGFudCIpO2Iuc3R5bGUuekluZGV4PTFFMztiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Yi5sb2FkKCk7Yi5wbGF5KCl9O2Eub24oImFkQ29tcGxldGUiLGZ1bmN0aW9uKCl7Zy5pbnNlcnRCZWZvcmUoandwbGF5ZXIoKS5nZXRDb250YWluZXIoKSxnLmZpcnN0Q2hpbGQpO2p3cGxheWVyKCkuZ2V0Q29udGFpbmVyKCkuc3R5bGU9Yztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXtpZihnJiZjKXtnLmluc2VydEJlZm9yZShqd3BsYXllcigpLmdldENvbnRhaW5lcigpLGcuZmlyc3RDaGlsZCk7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5zdHlsZT0KYztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSl9Zm9yKGU9MDtlPGQubGVuZ3RoO2UrKylhLm9uKGRbZV0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtlXSYmKHRoaXMucmU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtlXSYmdGhpcy5MaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLiRtJiYhdGhpcy55YSgpJiYodGhpcy5HYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsCjFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5NYjtiJiYoYi5OZCgpLGIueGQoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuVmd8fCh0aGlzLlZnPVtdKTt0aGlzLlZnLnB1c2goe2NvZGU6YS5jb2RlLG1zZzphLm1lc3NhZ2V9KTt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJgowPGEubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnRlJiZ0aGlzLmkoKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuTGU/dGhpcy5MZSsrOnRoaXMuTGU9MTp0aGlzLktlP3RoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLllnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMuQWp8fHRhOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGUmJmUoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLndifHx0aGlzLksoZSl8fHRoaXMuRW0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYuYWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9CmE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy5Ya3x8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mucms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwKJGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5xaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVWg9Zi5TYigxMCk7dGhpcy54aT0hMDt0aGlzLkNjPXRoaXMudmg9ITE7dGhpcy5lbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksCnRoaXMueWIoKSl9LGVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLlIoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuSWE/YS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5JYT90eXBlb2YgYS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlVoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sCmloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmMpe3ZhciBhPXRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy51aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLkxuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sTG46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2lmKGYuUigiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYKKHRoaXMuTWc9YS5hZHMpO3JldHVybiB0aGlzLk1nfSxobDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuTGgoKX0uYmluZCh0aGlzKSl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLAplPXRoaXMuUGMoKTtiJiZlJiYodGhpcy5DY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNjP3RoaXMudygpOih0aGlzLmRhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnZoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PQpifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuTT1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxpbDpmdW5jdGlvbigpe3RoaXMuSWN8fCh0aGlzLkljPSJ1bmtub3duIik7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkcyl7aWYodGhpcy5JYyE9YS5hZHMuc3RhdGUmJih0aGlzLkljPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkljKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlsKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/Cih0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMueWEoKXx8KGF8fCh0aGlzLnhpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLnhpLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuaXF8fCgxMDx0aGlzLmJwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYnArKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5TbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxTbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYKIXRoaXMuY3Ape3RoaXMuY3A9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5xa3x8eWE7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuaWkod2luZG93KTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmlpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGlpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmCihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuU2UoYikpe2Zvcih2YXIgZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJihhPW5ldyB4YShiW2VdKSxhLmhhfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTChhKSwobmV3IHlhKGEsdGhpcy5GKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LE86ZnVuY3Rpb24oKXt0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMuc2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy50Zj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmKGI9YS5wYXJlbnROb2RlKSwhYikpe3RoaXMuVSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0seW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fApiLk5kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy50Zj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LHVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTphLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuVWp8fFI7KGZ1bmN0aW9uKGMpe2MuVGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0KMCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBlPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWU9ITA7ZXx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChlPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5NPXRoaXMuTXx8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuTWw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5NbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLnluKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTsKdGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihjKXtjLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgUihhW2JdKTtlLmhhfHx0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBDYShlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRGE9Yy5Wanx8RGEsRWE9bmV3IERhKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuc218fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmZoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYKKGI9Yi5wYXJlbnROb2RlKX10aGlzLkFuPWEucG9zaXRpb25pbmc7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5zdHlsZS53aWR0aD1hLndpZHRoO2Uuc3R5bGUubWluV2lkdGg9YS53aWR0aDtlLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7ZS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5Bbil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTsKdGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLkFoKHRoaXMuQ2QpO2YuYWYodGhpcy5DZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFsKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy55anx8R2E7KGZ1bmN0aW9uKGMpe2MueGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMueGp8fElhOyhmdW5jdGlvbihjKXtjLnpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9Cm0uaW5yZWFkLGI9Zi5maChhLCJlbGVtZW50SUQiKTtpZihmLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuSyhhKSkpe3RoaXMuTChhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnpqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5ibHx8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT0Ke319Yy51aj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LExrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBDPWMudWp8fEM7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixhLGQsZyxjKXt0aGlzLkZhPWI7dGhpcy4kZz10aGlzLkdpPSExO3RoaXMuTWg9ZDt0aGlzLmppPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmxiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09CmgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuZGYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9Yy52aj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy4kZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5sYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuamk/dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmxiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuR2l8fAoodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMubGIuc2VuZChiKX1jYXRjaChnKXtiPXRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5Iil8fHRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTWgmJnRoaXMuTWgoKX1yZXR1cm4gdGhpcy5sYn19fSkoYyk7dmFyIE1hPWMudmp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuYWo9CmE7YS5wcm90b3R5cGU9e2VvOmZ1bmN0aW9uKGIpe3RoaXMubWU9Yn0sY286ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxRbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt4cDoiQWRDbGlja1RocnUiLHpwOiJBZEVycm9yIixBcDoiQWRTdG9wcGVkIixEcDoiQWRMaW5lYXJDaGFuZ2UiLEVwOiJBZFRhZ1BhcnNlZCIsSHA6IkFkVmlkZW9Db21wbGV0ZSIsS3A6IkFkTG9hZGVkIixMcDoiQWRTa2lwcGVkIixNcDoiQWRTdGFydGVkIixCcDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLENwOiJBZEltcHJlc3Npb24iLHlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7CmZvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5tZSxhW2RdKX0sUG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmxlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmxlKXRoaXMuR2EubGUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5HYSx0aGlzLkdhLmxlW2FdKTt0aGlzLkdhJiZ0aGlzLkdhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkdhLmdldEVycm9yKCl9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5RbigpO3RoaXMuR2EmJnRoaXMuUG4oKX19fSkoYyk7dmFyIE5hPWMuYWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnFiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLnBiPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjsKdGhpcy5lZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy4kZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy55Zj0hMTt0aGlzLmlhPVtdO3RoaXMuV2U9dGhpcy5WYj0iIjt0aGlzLmplPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLm5iPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLmFjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLldiPSIiO3RoaXMuWGI9W107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmpiPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmJiPXtnbG9iYWw6ITEsY2xpZW50OiExLApjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5FYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5ZYz10aGlzLlFkPW51bGx9Yy53aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXI6dGhpcy5wYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZWMsYWR0YWdyZWdleDp0aGlzLnFkLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmZmLHNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLApzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLldlLEhPTUFEX1ZFUklGSUVEOnRoaXMuamUsSE9NQURfQkxPQ0tFRDp0aGlzLmllLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsdGVzdFRhZ3NYSFI6dGhpcy5iZCx0ZXN0M1BDb29raWU6dGhpcy50Yyx0aHJvdHRsZTp0aGlzLlpkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubmMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5IZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmJiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuZWIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLkxmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFduOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkNhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLnFiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMucGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmZmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy56Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5lZj1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5RYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJgoodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLiRlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuV2U9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuamU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5uYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLmJkPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy50Yz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuWmQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLkhnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuV2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5iZT1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYmI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmViPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuTGY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuYWc9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5FYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LApxbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5iYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmJiW2FdJiYxPT10aGlzLmJiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuYmJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmJiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYmJbYV0mJjE9PXRoaXMuYmJbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sWGQ6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIiwKZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuJGsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIixjPSIiLGY9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5jZihiKTtjPXRoaXMuYWEoYik7Zz8odGhpcy5TYygpP2Y9YjpmPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGY9dGhpcy5xYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFifHx0aGlzLnBifHx0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5ibihoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmJtKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD0KaDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5hYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGNmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5TYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj0KYS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxkZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmNmKGIpO3JldHVybiBhfSxibTpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIiwKYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSWg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sYW46ZnVuY3Rpb24oYixhKXt2YXIgZD1mLmFhKGIpLGc9IiIsZz0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZz17fSx6PTA7ejxoLmxlbmd0aDt6Kyspe3ZhciBrPWhbel0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5JaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPQp0aGlzLkloKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmKGIrPXRoaXMucWIpO2lmKHRoaXMucGIpZm9yKHZhciBhIGluIHRoaXMucGIpdGhpcy5wYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5wYlthXSkpO2lmKGYuSmMpZm9yKHZhciBkPTA7ZDxmLkpjLmxlbmd0aDtkKyspe3ZhciBnPWYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuYW4oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmCmEuZW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmNvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxjLGYpe2w9dGhpczt0aGlzLmVmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy55Zj1kO3RoaXMuZWU9Zzt0aGlzLmljPWM7dGhpcy54YT1mfHx7fTt0aGlzLnBsKCk7dGhpcy5TbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlFtKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkdjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZ2I6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxEbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sU206ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuUWMrdGhpcy54ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5HYygpfS5iaW5kKHRoaXMpLCEwKX0sUW06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy54ZSgiY2xpZW50IiwtMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iKwp0aGlzLlNiKCkpO3RoaXMueGEmJnRoaXMueGEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnhhJiZ0aGlzLnhhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGUpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaWM9ITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPQp0aGlzLiRlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5nYih0aGlzLmllKSk7dGhpcy5CYigpO2YuTGMoay54bik7KGE9Zi5VYSh0aGlzLklkKCkpKXx8KGE9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuaXNFbmFibGVkPXRoaXMuQWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPGQuc2VydmVyLmxlbmd0aDtiKyspe3ZhciBhPQpkLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaCh6KXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8CltdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5SKCJ3ZWIuZGUiKXx8Zi5SKCJnbXgubmV0Iil8fGYuUigiZ214LmF0Iil8fGYuUigiZ214LmNoIil8fGYuUigiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5kaShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJgp0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxkaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFRjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucWMoKSksZD10aGlzLmFhKHRoaXMuVmIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGEsdGhpcy55by5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTsKYj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5bzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuV2Y9dGhpcy5BYihkLnN0cmljdCk7dGhpcy5iZT10aGlzLkFiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5lYj10aGlzLkFiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuV2I9ZC50ZXN0aGlkZXx8IiI7dGhpcy5ZYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmJkPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5xYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnBiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fApudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZmY9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnhhLnZwYWlkPXRoaXMuamI7dGhpcy5MZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkVjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmRpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5aZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMuRGI9ZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuS28oKSYmCih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnlmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuRWUoKSx0aGlzLkJiKCkpOnRoaXMuQm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5UZigpKX19LFdtOmZ1bmN0aW9uKGIpe3RoaXMuSGk9ITA7dmFyIGE9ZnVuY3Rpb24oYil7aWYoYj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2IrIj0oW147XSspIikpKXJldHVybiBiWzJdfSgiYWRwX3NlZ3MiKXx8ImUwIixhPXRoaXMuRGIudXJsLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKS5yZXBsYWNlKCJbc2Vnc10iLGVuY29kZVVSSUNvbXBvbmVudChhKSksYT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6YSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLmFiKGEpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07CmYuS2QodGhpcy5xYygpLCJQT1NUIixhLGZ1bmN0aW9uKGEpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaCh6KXtiKCl9YigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YigpfS5iaW5kKHRoaXMpLCEwKX0sQm86ZnVuY3Rpb24oKXt0aGlzLkFvKCk7dGhpcy5DbygpfSxDbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksej1mLlYoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHosZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoeikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2YuYWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChnKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9Zi5CZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLnNhKCJjc3BfIithKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxUZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sWWQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IoYSkpLHRoaXMuQmIoKSx0aGlzLkVlKCkpfSxBbzpmdW5jdGlvbigpe2lmKHRoaXMuV2Ipe3ZhciBhPWYuQmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLkhtKCkpdGhpcy5ZZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTsKZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpO2E9ZH1jYXRjaChnKXt9YT90aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm1pKCl9fWVsc2UgdGhpcy5taSgpfSxSZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy5GbyhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBkPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZigpfSxGbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZj8od2luZG93LmNsZWFyVGltZW91dChmKSwhMCk6ITF9dmFyIGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbWk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuR28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGQ9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlJmKCl9LEdvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7ZigpJiZlKCl9ZnVuY3Rpb24gYygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZSl7ZT09YSYmZigpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPQpjO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sUWY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLktkKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuQWIoYS5jYyk7dGhpcy5UZigpfS5iaW5kKHRoaXMpLHRoaXMua2kuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5raSgpfWVsc2UgdGhpcy5UZigpfSxraTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKTt0aGlzLkVlKCl9LEhtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LEJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJgooYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnhjJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5RZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMuamUpKTt0aGlzLmVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuZWUmJnRoaXMuZWUoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuSGJ9KX0sY2w6ZnVuY3Rpb24oKXt0aGlzLlljPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWWMuaWQ9Zi5WKDEwKTt0aGlzLlljLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5ZYyk7dmFyIGE9dGhpcy5ZYy5jb250ZW50V2luZG93LGU9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD0KZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5RZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5RZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi5BZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYTthPShhPWRvY3VtZW50LmNvb2tpZS5tYXRjaCgvKF58IClhZHBfc2Vncz0oW147XSspLykpP2FbMl06dm9pZCAwO2EmJmYudHJhY2soInN0YXRzX2hkX3NlZ3MiLCJlMCIhPWEsITApfS5iaW5kKHRoaXMpLDJFMyl9LG9sOmZ1bmN0aW9uKCl7aWYodGhpcy5iZSYmdGhpcy5xbSgpKXt2YXIgYT10aGlzLiRsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIiwKYS5qb2luKCJfIiksITApfX0scmk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxLYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrO3RoaXMuSGQ+dGhpcy5waCYmIXRoaXMucWgmJih0aGlzLnFoPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5waCwhMCkpO2E9bmV3IE1hKGEsZSxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtnJiYoYS5HaT0hMCk7YyYmZi5GbSgpJiYoYS4kZz0hMCk7aCYmKGEuamk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLlptfHwKKHRoaXMuWm09ITAsZi5EYSgpfHxmLmZiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihnPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGdbMF0mJihnPWdbMF0pLGcpe2c9ZyYmZy5jaGlsZE5vZGVzJiZnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKwoiOi8vIitnLmhvc3QpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Zi5uZXR3b3JrU3RhdGU9PWYuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9Zi5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFwcGVuZENoaWxkKGUpO2Yuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx6bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5Xby5iaW5kKHRoaXMpLHRoaXMuVm8uYmluZCh0aGlzKSl9LFdvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsOwp0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuS2woKX0sVm86ZnVuY3Rpb24oKXt9LEtsOmZ1bmN0aW9uKCl7Zi5MYyhrLkpsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxFZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuemIubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy56YlthXTsicmVxdWVzdCI9PWUudHlwZSYmZi5mYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWUudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztmLmZiKGUudXJsLGUuYWxpYXMsCm51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxLbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLlpkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPSIiLGQ9MDtkPGE7ZCsrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBlfSxBYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxhYjpmdW5jdGlvbihhKXtmb3IodmFyIGU9IiIsZCxnLGMsZixoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz0KYS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxmPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihjKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZX0sYWE6ZnVuY3Rpb24oYSl7dmFyIGU9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZz0xNDtnLS07KWRbZVtnXV09YVtnXXx8IiI7ZC5xdWVyeUtleT17fTtkW2VbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZSl7YiYmKGQucXVlcnlLZXlbYl09ZSl9KTtyZXR1cm4gZH0sSmY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZShhKXt2YXIgYj0iIixkLGU7Zm9yKGQ9NzswPD1kO2QtLSllPWE+Pj40KmQmMTUsYis9ZS50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZj1BcnJheSg4MCksCmg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpYz1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKylmW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO2M9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGMsNSkrKG4mcHx+biZyKSt1K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9MjA7Mzk+PWc7ZysrKXY9ZChjLDUpKyhuXnBecikrdStmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTQwOzU5Pj1nO2crKyl2PWQoYyw1KSsobiZwfG4mcnxwJnIpK3UrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YywKYz12O2g9aCtjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy53anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLldrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUGE9Yy5Xa3x8UGE7bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUsZCl7dGhpcy5hPWE7YS5jLlA/dGhpcy5oYj1hLmMuUCgpOnRoaXMuaGI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5haS5iaW5kKHRoaXMpLG11dGU6dGhpcy5vZi5iaW5kKHRoaXMpLAp1bm11dGU6dGhpcy5Rby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnNiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLllrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVmQ9e307Zi52YigibmV3QmlnQWRJZCIpO3RoaXMuYWw9Zi5WKDEwKTt0aGlzLk5mPTA7dGhpcy5vZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLm9kPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLm9kPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlJrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuV2M9dGhpcy5VZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoPwpwYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMud2U9ITE7dGhpcy51aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZmk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5mZT10aGlzLiRiPXRoaXMuSWU9dGhpcy55ZD10aGlzLldkPXRoaXMuQ2I9dGhpcy52Yz10aGlzLlBoPXRoaXMuSGU9dGhpcy5EZD10aGlzLkxvPXRoaXMuRmI9dGhpcy5RYj0hMTt0aGlzLkFjPVtdO3RoaXMucGM9e307dGhpcy50bj0yMDA7dGhpcy5kZz10aGlzLmRkPXRoaXMuRmM9dGhpcy5jZz10aGlzLnhmPSExO3RoaXMucWY9e319Yy5xaj1hO2EucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmhiXSYmdGhpcy5jb25mW3RoaXMuaGJdW2FdJiYoZT0KdGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gZX0sc2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLnJvKCk7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0samY6ZnVuY3Rpb24oYSxlLGQsYyl7dGhpcy5GYj1kO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLk5mKyssZi52YigibmV3U21hbGxBZElkIiksdGhpcy5BLm9sKCksYz1sLmdldENvbmZpZygpLGYuT2cmJih0aGlzLkEuV24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsCmtlZXBVUkw6ZSxiaXRyYXRlOmMuUGEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmpiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB4Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt4Yy5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmxvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLkFjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmttKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5iaChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlZsKGIpKSk7cmV0dXJuIGV9LFZsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0sa206ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLnFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmZuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5JbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuc28oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsucnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5zcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLlRvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLlVvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sbG86ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMua2IuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS52cT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlJrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk1rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5uaShlKSl7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5QayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmtiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMua2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuam8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sam86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuUWsodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5RaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMuemkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLm5tKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuZXAoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5mcCgpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5qcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5vcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5FaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmdwKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmhwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0saHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGpwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGZwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuaGkoKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxucDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxscDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxvcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LEVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LGVwOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkVpKCEwKX0sTWs6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBkPWIuYWEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLmFwLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5DaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm5pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlpvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLllvKCk7dGhpcy56aSgpO3RoaXMuQmcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5laSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuZWImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuR2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LEprOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZ2goYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5wbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuSmsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5rbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS53aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlpoKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkpoKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sYXA6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQ2k6ZnVuY3Rpb24oKXtpZih0aGlzLkxvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5PbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmtiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLndpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi5haCh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx0aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxPbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudWl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudGkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnRpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuaGkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5lYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuZWImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy51aT1hKX0sZ2k6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxybzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0saGk6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHNvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5lYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5lYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMubG0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLkRtKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkhrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGQpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkVsKHRoaXMuYi5PYSxhKX1jYXRjaCh6KXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5MayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLk5rKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5ZaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlloKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxOazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFloOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sdW86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sbG06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxFbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxabzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sWW86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuYWgoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnBpLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5maTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxhaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuTW0oKSYmdGhpcy5MbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLlBvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LE1tOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuamJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5qYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5qYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxMbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sYW06ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LFBvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmYudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsZS5hdmFpbGFibGUsITApO2lmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7Zi50cmFjaygic3RhdHNfd3RfY2F0Y2giLCIiLCEwKX10aGlzLnhkKCl9dmFyIGU9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzLGQ9dGhpcy5hbSgpO3RoaXMuRmM9dGhpcy5XYz10aGlzLmRkPXRoaXMuZGc9ITA7cmV0dXJuIGU/KGYuZmIoImh0dHBzOi8vd3d3LndlbGVjdC5kZS9hcGkvdjEvcHJlZmxpZ2h0L2J5X2FsaWFzLyIrZSwiZGV3ZWxlY3R3d3d3ZWxlY3RkZSIse30sYS5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSx0aGlzLkEpLAohMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMudW8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSx0aGlzLnRuKToodGhpcy5XZD0hMCx0aGlzLmEuVmUoKSx0aGlzLmEuVW4oKSx0aGlzLm9jPSExLGE9dGhpcy5iLnN8fHt9LHRoaXMuSGV8fChhLm5vQ29tcGxldGVRdWFydGlsZT0hMCksZi5vKGsueWwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLlJlKCkuWmgoKSl9LFJlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LEJnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGYuYWYodGhpcy52aWRlbyxhKT90aGlzLmFpKCk6dGhpcy5OZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZygpfS5iaW5kKHRoaXMpLDEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9CnRoaXMuYi5yYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLkFjJiYwPHRoaXMuQWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLkFjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHU6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLmFsKyItIit0aGlzLk5mO3RoaXMuYiYmdGhpcy5iLmhoJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYi5oaCgpKTtyZXR1cm4gYX0sUmc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnFqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYT1jLkhsfHxSYTtuZXcgUmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGQsYyl7dGhpcy5vcHRpb25zPWN8fHt9O2U9ZDt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5vYT1udWxsO3RoaXMuWT1bXTt0aGlzLko9bnVsbDt0aGlzLnpjPXRoaXMuQmM9ITE7dGhpcy5iYT0iIjt0aGlzLmJnPSExO3RoaXMuc2g9IiI7YyYmYy5lbXB0eT90aGlzLlZtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBiPTAsZSxkPVtdO2Mub2s9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWYuQmQoKSxiO2I9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgZD0iIjtiLnF1ZXJ5S2V5JiYoZD1iLnF1ZXJ5S2V5Lmh2cCk7ZCYmKHRoaXMub3B0aW9ucy52cGFpZD0KITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwudmEobC5YZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFmLkRhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxjPWZ1bmN0aW9uKCl7cmV0dXJuIGUoKSYmKGYuUigibWFydGhhc3Rld2FydC5jb20iKXx8Zi5SKCJmYW5kb20uY29tIil8fGYuUigiZ2lnYS5kZSIpfHxmLlIoImtpbm8uZGUiKXx8Zi5SKCJzcGllbGV0aXBwcy5kZSIpfHxmLlIoImRlc2lyZWQuZGUiKSl9LmJpbmQodGhpcyk7aWYoZSgpfHxjKCkpe3ZhciBoPWYuTmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgYz1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYKIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4oZi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG49ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihjKCl8fGsoKXx8bSgpfHwiYXBwc3BvdCI9PQpkKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlhkKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLlhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixmLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuWGQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5VbS5iaW5kKHRoaXMpLHRoaXMuUm0uYmluZCh0aGlzKSl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuTmIpdHJ5e3ZhciBlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09ZS5maXJzdENoaWxkfWNhdGNoKGMpe2RbYl09e319ZWxzZSBkLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLk5ifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5OYnx8dGhpcy5KbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC56bygpKXRyeXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Yy5sZW5ndGgmJihjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2NbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtlW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspZC5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChkKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxKbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGQ9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZT0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZT1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZSYmTWF0aC5hYnMoZS1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWQ/ITA6ITF9LFVtOmZ1bmN0aW9uKGEpe3RoaXMuRW4oYSk7dHJ5e3RoaXMub2E9YS5yZXNwb25zZVhNTCx0aGlzLm9hfHwodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuc2g9YS51cmxDYWxsZWQ7aWYodGhpcy5ZLmxlbmd0aCl0aGlzLlZjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUmEodi5mZCx7ZXJyb3I6dGhpcy5iZz8KRi5uZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuVWEodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxWbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuWS5sZW5ndGg/dGhpcy5WYygpOnRoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKX0sUm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUmEodi5mZyx7ZGVwdGg6Yn0pKX0sVmM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5ObSgpP3RoaXMuSG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5taCgpLGUse0FkU3lzdGVtOnRoaXMuVWwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5SYSh2LmlnKSk6KGI9MCx0aGlzLlJvKCkmJnRoaXMudWYodGhpcy5CbCgpKSl9LHBmOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5wZigpfSxKaDpmdW5jdGlvbigpe3RoaXMuemM/KHRoaXMuemM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQuSmgoKX0sUm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FbygpP3RoaXMuRG8oKT8hMDooLTEhPXRoaXMuTmMoKT90aGlzLnJhKHRoaXMuUmEodi5oZSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSksITEpOih0aGlzLnJhKHRoaXMuUmEodi5mZCxGLmhnKSksITEpfSx1ZjpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5nZXx8KGEuZ2U9W10pO2EuZ2UucHVzaCh0aGlzLnNoKTthLk9hPWEuT2EuY29uY2F0KHRoaXMubGYoKSk7YS5FYj1hLkViP2EuRWI6dGhpcy5CYzsKYS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7dGhpcy5wYXJlbnQudWYoYSl9LEJsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmR1cmF0aW9uPXRoaXMuTmMoKTthLk49dGhpcy5qaCgpO2EucmI9dGhpcy5XbCgpO2EuQ3E9W107YS5vcmlnaW49dGhpczthLnM9dGhpcy5UbCgpO2EuTWY9dGhpcy5qbShhLmR1cmF0aW9uKTthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fAoodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2lmKCF0aGlzLkomJnRoaXMub2EmJnRoaXMub2EuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5vYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmQubGVuZ3RoJiZmLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZSl7fX10aGlzLkomJihhLk9hPWEuZXJyb3IuY29kZSE9di5oZS5jb2RlP2EuT2EuY29uY2F0KHRoaXMuWGwoKSk6YS5PYS5jb25jYXQodGhpcy5mbSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmtjJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGtjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmtjKGEpfSxVZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxIbzpmdW5jdGlvbigpe3JldHVybiBiPGV9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5qaCgpLmxlbmd0aH0sRG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLk5jKCl9LFNmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LGxpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5TZigpJiYoYT0hMCk7cmV0dXJuIGF9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuYmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5iYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLmJhPSJVTktOT1dOIn10cnl7dGhpcy5iZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChlKXt9fSxObTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMubWgoKS5sZW5ndGh9LG1oOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUWUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIkFkU3lzdGVtIil9LGxmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1lJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiQ29tcGFuaW9uIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUpKXJldHVybn1jYXRjaChkKXt9aWYoYSYmIXRoaXMuemgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxlLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMudGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSx6aDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxYbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0samg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxQYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFVwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnRiKGFbZF0pfSk7dmFyIGU9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBjPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5QYSktTWF0aC5hYnMoZS1iLlBhKX0pLGY9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZS1hLlBhKS1NYXRoLmFicyhlLWIuUGEpfSksYj1jLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LFRsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7CmZvcih2YXIgYj0iIixkPSExLGU9W10sYj0hMSxjPSIiLGY9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2M9Yj10aGlzLkdkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWUucHVzaChkKTtmLnB1c2goYyl9MTxhLmxlbmd0aD8oYj1lLGg9Yyk6KGI9ZCxoPWYpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxOYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sam06ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxlPSExO3RyeXtkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZT1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5vbyhlLAphKSwwPmImJihiPSExKX1jYXRjaChjKXtiPSExfXJldHVybiBifSxRZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMudGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx0YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkdkKGEpOiIifSxHZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5va3x8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLnBufHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk49W107dGhpcy5yYj0iIjt0aGlzLnM9dGhpcy55Yz10aGlzLkViPSExO3RoaXMuWGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlllPSIifWMuV2o9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sZG06ZnVuY3Rpb24oKXtpZighdGhpcy5YZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm9hKXt2YXIgYT10aGlzLm9yaWdpbi5vYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZT0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGU9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1lLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLlhlPWFbZF0pfXJldHVybiB0aGlzLlhlfSwKaGg6ZnVuY3Rpb24oKXtpZih0aGlzLlllKXJldHVybiB0aGlzLlllO3ZhciBhPSIiOyhhPXRoaXMuZG0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlllPWF9LG5tOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTi5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5OW2VdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Xanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5OaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHY9e29lOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE5hOiJYTUxfUEFSU0VfRVJST1IifSxlZzp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLAptZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGZkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGlnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE5hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKTmE6IkxPQURfRVJST1IifSxrZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx1cDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixOYToiTUVESUFGSUxFX0VSUk9SIn0saGU6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTmE6IkRVTU1ZX0FEIn19LEY9e2dnOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTmE6Ik5PX0FEUyJ9LGhnOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixOYToiTk9fTUVESUFGSUxFUyJ9LHZwOnt0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG5lOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMucGt8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5lcnJvcj1hO3RoaXMuQWQ9ZTt0aGlzLk9hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuZ2p8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPQpjLm5ufHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuJGg9YTt0aGlzLnZpZGVvPWU7dGhpcy5jZT1bXTt0aGlzLlhoPVtdO3RoaXMucmY9W107dGhpcy4kbz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSSgpfWMud3A9YTthLnByb3RvdHlwZT17STpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy4kaC5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLiRoW2FdLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsCmM9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO3ZhciBoPWYuY29udGVudFdpbmRvdztoLnJxPXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkpuLmJpbmQodGhpcyl9O3ZhciBrPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2sub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2guZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtoLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7CnRoaXMuY2UucHVzaCh7c3JjOmQsZnJhbWU6Zix2bjpjLHZlbmRvcjplLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5yZi5sZW5ndGg7ZSsrKXt2YXIgZD10aGlzLnJmW2VdO2QudHlwZT09PWEmJmQuZmwodGhpcy5ZbChhKSl9fSxZbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntBcTohMCx6cTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntucToidmlkZW8iLERxOiJqc0N1c3RvbSIsRXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxGcToxLFZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsCmVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LG1tOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5jZS5sZW5ndGg7ZSsrKWlmKHRoaXMuY2VbZV0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5jZVtlXS52bjtyZXR1cm4iIn0sUm46ZnVuY3Rpb24oYSxlKXt0aGlzLlhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLm1tKGUpLHZlbmRvcjplfSk7dGhpcy5xbygpfSxKbjpmdW5jdGlvbihhLGUpeyJ2aWRlbyI9PT1hP3RoaXMuJG8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuemcoYSxlKX0uYmluZCh0aGlzKSk6dGhpcy56ZyhhLGUpfSx6ZzpmdW5jdGlvbihhLGUpe3RoaXMucmYucHVzaCh7dHlwZTphLApmbDplLHhxOiExfSl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5YaC5tYXAoZnVuY3Rpb24oYSl7YS5HbXx8KGEucXEoe2FkU2Vzc2lvbklkOmYuVigyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuQnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLkdtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuUGx8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMuc2I9YS5laCgpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9CmYuVigxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy5BZz0hMTt0aGlzLmZjPVtdfWMuY2o9YTthLnByb3RvdHlwZT17U2w6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxmPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGY9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6Zix5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5TbChhKTtmb3IodmFyIGM9MCxkPTAsZj0hMSxoPXRoaXMudW0oYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LHhvOmZ1bmN0aW9uKCl7dGhpcy5BZz0hMH0sd2k6ZnVuY3Rpb24oKXt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2YubyhrLkhjLHRoaXMuYy5sKCkpfSxVbjpmdW5jdGlvbigpe3RoaXMuQWd8fCh0aGlzLmMucGxheSgpLGYubyhrLndkLHRoaXMuYy5sKCkpKX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuc2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLnNiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5zYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5zYik7dGhpcy5jLlpjJiZ0aGlzLmMuWmMoKT90aGlzLmMuZWgoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSx1bTpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LFFsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gY30sbWM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5RbCh0aGlzLnNiKTtpZihjLnghPXRoaXMuSGEueHx8Yy55IT10aGlzLkhhLnl8fGMucG9zaXRpb24hPXRoaXMuSGEucG9zaXRpb258fGMud2lkdGghPXRoaXMuSGEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLkhhLmhlaWdodHx8YSl7aWYoMDx0aGlzLkhhLndpZHRoJiYwPHRoaXMuSGEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5WZSgpO3JldHVybn10aGlzLkhhPWM7dGhpcy5jLlpjKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD0KYy54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuZmMubGVuZ3RoO2ErKyl0aGlzLmZjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWYuUGYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0seWc6ZnVuY3Rpb24oYSl7dGhpcy5mY3x8KHRoaXMuZmM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmZjLnB1c2goYSl9LFZlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CnRoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1mLlYoMTApO00uY29udHJvbHM9ITA7RC5wdXNoKE0pfXZhciBKPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy50bXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5SZChhKTt0aGlzLlBnKCl9LFJkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxQZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVGEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxaZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sbGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLlRhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTsKdmFyIGJiPWMuUWp8fGJiOyhmdW5jdGlvbihjKXtjLlBqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuZGM9dGhpcy5kY3x8ITE7dGhpcy5xZz10aGlzLnNnPXRoaXMud2g9dGhpcy56YT10aGlzLlVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTmwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMud2gmJnRoaXMuR2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5NYjthJiZhLm9jJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpO3RoaXMuRGcoKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5kYyl7dGhpcy51ZCgpO2lmKCF0aGlzLlVmJiYhdGhpcy51ZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuVWYmJnRoaXMucWcmJiF0aGlzLnNnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0sdWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtoKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LGtoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZzpmdW5jdGlvbigpe2lmKHRoaXMudWQoKSl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLnNnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMucWc9YS5TcH10aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLmtxKCk6ITF9LE5jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5OYygpOi0xfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sTmw6ZnVuY3Rpb24oYSxiKXt0aGlzLmRjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuZGN8fDMwMj09dGhpcy5kYz90aGlzLnphPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5kYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuemE/KHRoaXMudygpLHRoaXMuamEoKSk6YS5aZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmdtKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBjYj1jLlBqfHxjYjsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEltOmZ1bmN0aW9uKCl7d2luZG93Lk9PLiRqLkVrLkNrP3dpbmRvdy5PTy4kai5Fay5Day5RcChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLlNlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgY2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMuUmp8fGRiLGViPW5ldyBkYih0KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5zbnx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5oYT0hMTt0aGlzLm5oKCl9LG5oOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTsKYSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTWE6ZnVuY3Rpb24oKXt0aGlzLlRoKCl9LFRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcyksCjEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVWl8fGdiOyhmdW5jdGlvbihjKXtjLlRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRGUoYS5hZEVycm9yRXZlbnRzW2JdKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5EZShhKX0uYmluZCh0aGlzKSk7CmEucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHNbYl0pfS5iaW5kKHRoaXMpKTthLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYjsoZnVuY3Rpb24oYyl7Yy5WaT1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFZoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwoYS5SZChNYXRoLmNlaWwoMUUxMCoKTWF0aC5yYW5kb20oKSkpLHRoaXMuTChhKSwobmV3IGhiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMuT2x8fCh0aGlzLk9sPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5WaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBpYj1jLlZpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLmJqfHwKamI7bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sWmM6ZnVuY3Rpb24oKXt2YXIgYT1tO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLmlrfHxVOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubG4oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7CncubmQoIiMiK2EsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt3LnBtKCl9LGxuOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXtiPWlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYT1bXSxiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5NZCYmKGE9Zi5GbChhLHRoaXMuTWQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5LKGQpKXt0aGlzLkwoZCk7dmFyIGc9bmV3IFYoZCx0aGlzLkYpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLk1kfHwKKHRoaXMuTWQ9W10pLHRoaXMuTWQucHVzaChhW2JdKSxkPW5ldyBVKGgpLHRoaXMuSyhkKXx8KHRoaXMuTChkKSxnPW5ldyBWKGQsdGhpcy5GKSxnLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5PKCl9LG5kOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVthXXx8KHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goYyl9LElvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5UbigpJiYodGhpcy5BZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2NdJiYwPHRoaXMuY2FbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0KMDtkPHRoaXMuY2FbYl1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2JdW2NdW2RdKGEpfX0scG06ZnVuY3Rpb24oKXtpZih0aGlzLlVjKWZvcih2YXIgYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLlVjW2FdLGM9Yi5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmNhW2NdW2RdW2ZdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5JbyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYj1jLnhrfHxsYjtuZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5RaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLm11dGVkPSExO3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LAp1YTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLmlzUGxheWluZygpJiZhLnBhdXNlKCl9KX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUWl8fG1iOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXtmLkpjLnB1c2goeyJbd2lkdGhdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0V2lkdGh9KTtmLkpjLnB1c2goeyJbaGVpZ2h0XSI6dGhpcy5wbGF5ZXIuY29udGFpbmVyLm9mZnNldEhlaWdodH0pO3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDsKYS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuUml8fG5iOyhmdW5jdGlvbihjKXtjLlNpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7CmlmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuSyhoKXx8KHRoaXMuTChoKSwobmV3IG5iKGgsdGhpcy5GKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuTygpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVthLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuU2l8fG9iLHBiPW5ldyBvYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5Wa3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLktjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9ITApO3ZhciBiPXRoaXMuWGcoYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLktjPWIpO2lmKCF0aGlzLklnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHxhLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9CmEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLkluKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGc6ZnVuY3Rpb24oYSl7dGhpcy5oY3x8KHRoaXMuaGM9W10pO3RoaXMuaGMucHVzaChhKX0sdWw6ZnVuY3Rpb24oKXtpZih0aGlzLmhjJiZ0aGlzLmhjLmxlbmd0aClmb3IodmFyIGE9CjA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuS2MpcmV0dXJuIHRoaXMuS2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuWGcoYSkpcmV0dXJuIHRoaXMuS2M9YX19LFhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxJbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2EmJmEucmVzdW1lRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnJlc3VtZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx4aDpmdW5jdGlvbihhKXt0aGlzLmZhPWF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciByYj1jLkxqfHxyYjsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm5hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpP3RoaXMuQygpOih0aGlzLkplfHwodGhpcy5KZT0xKSx0aGlzLkplKyssMTAwPHRoaXMuSmU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTApKX19KX0pKGMpO3ZhciBzYj1jLktqfHxzYjsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9CmEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLksoYyl8fCh0aGlzLkwoYyksKG5ldyBzYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5PKCl9fSl9KShjKTt2YXIgdGI9Yy5Nanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy50cHx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudWt8fHZiOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFBjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxHbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuaWJ8fCh0aGlzLmliPVtdKTt0aGlzLmliLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5qYSgpOnRoaXMubSgiYWRlcnJvciIsCmEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkduKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuUGMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7cmV0dXJufWlmKCF0aGlzLkNjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmliJiZ0aGlzLmliLmxlbmd0aCYmMTx0aGlzLmliLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuaWIubGVuZ3RoLQoxO2IrKykxMDA5IT10aGlzLmliW2JdJiYzMDMhPXRoaXMuaWJbYl0mJjQwMyE9dGhpcy5pYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTt0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkwoYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy52a3x8CnhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk5qfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlcoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy52Zj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuem4oKX0uYmluZCh0aGlzKSw1MDApfSx6bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSwKYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy52ZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy52Zik7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJgphLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx0bzpmdW5jdGlvbigpe3RoaXMudmY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWW09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnVjfHwodGhpcy51Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/Cih3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWW0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnRvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBCYj1jLmNrfHxCYjsoZnVuY3Rpb24oYyl7Yy5laz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLApiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5HbHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuYms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CnRoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSwKMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53bCgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YT10aGlzLkliKCk7CjA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUG0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LFBtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT0KYz8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTmg9YVtlXSk7cmV0dXJuIHRoaXMuTmh9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/YT90aGlzLkliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLk8oKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT1bXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD0KYltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpO2lmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLmdkfHxIYixJYj1uZXcgSGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMubmt8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/dGhpcy5XKGIpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGpxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJgooYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LFpjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFRhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Janx8WDsoZnVuY3Rpb24oYyl7Yy5Iaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy53Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLndmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMud2YmJmMhPXRoaXMud2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8Zi5SKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5zcSksdGhpcy5DKCksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhqfHxZOyhmdW5jdGlvbihjKXtjLkpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy5BZigpOnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRyxLYj1jLkpqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE1iPWMueWt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm9qPQpyLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sY2k6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2IuSXNQYXVzZWQoKSYmYi5QbGF5KCk6KGIuUGxheSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCEwKX0uYmluZCh0aGlzKSwxMCkpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMub2p8fE5iOyhmdW5jdGlvbihjKXtjLm5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2UoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmkoKSl9fSxpOmZ1bmN0aW9uKGEpe3RoaXMuQyhhKX19KX0pKGMpOwp2YXIgT2I9Yy5uanx8T2I7KGZ1bmN0aW9uKGMpe2MucGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLnBqfHxQYixRYj1uZXcgUGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmI9Yy51bnx8UmI7bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxjaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQnJpZFBsYXllciJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7CnZhciBTYj1jLlhpfHxTYjsoZnVuY3Rpb24oYyl7Yy5ZaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT1hKXRoaXMuQ2UoKTtlbHNle2lmKCJvYmplY3QiPT10eXBlb2YgYSlpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnZhc3RFcnJvckNvZGUmJihhPWFbYl0udmFzdEVycm9yQ29kZSk7CmVsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWWl8fFRiOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycyxiO2ZvcihiIGluIGEpe3ZhciBjPW5ldyBTYihhW2JdKTtjLmhhfHx0aGlzLksoYyl8fCh0aGlzLkwoYyksd2luZG93LmJyaWRwbGF5ZXI9YywobmV3IFRiKGMsdGhpcy5GKSkuZigpKX19dGhpcy5PKCl9fSl9KShjKTt2YXIgVWI9Yy5aaXx8VWIsVmI9bmV3IFViKHQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLk9tfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpO2Vsc2V7Zm9yKHZhciBiPWE7YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlUoKX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9CiExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxIbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5lZCYmCih0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkFrfHxYYjsoZnVuY3Rpb24oYyl7Yy56az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2guYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5Gaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwKMzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkZrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XaCgpO3RoaXMubGcoKTt0aGlzLktuKCl9LEtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuRm4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuRm49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy56a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQms9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYS5IbigpLGE9bmV3IFliKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksCmEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBaYj1jLkJrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMud218fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmxrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZG49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGNpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRufSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy4kZChhKX0uYmluZCh0aGlzKSl9LCRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMubGt8fE47KGZ1bmN0aW9uKGMpe2Mua2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLk9lKWlmKHRoaXMuT2J8fAoodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5obygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuT2U9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnhiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTT1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9CmEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmtrfHxPOyhmdW5jdGlvbihjKXtjLm1rPQpwLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fAp0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLkFmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgYmM9Yy5ta3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Paj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuT2p8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRWp8fFo7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE9dGhpcy5SYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5VaD1mLlNiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsCnRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09CmEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxFYTpmdW5jdGlvbigpe3RoaXMuemE9CiEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkRqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Gaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBlYz1jLkZqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5MbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5sanx8aGM7KGZ1bmN0aW9uKGMpe2Mua2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBpYz1jLmtqfHwKaWM7KGZ1bmN0aW9uKGMpe2MubWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLk8oKTtyZXR1cm59aWYoIXRoaXMuSyhhKSl7dGhpcy5MKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5PKCk7cmV0dXJufX10aGlzLk8oKX19KX0pKGMpO3ZhciBqYz1jLm1qfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Ua3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQmUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5NPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfSxCZTpmdW5jdGlvbigpe2lmKCF0aGlzLnlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuTygpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlNrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuT2Q9W107dGhpcy56Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWWo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmJpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy56Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMuemZbZF07dGhpcy5YZihjKSYmKHRoaXMuT2QucHVzaChjKSx0aGlzLmJpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQ9YVtmXSxkPXRoaXMuemZbZF0sdGhpcy5YZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxiaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sdm86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuT2QubGVuZ3RoO2ErKyl0aGlzLk9kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2RbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuWWp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuZGp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5MYyhrLlNvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5MYyhrLmhuKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7aWYoZG9jdW1lbnQuYm9keSl7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSl9ZWxzZSB0YXJnZXRXaW5kb3c9d2luZG93O3ZhciB2Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHdjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLG09ITE7SC5nYSgpO0gueWgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmdhKCksZnVuY3Rpb24oYyl7bXx8CihtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueWgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7Zi5OZSh3aW5kb3csZi5WKDEwKSx7fSk7dmFyIGlhPWYuVigxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLm1ufHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuU2g9dGhpcy5jb25mPXRoaXMuTGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkpkPTA7dGhpcy5oYj0iIjtmLnZiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtibzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5oYj10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFluOmZ1bmN0aW9uKGEpe3RoaXMuTGI9YX0sWG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5oYl0mJnRoaXMuY29uZlt0aGlzLmhiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gY30sJGM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuem0oKSl0aGlzLkxiLmcodGhpcy5MYi5RYyx0aGlzLkxiLnFhLHRoaXMuTGIueWYsZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5MYi5pYyk7ZWxzZSBpZihsLkRiJiYhbC5IaSlsLldtKGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbT1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTsKYyYmbS54bygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTtRPW09bmV3IFFhKG0sdGhpcy5MYixoKTttLlZuKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgcD0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihwPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEocCl9YXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuZ2YmJihkPXRoaXMucGxheWVyLmdmKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTttLmpmKGEsZCxnKTt0aGlzLnBsYXllci5laShtKX19LHptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuSmQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy5KZC5nZXRUaW1lKCksdGhpcy5KZD1hLDNFNTxjPyEwOiExOwp0aGlzLkpkPWE7cmV0dXJuITF9LG5vOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5XZyhhKSk/dGhpcy4kYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfSxtbzpmdW5jdGlvbihhKXtpZighdGhpcy5TaCl7Zi5GZigicG9zdHJvbGwiKTtmLnZiKCJwb3N0cm9sbCIpO3RoaXMuYm8oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuV2coZCkpP3RoaXMuJGMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8KITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfX0sV2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LE5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIua28odGhpcy5tby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5NYSgpfSxUZDpmdW5jdGlvbihhKXtmLnZiKCJtaWRyb2xsIik7Zi5GZigibWlkcm9sbCIpO2lmKCF0aGlzLkhoKXt0aGlzLkhoPSEwO3ZhciBjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLiRjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoPSExfS5iaW5kKHRoaXMpLDFFMykpOgooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LE1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuYW8odGhpcy5UZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5tZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5ubygpO3RoaXMucGxheWVyLm1mJiZ0aGlzLk1uKCk7dGhpcy5ObigpfX19KShjKTt2YXIgZmE9Yy5MaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yz1jLkpvfHx1YztuZXcgdWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoYWl4ZUNlZWRUaGVlc29oaixhaXhlQ2VlZFRoZWVzb2hqKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.12.56 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.56.12.76.144.clients.your-server.de
Software
AmazonS3 /
Resource Hash
639feb879746e27c7d840e578e49c0da546a3ad6c16851b8d1bfe085d8f50a37

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Origin
https://player.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:39 GMT
Connection
keep-alive
Content-Length
379
Last-Modified
Tue, 10 Mar 2020 09:58:40 GMT
Server
AmazonS3
Etag
"5f7074c3f0bef08e9d7c218d0d385fb2"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://player.pcgameshardware.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
de38-homad-1
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.pcgameshardware.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
Thu, 01 Jan 1970 00:00:00 GMT
truncated
/ Frame F616
207 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d69499e802bf2565858402f476ed890de02c5962671315fbd010cf5dad70a0ff

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
lb35.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb35.s400.meetrics.net/data?/hQk4IRyAALlnFEUkzFUCP9CAAAAAAAB7HYAPBAAFAA7HYTUOaAPAAAAAAMMBBUOaAZAAAOA55A55A85B55A58E55A55AFA54A4xAxBErUOaAPgBAAAAMMBHUOaAPBAAQNALEAHbosAPAAAVSAwDAHl5/APsEAAAAfQBKUOaASksFaGjAAAAAAAAAAAAEAAA7HYAAAAAAAHAklFzrF0vFwBFQAhyF0pFrlFsfFz0FhuFkhFykFeAkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFDAx4ExBEMAxzA4yAz5Ax3A3wAzwAGAkpFylFj0FAAAAIAy4A23A51A31AIA53A22Aw3Az1ALAv1F0fFvmFfwFhnFlBFIA53A22Aw3Az1AIA53A22Aw3Az1AJBlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEv1F0fFvmFfwFhnFlBFdAAAMMBxYAAAAFAAAUOaAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFNpSCTA
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 16-Mar-20 20:08:38 GMT
data
lb35.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb35.s400.meetrics.net/data?/hQk4JSyAA/k0FWYmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A23Ax0A3yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFmwEshFjlF9hEy0FprFlsFfzF0hFukFhyFkmBhwFi9BihFuuFlyFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A40Az4A5zAx2A05AwmEvyFthF0jFvkFl9BTrF5zFjyFhwFlyFfxB2wAmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA45Aw0AwxAy4AmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9zEr5FmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21Aw1AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A3zA43AwxAmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21AxyAmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF95A32A2wA3zA1mAjpFk9BxzA4yAz5Ax3A3wAzwAmzEp6Fl9Bx4ExmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF95A32A2wA3zA1mAhwFk9B53A22Aw3Az1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA23AwyAmvFytFh0FjvFklF9RE1hFspF05FGvFv0FlyFmhEk2F9yA4xAy1A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A14A31Aw5A0mAjpFk9BxzA4yA1zA41A22A55AmzEp6Fl9B53Aw4Ey1A1mAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9wE1iFwlFymFvyFtmBhwFj9B04A41A43A1wA50AmhEwkF90A44A14A31Aw5A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEw1FiwFlyFmvFytFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA5wA30ATkzFARksFAQtjFRk4lgA
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 16-Mar-20 20:08:38 GMT
impr
gaa.adscale.de/ Frame F616
132 B
368 B
Script
General
Full URL
https://gaa.adscale.de/impr?v=2&sid=90e57a0d-63b6-46fc-9391-c09b4cf40ea0&nu=0&t=1584389319080&iFrame&ssl=1&pos=below&ws=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&uuid=1497ca77-fcad-4744-bd97-fde26d197f94
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/getads.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.185.214.82 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-185-214-82.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
ba851b8684e487da91cfe727f0a9ed919db4e8958ee66e9d50723ed89a9fa560

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

status
200
date
Mon, 16 Mar 2020 20:08:39 GMT
cache-control
no-cache
p3p
CP=NOI PSA OUR
x-robots-tag
none
content-length
132
content-type
text/javascript
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
access-control-allow-origin
*
date
Mon, 16 Mar 2020 20:08:39 GMT
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
57 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.163.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-52-28-163-206.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
access-control-allow-origin
*
date
Mon, 16 Mar 2020 20:08:39 GMT
hic_qos
ssl.1.damoh.pcgameshardware.de/ Frame FABB
24 B
356 B
Script
General
Full URL
https://ssl.1.damoh.pcgameshardware.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpeGVDZWVkVGhlZXNvaGo9YWl4ZUNlZWRUaGVlc29oanx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnduKWwuRGwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmZiKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5ZbihsKTtiLlhuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmZvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkZoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5GaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlVrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQ24uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnJoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnNqPWE7YS5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5yaFtiXSYmKHRoaXMucmhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy53bygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUWs6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LENuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLkJuKGIuZGF0YSl9LEJuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2goYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ2g6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sT2s6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5SbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sUmw6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxLbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxmaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0saW86ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLmlvKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sQWg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LApBPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPUE7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O0E9QSttJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYShBKSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LGFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCxBPTA7QTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoQSsrKSxnPWIuY2hhckNvZGVBdChBKyspLHE9Yi5jaGFyQ29kZUF0KEErKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxGbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSxBPSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksQT0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPUE7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtQaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxXaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx2bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxTajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx3azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sR2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxnazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlBpKCl8fGIuV2koKXx8Yi52bSgpfHxiLlNqKCl8fGIud2soKXx8Yi5HaigpfHxiLmdrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0saW06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEZsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LG9vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGFoOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy52aShhKSsiOiIrdGhpcy52aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnduPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSxEbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LHBvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5aZyhiKSlyZXR1cm4gdGhpcy5aZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuYWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5mYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuT2soZixiKTtyZXR1cm4gZn0sZmI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sVG06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YuYWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5mYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlRtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5mYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LERtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnNqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnJqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZ249e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucXA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSWw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuR2s9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuWG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkpsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLklrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkhrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuRGk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5rbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EucHA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuVG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5obj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkNsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuZW0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy50anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnFufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5jbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuWm4oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxabjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkVoJiZMLnZvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sa286ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sYW86ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx5cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ybSgpfHx0aGlzLktrKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxLazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxlaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFpoOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0sdHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkRrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy4kbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxmLmtmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnJpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHJpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm9iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGhvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ea30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwkbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxYbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5lanx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaGp8fG9hOyhmdW5jdGlvbihjKXtjLmlqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmlqfHxwYTsoZnVuY3Rpb24oYyl7Yy5qaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMuamp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLk9pfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5ZZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxtcTpmdW5jdGlvbigpe3JldHVybiExfSxZZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApOwp0aGlzLlcoYil9fSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9CmEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7CnJldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQmp8fHNhOyhmdW5jdGlvbihjKXtjLkFqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LG9xOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5yZT0hMTt0aGlzLnRlPTE7dGhpcy5qZD1bXTt0aGlzLkdiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmCmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnRlPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5HYj0hMCk7ZWxzZXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlIGluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciBlPTA7ZTxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmxlbmd0aDtlKyspaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZVtlXS50YWcpe3RoaXMuR2I9ITA7YnJlYWt9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5HYj0hMCk7Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5HYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkdiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7dmFyIGQ9CiJhZFBsYXkgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIik7aWYoZi5SKCJzcGllZ2VsLmRlIikmJi0xIT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpKXthLm9uKCJiZWZvcmVQbGF5IixmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5qdy12aWRlbyIpOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtiLmZvckVhY2goZnVuY3Rpb24oYil7ImF0dHJpYnV0ZXMiIT1iLnR5cGV8fCJzcmMiIT1iLmF0dHJpYnV0ZU5hbWV8fHRoaXMucm58fC0xIT1iLnRhcmdldC5zcmMuaW5kZXhPZigidmNkbjAxIil8fCh0aGlzLnJuPSEwLGIudGFyZ2V0LnNyYz0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iK2YuYWIoYi50YXJnZXQuc3JjKSx6LmJpbmQodGhpcykoKSl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSkub2JzZXJ2ZShiLAp7YXR0cmlidXRlczohMCxjaGlsZExpc3Q6ITAsY2hhcmFjdGVyRGF0YTohMH0pfS5iaW5kKHRoaXMpKTt2YXIgZyxjLGgsej1mdW5jdGlvbigpe2g9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiei0xMCIpO2Zvcih2YXIgYj0wO2I8aC5sZW5ndGg7YisrKWhbYl0uY2xhc3NMaXN0LnJlbW92ZSgiei0xMCIpO2c9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5wYXJlbnRFbGVtZW50O2I9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKTtjPWIuc3R5bGU7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSItIisoYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55LWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWFyZWE9J2hlYWRlci1iYXInXSIpLm9mZnNldEhlaWdodCkrInB4IjtiLnN0eWxlLmxlZnQ9IjBweCI7Yi5zdHlsZS53aWR0aD0iMTAwJSI7Yi5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IiwxNipiLm9mZnNldFdpZHRoLzkrInB4IiwKImltcG9ydGFudCIpO2Iuc3R5bGUuekluZGV4PTFFMztiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Yi5sb2FkKCk7Yi5wbGF5KCl9O2Eub24oImFkQ29tcGxldGUiLGZ1bmN0aW9uKCl7Zy5pbnNlcnRCZWZvcmUoandwbGF5ZXIoKS5nZXRDb250YWluZXIoKSxnLmZpcnN0Q2hpbGQpO2p3cGxheWVyKCkuZ2V0Q29udGFpbmVyKCkuc3R5bGU9Yztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXtpZihnJiZjKXtnLmluc2VydEJlZm9yZShqd3BsYXllcigpLmdldENvbnRhaW5lcigpLGcuZmlyc3RDaGlsZCk7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5zdHlsZT0KYztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSl9Zm9yKGU9MDtlPGQubGVuZ3RoO2UrKylhLm9uKGRbZV0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtlXSYmKHRoaXMucmU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtlXSYmdGhpcy5MaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLiRtJiYhdGhpcy55YSgpJiYodGhpcy5HYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsCjFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5NYjtiJiYoYi5OZCgpLGIueGQoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuVmd8fCh0aGlzLlZnPVtdKTt0aGlzLlZnLnB1c2goe2NvZGU6YS5jb2RlLG1zZzphLm1lc3NhZ2V9KTt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJgowPGEubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnRlJiZ0aGlzLmkoKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuTGU/dGhpcy5MZSsrOnRoaXMuTGU9MTp0aGlzLktlP3RoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLllnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMuQWp8fHRhOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGUmJmUoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLndifHx0aGlzLksoZSl8fHRoaXMuRW0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYuYWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9CmE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy5Ya3x8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mucms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwKJGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5xaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVWg9Zi5TYigxMCk7dGhpcy54aT0hMDt0aGlzLkNjPXRoaXMudmg9ITE7dGhpcy5lbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksCnRoaXMueWIoKSl9LGVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLlIoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuSWE/YS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5JYT90eXBlb2YgYS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlVoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sCmloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmMpe3ZhciBhPXRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy51aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLkxuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sTG46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2lmKGYuUigiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYKKHRoaXMuTWc9YS5hZHMpO3JldHVybiB0aGlzLk1nfSxobDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuTGgoKX0uYmluZCh0aGlzKSl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLAplPXRoaXMuUGMoKTtiJiZlJiYodGhpcy5DY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNjP3RoaXMudygpOih0aGlzLmRhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnZoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PQpifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuTT1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxpbDpmdW5jdGlvbigpe3RoaXMuSWN8fCh0aGlzLkljPSJ1bmtub3duIik7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkcyl7aWYodGhpcy5JYyE9YS5hZHMuc3RhdGUmJih0aGlzLkljPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkljKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlsKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/Cih0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMueWEoKXx8KGF8fCh0aGlzLnhpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLnhpLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuaXF8fCgxMDx0aGlzLmJwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYnArKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5TbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxTbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYKIXRoaXMuY3Ape3RoaXMuY3A9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5xa3x8eWE7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuaWkod2luZG93KTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmlpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGlpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmCihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuU2UoYikpe2Zvcih2YXIgZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJihhPW5ldyB4YShiW2VdKSxhLmhhfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTChhKSwobmV3IHlhKGEsdGhpcy5GKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LE86ZnVuY3Rpb24oKXt0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMuc2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy50Zj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmKGI9YS5wYXJlbnROb2RlKSwhYikpe3RoaXMuVSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0seW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fApiLk5kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy50Zj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LHVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTphLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuVWp8fFI7KGZ1bmN0aW9uKGMpe2MuVGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0KMCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBlPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWU9ITA7ZXx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChlPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5NPXRoaXMuTXx8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuTWw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5NbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLnluKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTsKdGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihjKXtjLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgUihhW2JdKTtlLmhhfHx0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBDYShlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRGE9Yy5Wanx8RGEsRWE9bmV3IERhKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuc218fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmZoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYKKGI9Yi5wYXJlbnROb2RlKX10aGlzLkFuPWEucG9zaXRpb25pbmc7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5zdHlsZS53aWR0aD1hLndpZHRoO2Uuc3R5bGUubWluV2lkdGg9YS53aWR0aDtlLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7ZS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5Bbil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTsKdGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLkFoKHRoaXMuQ2QpO2YuYWYodGhpcy5DZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFsKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy55anx8R2E7KGZ1bmN0aW9uKGMpe2MueGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMueGp8fElhOyhmdW5jdGlvbihjKXtjLnpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9Cm0uaW5yZWFkLGI9Zi5maChhLCJlbGVtZW50SUQiKTtpZihmLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuSyhhKSkpe3RoaXMuTChhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnpqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5ibHx8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT0Ke319Yy51aj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LExrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBDPWMudWp8fEM7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixhLGQsZyxjKXt0aGlzLkZhPWI7dGhpcy4kZz10aGlzLkdpPSExO3RoaXMuTWg9ZDt0aGlzLmppPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmxiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09CmgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuZGYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9Yy52aj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy4kZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5sYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuamk/dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmxiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuR2l8fAoodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMubGIuc2VuZChiKX1jYXRjaChnKXtiPXRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5Iil8fHRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTWgmJnRoaXMuTWgoKX1yZXR1cm4gdGhpcy5sYn19fSkoYyk7dmFyIE1hPWMudmp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuYWo9CmE7YS5wcm90b3R5cGU9e2VvOmZ1bmN0aW9uKGIpe3RoaXMubWU9Yn0sY286ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxRbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt4cDoiQWRDbGlja1RocnUiLHpwOiJBZEVycm9yIixBcDoiQWRTdG9wcGVkIixEcDoiQWRMaW5lYXJDaGFuZ2UiLEVwOiJBZFRhZ1BhcnNlZCIsSHA6IkFkVmlkZW9Db21wbGV0ZSIsS3A6IkFkTG9hZGVkIixMcDoiQWRTa2lwcGVkIixNcDoiQWRTdGFydGVkIixCcDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLENwOiJBZEltcHJlc3Npb24iLHlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7CmZvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5tZSxhW2RdKX0sUG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmxlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmxlKXRoaXMuR2EubGUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5HYSx0aGlzLkdhLmxlW2FdKTt0aGlzLkdhJiZ0aGlzLkdhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkdhLmdldEVycm9yKCl9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5RbigpO3RoaXMuR2EmJnRoaXMuUG4oKX19fSkoYyk7dmFyIE5hPWMuYWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnFiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLnBiPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjsKdGhpcy5lZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy4kZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy55Zj0hMTt0aGlzLmlhPVtdO3RoaXMuV2U9dGhpcy5WYj0iIjt0aGlzLmplPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLm5iPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLmFjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLldiPSIiO3RoaXMuWGI9W107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmpiPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmJiPXtnbG9iYWw6ITEsY2xpZW50OiExLApjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5FYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5ZYz10aGlzLlFkPW51bGx9Yy53aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXI6dGhpcy5wYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZWMsYWR0YWdyZWdleDp0aGlzLnFkLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmZmLHNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLApzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLldlLEhPTUFEX1ZFUklGSUVEOnRoaXMuamUsSE9NQURfQkxPQ0tFRDp0aGlzLmllLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsdGVzdFRhZ3NYSFI6dGhpcy5iZCx0ZXN0M1BDb29raWU6dGhpcy50Yyx0aHJvdHRsZTp0aGlzLlpkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubmMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5IZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmJiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuZWIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLkxmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFduOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkNhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLnFiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMucGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmZmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy56Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5lZj1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5RYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJgoodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLiRlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuV2U9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuamU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5uYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLmJkPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy50Yz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuWmQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLkhnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuV2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5iZT1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYmI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmViPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuTGY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuYWc9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5FYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LApxbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5iYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmJiW2FdJiYxPT10aGlzLmJiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuYmJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmJiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYmJbYV0mJjE9PXRoaXMuYmJbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sWGQ6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIiwKZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuJGsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIixjPSIiLGY9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5jZihiKTtjPXRoaXMuYWEoYik7Zz8odGhpcy5TYygpP2Y9YjpmPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGY9dGhpcy5xYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFifHx0aGlzLnBifHx0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5ibihoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmJtKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD0KaDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5hYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGNmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5TYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj0KYS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxkZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmNmKGIpO3JldHVybiBhfSxibTpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIiwKYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSWg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sYW46ZnVuY3Rpb24oYixhKXt2YXIgZD1mLmFhKGIpLGc9IiIsZz0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZz17fSx6PTA7ejxoLmxlbmd0aDt6Kyspe3ZhciBrPWhbel0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5JaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPQp0aGlzLkloKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmKGIrPXRoaXMucWIpO2lmKHRoaXMucGIpZm9yKHZhciBhIGluIHRoaXMucGIpdGhpcy5wYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5wYlthXSkpO2lmKGYuSmMpZm9yKHZhciBkPTA7ZDxmLkpjLmxlbmd0aDtkKyspe3ZhciBnPWYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuYW4oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmCmEuZW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmNvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxjLGYpe2w9dGhpczt0aGlzLmVmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy55Zj1kO3RoaXMuZWU9Zzt0aGlzLmljPWM7dGhpcy54YT1mfHx7fTt0aGlzLnBsKCk7dGhpcy5TbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlFtKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkdjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZ2I6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxEbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sU206ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuUWMrdGhpcy54ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5HYygpfS5iaW5kKHRoaXMpLCEwKX0sUW06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy54ZSgiY2xpZW50IiwtMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iKwp0aGlzLlNiKCkpO3RoaXMueGEmJnRoaXMueGEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnhhJiZ0aGlzLnhhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGUpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaWM9ITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPQp0aGlzLiRlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5nYih0aGlzLmllKSk7dGhpcy5CYigpO2YuTGMoay54bik7KGE9Zi5VYSh0aGlzLklkKCkpKXx8KGE9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuaXNFbmFibGVkPXRoaXMuQWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPGQuc2VydmVyLmxlbmd0aDtiKyspe3ZhciBhPQpkLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaCh6KXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8CltdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5SKCJ3ZWIuZGUiKXx8Zi5SKCJnbXgubmV0Iil8fGYuUigiZ214LmF0Iil8fGYuUigiZ214LmNoIil8fGYuUigiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5kaShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJgp0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxkaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFRjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucWMoKSksZD10aGlzLmFhKHRoaXMuVmIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGEsdGhpcy55by5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTsKYj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5bzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuV2Y9dGhpcy5BYihkLnN0cmljdCk7dGhpcy5iZT10aGlzLkFiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5lYj10aGlzLkFiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuV2I9ZC50ZXN0aGlkZXx8IiI7dGhpcy5ZYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmJkPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5xYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnBiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fApudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZmY9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnhhLnZwYWlkPXRoaXMuamI7dGhpcy5MZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkVjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmRpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5aZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMuRGI9ZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuS28oKSYmCih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnlmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuRWUoKSx0aGlzLkJiKCkpOnRoaXMuQm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5UZigpKX19LFdtOmZ1bmN0aW9uKGIpe3RoaXMuSGk9ITA7dmFyIGE9ZnVuY3Rpb24oYil7aWYoYj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2IrIj0oW147XSspIikpKXJldHVybiBiWzJdfSgiYWRwX3NlZ3MiKXx8ImUwIixhPXRoaXMuRGIudXJsLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKS5yZXBsYWNlKCJbc2Vnc10iLGVuY29kZVVSSUNvbXBvbmVudChhKSksYT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6YSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLmFiKGEpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07CmYuS2QodGhpcy5xYygpLCJQT1NUIixhLGZ1bmN0aW9uKGEpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaCh6KXtiKCl9YigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YigpfS5iaW5kKHRoaXMpLCEwKX0sQm86ZnVuY3Rpb24oKXt0aGlzLkFvKCk7dGhpcy5DbygpfSxDbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksej1mLlYoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHosZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoeikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2YuYWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChnKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9Zi5CZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLnNhKCJjc3BfIithKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxUZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sWWQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IoYSkpLHRoaXMuQmIoKSx0aGlzLkVlKCkpfSxBbzpmdW5jdGlvbigpe2lmKHRoaXMuV2Ipe3ZhciBhPWYuQmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLkhtKCkpdGhpcy5ZZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTsKZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpO2E9ZH1jYXRjaChnKXt9YT90aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm1pKCl9fWVsc2UgdGhpcy5taSgpfSxSZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy5GbyhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBkPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZigpfSxGbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZj8od2luZG93LmNsZWFyVGltZW91dChmKSwhMCk6ITF9dmFyIGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbWk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuR28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGQ9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlJmKCl9LEdvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7ZigpJiZlKCl9ZnVuY3Rpb24gYygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZSl7ZT09YSYmZigpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPQpjO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sUWY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLktkKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuQWIoYS5jYyk7dGhpcy5UZigpfS5iaW5kKHRoaXMpLHRoaXMua2kuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5raSgpfWVsc2UgdGhpcy5UZigpfSxraTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKTt0aGlzLkVlKCl9LEhtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LEJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJgooYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnhjJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5RZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMuamUpKTt0aGlzLmVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuZWUmJnRoaXMuZWUoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuSGJ9KX0sY2w6ZnVuY3Rpb24oKXt0aGlzLlljPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWWMuaWQ9Zi5WKDEwKTt0aGlzLlljLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5ZYyk7dmFyIGE9dGhpcy5ZYy5jb250ZW50V2luZG93LGU9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD0KZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5RZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5RZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi5BZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYTthPShhPWRvY3VtZW50LmNvb2tpZS5tYXRjaCgvKF58IClhZHBfc2Vncz0oW147XSspLykpP2FbMl06dm9pZCAwO2EmJmYudHJhY2soInN0YXRzX2hkX3NlZ3MiLCJlMCIhPWEsITApfS5iaW5kKHRoaXMpLDJFMyl9LG9sOmZ1bmN0aW9uKCl7aWYodGhpcy5iZSYmdGhpcy5xbSgpKXt2YXIgYT10aGlzLiRsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIiwKYS5qb2luKCJfIiksITApfX0scmk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxLYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrO3RoaXMuSGQ+dGhpcy5waCYmIXRoaXMucWgmJih0aGlzLnFoPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5waCwhMCkpO2E9bmV3IE1hKGEsZSxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtnJiYoYS5HaT0hMCk7YyYmZi5GbSgpJiYoYS4kZz0hMCk7aCYmKGEuamk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLlptfHwKKHRoaXMuWm09ITAsZi5EYSgpfHxmLmZiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihnPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGdbMF0mJihnPWdbMF0pLGcpe2c9ZyYmZy5jaGlsZE5vZGVzJiZnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKwoiOi8vIitnLmhvc3QpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Zi5uZXR3b3JrU3RhdGU9PWYuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9Zi5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFwcGVuZENoaWxkKGUpO2Yuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx6bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5Xby5iaW5kKHRoaXMpLHRoaXMuVm8uYmluZCh0aGlzKSl9LFdvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsOwp0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuS2woKX0sVm86ZnVuY3Rpb24oKXt9LEtsOmZ1bmN0aW9uKCl7Zi5MYyhrLkpsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxFZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuemIubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy56YlthXTsicmVxdWVzdCI9PWUudHlwZSYmZi5mYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWUudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztmLmZiKGUudXJsLGUuYWxpYXMsCm51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxLbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLlpkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPSIiLGQ9MDtkPGE7ZCsrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBlfSxBYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxhYjpmdW5jdGlvbihhKXtmb3IodmFyIGU9IiIsZCxnLGMsZixoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz0KYS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxmPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihjKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZX0sYWE6ZnVuY3Rpb24oYSl7dmFyIGU9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZz0xNDtnLS07KWRbZVtnXV09YVtnXXx8IiI7ZC5xdWVyeUtleT17fTtkW2VbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZSl7YiYmKGQucXVlcnlLZXlbYl09ZSl9KTtyZXR1cm4gZH0sSmY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZShhKXt2YXIgYj0iIixkLGU7Zm9yKGQ9NzswPD1kO2QtLSllPWE+Pj40KmQmMTUsYis9ZS50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZj1BcnJheSg4MCksCmg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpYz1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKylmW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO2M9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGMsNSkrKG4mcHx+biZyKSt1K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9MjA7Mzk+PWc7ZysrKXY9ZChjLDUpKyhuXnBecikrdStmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTQwOzU5Pj1nO2crKyl2PWQoYyw1KSsobiZwfG4mcnxwJnIpK3UrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YywKYz12O2g9aCtjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy53anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLldrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUGE9Yy5Xa3x8UGE7bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUsZCl7dGhpcy5hPWE7YS5jLlA/dGhpcy5oYj1hLmMuUCgpOnRoaXMuaGI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5haS5iaW5kKHRoaXMpLG11dGU6dGhpcy5vZi5iaW5kKHRoaXMpLAp1bm11dGU6dGhpcy5Rby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnNiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLllrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVmQ9e307Zi52YigibmV3QmlnQWRJZCIpO3RoaXMuYWw9Zi5WKDEwKTt0aGlzLk5mPTA7dGhpcy5vZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLm9kPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLm9kPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlJrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuV2M9dGhpcy5VZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoPwpwYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMud2U9ITE7dGhpcy51aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZmk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5mZT10aGlzLiRiPXRoaXMuSWU9dGhpcy55ZD10aGlzLldkPXRoaXMuQ2I9dGhpcy52Yz10aGlzLlBoPXRoaXMuSGU9dGhpcy5EZD10aGlzLkxvPXRoaXMuRmI9dGhpcy5RYj0hMTt0aGlzLkFjPVtdO3RoaXMucGM9e307dGhpcy50bj0yMDA7dGhpcy5kZz10aGlzLmRkPXRoaXMuRmM9dGhpcy5jZz10aGlzLnhmPSExO3RoaXMucWY9e319Yy5xaj1hO2EucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmhiXSYmdGhpcy5jb25mW3RoaXMuaGJdW2FdJiYoZT0KdGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gZX0sc2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLnJvKCk7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0samY6ZnVuY3Rpb24oYSxlLGQsYyl7dGhpcy5GYj1kO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLk5mKyssZi52YigibmV3U21hbGxBZElkIiksdGhpcy5BLm9sKCksYz1sLmdldENvbmZpZygpLGYuT2cmJih0aGlzLkEuV24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsCmtlZXBVUkw6ZSxiaXRyYXRlOmMuUGEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmpiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB4Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt4Yy5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmxvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLkFjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmttKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5iaChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlZsKGIpKSk7cmV0dXJuIGV9LFZsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0sa206ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLnFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmZuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5JbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuc28oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsucnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5zcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLlRvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLlVvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sbG86ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMua2IuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS52cT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlJrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk1rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5uaShlKSl7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5QayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmtiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMua2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuam8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sam86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuUWsodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5RaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMuemkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLm5tKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuZXAoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5mcCgpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5qcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5vcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5FaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmdwKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmhwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0saHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGpwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGZwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuaGkoKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxucDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxscDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxvcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LEVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LGVwOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkVpKCEwKX0sTWs6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBkPWIuYWEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLmFwLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5DaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm5pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlpvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLllvKCk7dGhpcy56aSgpO3RoaXMuQmcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5laSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuZWImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuR2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LEprOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZ2goYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5wbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuSmsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5rbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS53aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlpoKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkpoKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sYXA6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQ2k6ZnVuY3Rpb24oKXtpZih0aGlzLkxvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5PbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmtiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLndpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi5haCh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx0aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxPbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudWl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudGkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnRpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuaGkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5lYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuZWImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy51aT1hKX0sZ2k6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxybzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0saGk6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHNvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5lYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5lYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMubG0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLkRtKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkhrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGQpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkVsKHRoaXMuYi5PYSxhKX1jYXRjaCh6KXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5MayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLk5rKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5ZaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlloKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxOazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFloOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sdW86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sbG06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxFbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxabzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sWW86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuYWgoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnBpLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5maTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxhaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuTW0oKSYmdGhpcy5MbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLlBvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LE1tOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuamJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5qYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5qYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxMbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sYW06ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LFBvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmYudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsZS5hdmFpbGFibGUsITApO2lmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7Zi50cmFjaygic3RhdHNfd3RfY2F0Y2giLCIiLCEwKX10aGlzLnhkKCl9dmFyIGU9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzLGQ9dGhpcy5hbSgpO3RoaXMuRmM9dGhpcy5XYz10aGlzLmRkPXRoaXMuZGc9ITA7cmV0dXJuIGU/KGYuZmIoImh0dHBzOi8vd3d3LndlbGVjdC5kZS9hcGkvdjEvcHJlZmxpZ2h0L2J5X2FsaWFzLyIrZSwiZGV3ZWxlY3R3d3d3ZWxlY3RkZSIse30sYS5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSx0aGlzLkEpLAohMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMudW8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSx0aGlzLnRuKToodGhpcy5XZD0hMCx0aGlzLmEuVmUoKSx0aGlzLmEuVW4oKSx0aGlzLm9jPSExLGE9dGhpcy5iLnN8fHt9LHRoaXMuSGV8fChhLm5vQ29tcGxldGVRdWFydGlsZT0hMCksZi5vKGsueWwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLlJlKCkuWmgoKSl9LFJlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LEJnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGYuYWYodGhpcy52aWRlbyxhKT90aGlzLmFpKCk6dGhpcy5OZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZygpfS5iaW5kKHRoaXMpLDEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9CnRoaXMuYi5yYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLkFjJiYwPHRoaXMuQWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLkFjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHU6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLmFsKyItIit0aGlzLk5mO3RoaXMuYiYmdGhpcy5iLmhoJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYi5oaCgpKTtyZXR1cm4gYX0sUmc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnFqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYT1jLkhsfHxSYTtuZXcgUmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGQsYyl7dGhpcy5vcHRpb25zPWN8fHt9O2U9ZDt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5vYT1udWxsO3RoaXMuWT1bXTt0aGlzLko9bnVsbDt0aGlzLnpjPXRoaXMuQmM9ITE7dGhpcy5iYT0iIjt0aGlzLmJnPSExO3RoaXMuc2g9IiI7YyYmYy5lbXB0eT90aGlzLlZtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBiPTAsZSxkPVtdO2Mub2s9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWYuQmQoKSxiO2I9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgZD0iIjtiLnF1ZXJ5S2V5JiYoZD1iLnF1ZXJ5S2V5Lmh2cCk7ZCYmKHRoaXMub3B0aW9ucy52cGFpZD0KITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwudmEobC5YZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFmLkRhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxjPWZ1bmN0aW9uKCl7cmV0dXJuIGUoKSYmKGYuUigibWFydGhhc3Rld2FydC5jb20iKXx8Zi5SKCJmYW5kb20uY29tIil8fGYuUigiZ2lnYS5kZSIpfHxmLlIoImtpbm8uZGUiKXx8Zi5SKCJzcGllbGV0aXBwcy5kZSIpfHxmLlIoImRlc2lyZWQuZGUiKSl9LmJpbmQodGhpcyk7aWYoZSgpfHxjKCkpe3ZhciBoPWYuTmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgYz1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYKIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4oZi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG49ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihjKCl8fGsoKXx8bSgpfHwiYXBwc3BvdCI9PQpkKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlhkKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLlhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixmLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuWGQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5VbS5iaW5kKHRoaXMpLHRoaXMuUm0uYmluZCh0aGlzKSl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuTmIpdHJ5e3ZhciBlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09ZS5maXJzdENoaWxkfWNhdGNoKGMpe2RbYl09e319ZWxzZSBkLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLk5ifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5OYnx8dGhpcy5KbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC56bygpKXRyeXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Yy5sZW5ndGgmJihjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2NbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtlW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspZC5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChkKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxKbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGQ9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZT0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZT1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZSYmTWF0aC5hYnMoZS1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWQ/ITA6ITF9LFVtOmZ1bmN0aW9uKGEpe3RoaXMuRW4oYSk7dHJ5e3RoaXMub2E9YS5yZXNwb25zZVhNTCx0aGlzLm9hfHwodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuc2g9YS51cmxDYWxsZWQ7aWYodGhpcy5ZLmxlbmd0aCl0aGlzLlZjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUmEodi5mZCx7ZXJyb3I6dGhpcy5iZz8KRi5uZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuVWEodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxWbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuWS5sZW5ndGg/dGhpcy5WYygpOnRoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKX0sUm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUmEodi5mZyx7ZGVwdGg6Yn0pKX0sVmM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5ObSgpP3RoaXMuSG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5taCgpLGUse0FkU3lzdGVtOnRoaXMuVWwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5SYSh2LmlnKSk6KGI9MCx0aGlzLlJvKCkmJnRoaXMudWYodGhpcy5CbCgpKSl9LHBmOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5wZigpfSxKaDpmdW5jdGlvbigpe3RoaXMuemM/KHRoaXMuemM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQuSmgoKX0sUm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FbygpP3RoaXMuRG8oKT8hMDooLTEhPXRoaXMuTmMoKT90aGlzLnJhKHRoaXMuUmEodi5oZSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSksITEpOih0aGlzLnJhKHRoaXMuUmEodi5mZCxGLmhnKSksITEpfSx1ZjpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5nZXx8KGEuZ2U9W10pO2EuZ2UucHVzaCh0aGlzLnNoKTthLk9hPWEuT2EuY29uY2F0KHRoaXMubGYoKSk7YS5FYj1hLkViP2EuRWI6dGhpcy5CYzsKYS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7dGhpcy5wYXJlbnQudWYoYSl9LEJsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmR1cmF0aW9uPXRoaXMuTmMoKTthLk49dGhpcy5qaCgpO2EucmI9dGhpcy5XbCgpO2EuQ3E9W107YS5vcmlnaW49dGhpczthLnM9dGhpcy5UbCgpO2EuTWY9dGhpcy5qbShhLmR1cmF0aW9uKTthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fAoodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2lmKCF0aGlzLkomJnRoaXMub2EmJnRoaXMub2EuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5vYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmQubGVuZ3RoJiZmLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZSl7fX10aGlzLkomJihhLk9hPWEuZXJyb3IuY29kZSE9di5oZS5jb2RlP2EuT2EuY29uY2F0KHRoaXMuWGwoKSk6YS5PYS5jb25jYXQodGhpcy5mbSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmtjJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGtjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmtjKGEpfSxVZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxIbzpmdW5jdGlvbigpe3JldHVybiBiPGV9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5qaCgpLmxlbmd0aH0sRG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLk5jKCl9LFNmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LGxpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5TZigpJiYoYT0hMCk7cmV0dXJuIGF9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuYmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5iYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLmJhPSJVTktOT1dOIn10cnl7dGhpcy5iZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChlKXt9fSxObTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMubWgoKS5sZW5ndGh9LG1oOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUWUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIkFkU3lzdGVtIil9LGxmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1lJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiQ29tcGFuaW9uIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUpKXJldHVybn1jYXRjaChkKXt9aWYoYSYmIXRoaXMuemgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxlLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMudGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSx6aDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxYbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0samg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxQYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFVwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnRiKGFbZF0pfSk7dmFyIGU9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBjPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5QYSktTWF0aC5hYnMoZS1iLlBhKX0pLGY9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZS1hLlBhKS1NYXRoLmFicyhlLWIuUGEpfSksYj1jLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LFRsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7CmZvcih2YXIgYj0iIixkPSExLGU9W10sYj0hMSxjPSIiLGY9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2M9Yj10aGlzLkdkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWUucHVzaChkKTtmLnB1c2goYyl9MTxhLmxlbmd0aD8oYj1lLGg9Yyk6KGI9ZCxoPWYpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxOYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sam06ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxlPSExO3RyeXtkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZT1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5vbyhlLAphKSwwPmImJihiPSExKX1jYXRjaChjKXtiPSExfXJldHVybiBifSxRZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMudGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx0YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkdkKGEpOiIifSxHZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5va3x8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLnBufHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk49W107dGhpcy5yYj0iIjt0aGlzLnM9dGhpcy55Yz10aGlzLkViPSExO3RoaXMuWGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlllPSIifWMuV2o9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sZG06ZnVuY3Rpb24oKXtpZighdGhpcy5YZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm9hKXt2YXIgYT10aGlzLm9yaWdpbi5vYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZT0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGU9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1lLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLlhlPWFbZF0pfXJldHVybiB0aGlzLlhlfSwKaGg6ZnVuY3Rpb24oKXtpZih0aGlzLlllKXJldHVybiB0aGlzLlllO3ZhciBhPSIiOyhhPXRoaXMuZG0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlllPWF9LG5tOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTi5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5OW2VdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Xanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5OaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHY9e29lOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE5hOiJYTUxfUEFSU0VfRVJST1IifSxlZzp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLAptZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGZkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGlnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE5hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKTmE6IkxPQURfRVJST1IifSxrZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx1cDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixOYToiTUVESUFGSUxFX0VSUk9SIn0saGU6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTmE6IkRVTU1ZX0FEIn19LEY9e2dnOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTmE6Ik5PX0FEUyJ9LGhnOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixOYToiTk9fTUVESUFGSUxFUyJ9LHZwOnt0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG5lOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMucGt8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5lcnJvcj1hO3RoaXMuQWQ9ZTt0aGlzLk9hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuZ2p8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPQpjLm5ufHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuJGg9YTt0aGlzLnZpZGVvPWU7dGhpcy5jZT1bXTt0aGlzLlhoPVtdO3RoaXMucmY9W107dGhpcy4kbz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSSgpfWMud3A9YTthLnByb3RvdHlwZT17STpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy4kaC5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLiRoW2FdLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsCmM9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO3ZhciBoPWYuY29udGVudFdpbmRvdztoLnJxPXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkpuLmJpbmQodGhpcyl9O3ZhciBrPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2sub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2guZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtoLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7CnRoaXMuY2UucHVzaCh7c3JjOmQsZnJhbWU6Zix2bjpjLHZlbmRvcjplLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5yZi5sZW5ndGg7ZSsrKXt2YXIgZD10aGlzLnJmW2VdO2QudHlwZT09PWEmJmQuZmwodGhpcy5ZbChhKSl9fSxZbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntBcTohMCx6cTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntucToidmlkZW8iLERxOiJqc0N1c3RvbSIsRXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxGcToxLFZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsCmVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LG1tOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5jZS5sZW5ndGg7ZSsrKWlmKHRoaXMuY2VbZV0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5jZVtlXS52bjtyZXR1cm4iIn0sUm46ZnVuY3Rpb24oYSxlKXt0aGlzLlhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLm1tKGUpLHZlbmRvcjplfSk7dGhpcy5xbygpfSxKbjpmdW5jdGlvbihhLGUpeyJ2aWRlbyI9PT1hP3RoaXMuJG8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuemcoYSxlKX0uYmluZCh0aGlzKSk6dGhpcy56ZyhhLGUpfSx6ZzpmdW5jdGlvbihhLGUpe3RoaXMucmYucHVzaCh7dHlwZTphLApmbDplLHhxOiExfSl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5YaC5tYXAoZnVuY3Rpb24oYSl7YS5HbXx8KGEucXEoe2FkU2Vzc2lvbklkOmYuVigyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuQnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLkdtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuUGx8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMuc2I9YS5laCgpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9CmYuVigxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy5BZz0hMTt0aGlzLmZjPVtdfWMuY2o9YTthLnByb3RvdHlwZT17U2w6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxmPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGY9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6Zix5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5TbChhKTtmb3IodmFyIGM9MCxkPTAsZj0hMSxoPXRoaXMudW0oYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LHhvOmZ1bmN0aW9uKCl7dGhpcy5BZz0hMH0sd2k6ZnVuY3Rpb24oKXt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2YubyhrLkhjLHRoaXMuYy5sKCkpfSxVbjpmdW5jdGlvbigpe3RoaXMuQWd8fCh0aGlzLmMucGxheSgpLGYubyhrLndkLHRoaXMuYy5sKCkpKX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuc2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLnNiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5zYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5zYik7dGhpcy5jLlpjJiZ0aGlzLmMuWmMoKT90aGlzLmMuZWgoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSx1bTpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LFFsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gY30sbWM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5RbCh0aGlzLnNiKTtpZihjLnghPXRoaXMuSGEueHx8Yy55IT10aGlzLkhhLnl8fGMucG9zaXRpb24hPXRoaXMuSGEucG9zaXRpb258fGMud2lkdGghPXRoaXMuSGEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLkhhLmhlaWdodHx8YSl7aWYoMDx0aGlzLkhhLndpZHRoJiYwPHRoaXMuSGEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5WZSgpO3JldHVybn10aGlzLkhhPWM7dGhpcy5jLlpjKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD0KYy54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuZmMubGVuZ3RoO2ErKyl0aGlzLmZjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWYuUGYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0seWc6ZnVuY3Rpb24oYSl7dGhpcy5mY3x8KHRoaXMuZmM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmZjLnB1c2goYSl9LFZlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CnRoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1mLlYoMTApO00uY29udHJvbHM9ITA7RC5wdXNoKE0pfXZhciBKPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy50bXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5SZChhKTt0aGlzLlBnKCl9LFJkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxQZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVGEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxaZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sbGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLlRhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTsKdmFyIGJiPWMuUWp8fGJiOyhmdW5jdGlvbihjKXtjLlBqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuZGM9dGhpcy5kY3x8ITE7dGhpcy5xZz10aGlzLnNnPXRoaXMud2g9dGhpcy56YT10aGlzLlVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTmwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMud2gmJnRoaXMuR2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5NYjthJiZhLm9jJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpO3RoaXMuRGcoKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5kYyl7dGhpcy51ZCgpO2lmKCF0aGlzLlVmJiYhdGhpcy51ZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuVWYmJnRoaXMucWcmJiF0aGlzLnNnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0sdWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtoKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LGtoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZzpmdW5jdGlvbigpe2lmKHRoaXMudWQoKSl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLnNnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMucWc9YS5TcH10aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLmtxKCk6ITF9LE5jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5OYygpOi0xfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sTmw6ZnVuY3Rpb24oYSxiKXt0aGlzLmRjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuZGN8fDMwMj09dGhpcy5kYz90aGlzLnphPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5kYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuemE/KHRoaXMudygpLHRoaXMuamEoKSk6YS5aZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmdtKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBjYj1jLlBqfHxjYjsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEltOmZ1bmN0aW9uKCl7d2luZG93Lk9PLiRqLkVrLkNrP3dpbmRvdy5PTy4kai5Fay5Day5RcChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLlNlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgY2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMuUmp8fGRiLGViPW5ldyBkYih0KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5zbnx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5oYT0hMTt0aGlzLm5oKCl9LG5oOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTsKYSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTWE6ZnVuY3Rpb24oKXt0aGlzLlRoKCl9LFRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcyksCjEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVWl8fGdiOyhmdW5jdGlvbihjKXtjLlRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRGUoYS5hZEVycm9yRXZlbnRzW2JdKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5EZShhKX0uYmluZCh0aGlzKSk7CmEucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHNbYl0pfS5iaW5kKHRoaXMpKTthLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYjsoZnVuY3Rpb24oYyl7Yy5WaT1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFZoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwoYS5SZChNYXRoLmNlaWwoMUUxMCoKTWF0aC5yYW5kb20oKSkpLHRoaXMuTChhKSwobmV3IGhiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMuT2x8fCh0aGlzLk9sPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5WaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBpYj1jLlZpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLmJqfHwKamI7bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sWmM6ZnVuY3Rpb24oKXt2YXIgYT1tO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLmlrfHxVOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubG4oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7CncubmQoIiMiK2EsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt3LnBtKCl9LGxuOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXtiPWlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYT1bXSxiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5NZCYmKGE9Zi5GbChhLHRoaXMuTWQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5LKGQpKXt0aGlzLkwoZCk7dmFyIGc9bmV3IFYoZCx0aGlzLkYpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLk1kfHwKKHRoaXMuTWQ9W10pLHRoaXMuTWQucHVzaChhW2JdKSxkPW5ldyBVKGgpLHRoaXMuSyhkKXx8KHRoaXMuTChkKSxnPW5ldyBWKGQsdGhpcy5GKSxnLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5PKCl9LG5kOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVthXXx8KHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goYyl9LElvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5UbigpJiYodGhpcy5BZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2NdJiYwPHRoaXMuY2FbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0KMDtkPHRoaXMuY2FbYl1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2JdW2NdW2RdKGEpfX0scG06ZnVuY3Rpb24oKXtpZih0aGlzLlVjKWZvcih2YXIgYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLlVjW2FdLGM9Yi5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmNhW2NdW2RdW2ZdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5JbyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYj1jLnhrfHxsYjtuZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5RaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLm11dGVkPSExO3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LAp1YTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLmlzUGxheWluZygpJiZhLnBhdXNlKCl9KX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUWl8fG1iOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXtmLkpjLnB1c2goeyJbd2lkdGhdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0V2lkdGh9KTtmLkpjLnB1c2goeyJbaGVpZ2h0XSI6dGhpcy5wbGF5ZXIuY29udGFpbmVyLm9mZnNldEhlaWdodH0pO3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDsKYS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuUml8fG5iOyhmdW5jdGlvbihjKXtjLlNpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7CmlmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuSyhoKXx8KHRoaXMuTChoKSwobmV3IG5iKGgsdGhpcy5GKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuTygpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVthLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuU2l8fG9iLHBiPW5ldyBvYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5Wa3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLktjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9ITApO3ZhciBiPXRoaXMuWGcoYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLktjPWIpO2lmKCF0aGlzLklnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHxhLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9CmEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLkluKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGc6ZnVuY3Rpb24oYSl7dGhpcy5oY3x8KHRoaXMuaGM9W10pO3RoaXMuaGMucHVzaChhKX0sdWw6ZnVuY3Rpb24oKXtpZih0aGlzLmhjJiZ0aGlzLmhjLmxlbmd0aClmb3IodmFyIGE9CjA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuS2MpcmV0dXJuIHRoaXMuS2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuWGcoYSkpcmV0dXJuIHRoaXMuS2M9YX19LFhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxJbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2EmJmEucmVzdW1lRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnJlc3VtZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx4aDpmdW5jdGlvbihhKXt0aGlzLmZhPWF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciByYj1jLkxqfHxyYjsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm5hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpP3RoaXMuQygpOih0aGlzLkplfHwodGhpcy5KZT0xKSx0aGlzLkplKyssMTAwPHRoaXMuSmU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTApKX19KX0pKGMpO3ZhciBzYj1jLktqfHxzYjsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9CmEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLksoYyl8fCh0aGlzLkwoYyksKG5ldyBzYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5PKCl9fSl9KShjKTt2YXIgdGI9Yy5Nanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy50cHx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudWt8fHZiOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFBjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxHbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuaWJ8fCh0aGlzLmliPVtdKTt0aGlzLmliLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5qYSgpOnRoaXMubSgiYWRlcnJvciIsCmEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkduKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuUGMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7cmV0dXJufWlmKCF0aGlzLkNjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmliJiZ0aGlzLmliLmxlbmd0aCYmMTx0aGlzLmliLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuaWIubGVuZ3RoLQoxO2IrKykxMDA5IT10aGlzLmliW2JdJiYzMDMhPXRoaXMuaWJbYl0mJjQwMyE9dGhpcy5pYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTt0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkwoYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy52a3x8CnhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk5qfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlcoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy52Zj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuem4oKX0uYmluZCh0aGlzKSw1MDApfSx6bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSwKYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy52ZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy52Zik7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJgphLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx0bzpmdW5jdGlvbigpe3RoaXMudmY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWW09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnVjfHwodGhpcy51Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/Cih3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWW0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnRvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBCYj1jLmNrfHxCYjsoZnVuY3Rpb24oYyl7Yy5laz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLApiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5HbHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuYms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CnRoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSwKMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53bCgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YT10aGlzLkliKCk7CjA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUG0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LFBtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT0KYz8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTmg9YVtlXSk7cmV0dXJuIHRoaXMuTmh9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/YT90aGlzLkliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLk8oKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT1bXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD0KYltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpO2lmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLmdkfHxIYixJYj1uZXcgSGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMubmt8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/dGhpcy5XKGIpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGpxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJgooYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LFpjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFRhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Janx8WDsoZnVuY3Rpb24oYyl7Yy5Iaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy53Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLndmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMud2YmJmMhPXRoaXMud2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8Zi5SKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5zcSksdGhpcy5DKCksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhqfHxZOyhmdW5jdGlvbihjKXtjLkpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy5BZigpOnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRyxLYj1jLkpqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE1iPWMueWt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm9qPQpyLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sY2k6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2IuSXNQYXVzZWQoKSYmYi5QbGF5KCk6KGIuUGxheSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCEwKX0uYmluZCh0aGlzKSwxMCkpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMub2p8fE5iOyhmdW5jdGlvbihjKXtjLm5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2UoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmkoKSl9fSxpOmZ1bmN0aW9uKGEpe3RoaXMuQyhhKX19KX0pKGMpOwp2YXIgT2I9Yy5uanx8T2I7KGZ1bmN0aW9uKGMpe2MucGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLnBqfHxQYixRYj1uZXcgUGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmI9Yy51bnx8UmI7bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxjaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQnJpZFBsYXllciJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7CnZhciBTYj1jLlhpfHxTYjsoZnVuY3Rpb24oYyl7Yy5ZaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT1hKXRoaXMuQ2UoKTtlbHNle2lmKCJvYmplY3QiPT10eXBlb2YgYSlpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnZhc3RFcnJvckNvZGUmJihhPWFbYl0udmFzdEVycm9yQ29kZSk7CmVsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWWl8fFRiOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycyxiO2ZvcihiIGluIGEpe3ZhciBjPW5ldyBTYihhW2JdKTtjLmhhfHx0aGlzLksoYyl8fCh0aGlzLkwoYyksd2luZG93LmJyaWRwbGF5ZXI9YywobmV3IFRiKGMsdGhpcy5GKSkuZigpKX19dGhpcy5PKCl9fSl9KShjKTt2YXIgVWI9Yy5aaXx8VWIsVmI9bmV3IFViKHQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLk9tfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpO2Vsc2V7Zm9yKHZhciBiPWE7YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlUoKX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9CiExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxIbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5lZCYmCih0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkFrfHxYYjsoZnVuY3Rpb24oYyl7Yy56az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2guYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5Gaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwKMzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkZrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XaCgpO3RoaXMubGcoKTt0aGlzLktuKCl9LEtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuRm4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuRm49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy56a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQms9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYS5IbigpLGE9bmV3IFliKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksCmEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBaYj1jLkJrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMud218fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmxrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZG49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGNpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRufSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy4kZChhKX0uYmluZCh0aGlzKSl9LCRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMubGt8fE47KGZ1bmN0aW9uKGMpe2Mua2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLk9lKWlmKHRoaXMuT2J8fAoodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5obygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuT2U9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnhiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTT1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9CmEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmtrfHxPOyhmdW5jdGlvbihjKXtjLm1rPQpwLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fAp0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLkFmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgYmM9Yy5ta3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Paj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuT2p8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRWp8fFo7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE9dGhpcy5SYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5VaD1mLlNiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsCnRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09CmEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxFYTpmdW5jdGlvbigpe3RoaXMuemE9CiEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkRqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Gaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBlYz1jLkZqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5MbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5sanx8aGM7KGZ1bmN0aW9uKGMpe2Mua2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBpYz1jLmtqfHwKaWM7KGZ1bmN0aW9uKGMpe2MubWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLk8oKTtyZXR1cm59aWYoIXRoaXMuSyhhKSl7dGhpcy5MKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5PKCk7cmV0dXJufX10aGlzLk8oKX19KX0pKGMpO3ZhciBqYz1jLm1qfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Ua3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQmUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5NPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfSxCZTpmdW5jdGlvbigpe2lmKCF0aGlzLnlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuTygpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlNrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuT2Q9W107dGhpcy56Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWWo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmJpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy56Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMuemZbZF07dGhpcy5YZihjKSYmKHRoaXMuT2QucHVzaChjKSx0aGlzLmJpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQ9YVtmXSxkPXRoaXMuemZbZF0sdGhpcy5YZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxiaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sdm86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuT2QubGVuZ3RoO2ErKyl0aGlzLk9kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2RbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuWWp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuZGp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5MYyhrLlNvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5MYyhrLmhuKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7aWYoZG9jdW1lbnQuYm9keSl7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSl9ZWxzZSB0YXJnZXRXaW5kb3c9d2luZG93O3ZhciB2Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHdjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLG09ITE7SC5nYSgpO0gueWgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmdhKCksZnVuY3Rpb24oYyl7bXx8CihtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueWgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7Zi5OZSh3aW5kb3csZi5WKDEwKSx7fSk7dmFyIGlhPWYuVigxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLm1ufHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuU2g9dGhpcy5jb25mPXRoaXMuTGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkpkPTA7dGhpcy5oYj0iIjtmLnZiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtibzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5oYj10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFluOmZ1bmN0aW9uKGEpe3RoaXMuTGI9YX0sWG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5oYl0mJnRoaXMuY29uZlt0aGlzLmhiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gY30sJGM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuem0oKSl0aGlzLkxiLmcodGhpcy5MYi5RYyx0aGlzLkxiLnFhLHRoaXMuTGIueWYsZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5MYi5pYyk7ZWxzZSBpZihsLkRiJiYhbC5IaSlsLldtKGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbT1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTsKYyYmbS54bygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTtRPW09bmV3IFFhKG0sdGhpcy5MYixoKTttLlZuKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgcD0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihwPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEocCl9YXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuZ2YmJihkPXRoaXMucGxheWVyLmdmKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTttLmpmKGEsZCxnKTt0aGlzLnBsYXllci5laShtKX19LHptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuSmQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy5KZC5nZXRUaW1lKCksdGhpcy5KZD1hLDNFNTxjPyEwOiExOwp0aGlzLkpkPWE7cmV0dXJuITF9LG5vOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5XZyhhKSk/dGhpcy4kYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfSxtbzpmdW5jdGlvbihhKXtpZighdGhpcy5TaCl7Zi5GZigicG9zdHJvbGwiKTtmLnZiKCJwb3N0cm9sbCIpO3RoaXMuYm8oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuV2coZCkpP3RoaXMuJGMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8KITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfX0sV2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LE5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIua28odGhpcy5tby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5NYSgpfSxUZDpmdW5jdGlvbihhKXtmLnZiKCJtaWRyb2xsIik7Zi5GZigibWlkcm9sbCIpO2lmKCF0aGlzLkhoKXt0aGlzLkhoPSEwO3ZhciBjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLiRjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoPSExfS5iaW5kKHRoaXMpLDFFMykpOgooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LE1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuYW8odGhpcy5UZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5tZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5ubygpO3RoaXMucGxheWVyLm1mJiZ0aGlzLk1uKCk7dGhpcy5ObigpfX19KShjKTt2YXIgZmE9Yy5MaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yz1jLkpvfHx1YztuZXcgdWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoYWl4ZUNlZWRUaGVlc29oaixhaXhlQ2VlZFRoZWVzb2hqKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
88.198.59.89 Nuremberg, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.88-198-59-89.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Mon, 16 Mar 2020 20:08:39 GMT
Last-Modified
Wed, 15 May 2019 12:58:56 GMT
Server
openresty/1.15.8.2
ETag
"5cdc0d10-18"
Access-Control-Allow-Methods
GET
Content-Type
application/octet-stream
Access-Control-Allow-Credentials
true
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame F206
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4220d6aee16a6d6ec76f75fb0396a7684e6282cb0a0325a6b5a41c034fc87121

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
le.php
media.oadts.com/www/delivery/ Frame 77A0
43 B
413 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5051&bannerid=0&eventId=9&cb=95350127630
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:39 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 77A0
43 B
413 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5051&bannerid=0&eventId=10&cb=31552008977
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:39 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 77A0
43 B
413 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5051&bannerid=0&eventId=11&cb=6526800450
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:39 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
avc.php
media.oadts.com/www/delivery/ Frame 77A0
12 KB
13 KB
XHR
General
Full URL
https://media.oadts.com/www/delivery/avc.php?zoneid=5051&pw=100%25&ph=100%25&msgId=atg9910650679&startmuted=1&cb=0.6790122900330589&loc=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&autostart=1
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
5ec634d70d5b1e33f924c225ea2a7ab4c9451b1ca4665d7c84e79b4613f6e4c1

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:39 GMT
Server
lighttpd/1.4.45
Access-Control-Max-Age
86400
P3P
CP="CUR ADM OUR NOR STA NID"
Access-Control-Allow-Origin
https://www.pcgameshardware.de
Cache-Control
private, max-age=0, no-cache
Access-Control-Allow-Credentials
true
Content-type
application/json
Content-Length
12697
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 77A0
43 B
413 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5051&bannerid=0&eventId=12&cb=50337400926
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:39 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
data
lb35.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb35.s400.meetrics.net/data?/hQk4K01AALlnFFUkzF2BP3eAAAAAAABdyJAPAAAFAAdyJTCDTAPAAAjCA6HBBCDTAZAAAOA55A55A85B55A58E55A55AFA0wAw5AzBErCDTAPFCAjCA6HBHCDTAPAAAAAAiQBKUOaASksFjGjAAAAAAAAAAAAEAAAdyJAAAAAAAHAklFzrF0vFwBFQAhyF0pFrlFsfFz0FhuFkhFykFeAkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFHA53Aw4Ey1A1BEMAxzA4yA1zA41A22A55AGAkpFylFj0FAAAAIAy4AxyA11Az1AKA04A41A43A1wA50AKAw1FiwFlyFmvFytFKA04A41A43A1wA50AKA04A41A43A1wA50AIBlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEw1FiwFlyFmvFytFdjCA6HBKPA/DAFAAACDTAAAAANAR1FhsFp0F5GFvvF0lFyBFAAAAAAAAAAAAAAAAQtjFSdu9SA
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 16-Mar-20 20:08:38 GMT
data
lb35.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb35.s400.meetrics.net/data?/hQk4L11AA/k0FWdmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A23Ax0A3yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFmwEshFjlF9hEy0FprFlsFfzF0hFukFhyFkmBhwFi9BihFuuFlyFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A40Az4A5zAx2A05AwmEvyFthF0jFvkFl9BTrF5zFjyFhwFlyFfxB2wAmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA45Aw0AwxAy4AmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9zEr5FmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21Aw1AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A3zA43AwxAmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21AxyAmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF95A32A2wA3zA1mAjpFk9BxzA4yAz5Ax3A3wAzwAmzEp6Fl9Bx4ExmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF95A32A2wA3zA1mAhwFk9B53A22Aw3Az1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA23AwyAmvFytFh0FjvFklF9RE1hFspF05FGvFv0FlyFmhEk2F9yA4xAy1A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A14A31Aw5A0mAjpFk9BxzA4yA1zA41A22A55AmzEp6Fl9B53Aw4Ey1A1mAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9wE1iFwlFymFvyFtmBhwFj9B04A41A43A1wA50AmhEwkF90A44A14A31Aw5A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEw1FiwFlyFmvFytFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA5wA30AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA4xAy1A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF90A5zAzwA2yA02AzmAjpFk9BxzA4yA20Az0Aw4AywAmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFymAhwFj9B05AzzAw2Ay0A2zAmhEwkF90A5zAzwA2yA02AzmAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEylFj0FhuFnsFlyBmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA5zAwwATkzFARksFAQtjFZfOKnA
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 16-Mar-20 20:08:38 GMT
truncated
/ Frame BDAB
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
fd512671e0ccc61ac39750171265320df3afcb783b233ac90ed40061e73bd848

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
lb35.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb35.s400.meetrics.net/data?/hQk4M91AALlnFGUkzFYBPdBAAAAAAABerGAPAAAFAAerGTPhsAPAAAAAAAAABPhsAZBAAOA55A55A85B55A58E55A55AFAy3Az1A4BErPhsASksFmGjAAAAAAAAAAAAEAAAerGAAAAAAAHAklFzrF0vFwBFQAhyF0pFrlFsfFz0FhuFkhFykFeAkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFHAzwAx4Ey1AwBEMAxzA4yA20Az0Aw4AywAGAkpFylFj0FAAAAIAy4AxyA11Az1AKA05AzzAw2Ay0A2zAKAylFj0FhuFnsFlyBKA05AzzAw2Ay0A2zAKA05AzzAw2Ay0A2zAIBlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEylFj0FhuFnsFlyBdAAAAAAAAAAAAFAAAPhsAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFyt+6SA
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 16-Mar-20 20:08:38 GMT
data
lb35.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb35.s400.meetrics.net/data?/hQk4N91AA/k0FWimvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A23Ax0A3yAmzEp6Fl9B3yA44E5wAmzEp0Fl9BkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFmwEshFjlF9hEy0FprFlsFfzF0hFukFhyFkmBhwFi9BihFuuFlyFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A40Az4A5zAx2A05AwmEvyFthF0jFvkFl9BTrF5zFjyFhwFlyFfxB2wAmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA45Aw0AwxAy4AmzEp6Fl9BxyAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9zEr5FmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21Aw1AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA55A32A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF91AzyAx0A3wA32AymAjpFk9BxzA4yA44A3zA43AwxAmzEp6Fl9BzwAw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFmhEwjF91AzyAx0A3wA32AymAhwFk9B1zAyxA03Aw3A2yAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGyFljF0hFunFslFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA21AxyAmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF95A32A2wA3zA1mAjpFk9BxzA4yAz5Ax3A3wAzwAmzEp6Fl9Bx4ExmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF95A32A2wA3zA1mAhwFk9B53A22Aw3Az1AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFklByGEhyF0pFrlFsfFz0FhuFkhFykFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA23AwyAmvFytFh0FjvFklF9RE1hFspF05FGvFv0FlyFmhEk2F9yA4xAy1A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A14A31Aw5A0mAjpFk9BxzA4yA1zA41A22A55AmzEp6Fl9B53Aw4Ey1A1mAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9wE1iFwlFymFvyFtmBhwFj9B04A41A43A1wA50AmhEwkF90A44A14A31Aw5A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEw1FiwFlyFmvFytFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA5wA30AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA4xAy1A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF90A5zAzwA2yA02AzmAjpFk9BxzA4yA20Az0Aw4AywAmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFymAhwFj9B05AzzAw2Ay0A2zAmhEwkF90A5zAzwA2yA02AzmAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEylFj0FhuFnsFlyBmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA5zAwwAmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F9yA4xAy1A1zA1mAjwFpkF9kElzFr0FvwFmhEwhF90A5zAzwA2zAx5A1mAjpFk9BxzA4yA20A20A5zAz5AmzEp6Fl9BzwAy4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFwjFnhFtlFzoFhyFk3FhyFluBklFfzFkmBwsFhjFl9BhyF0pFrlFsfFz0FhuFkhFykFmhEwiF9yEljF0hFunFslFzmAhwFj9B05AzzAw2AzxA51AmhEwkF90A5zAzwA2zAx5A1mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEylFj0FhuFnsFlzBmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA14A0zA45AzxA5zAw5ATkzFARksFAQtjF1D35uA
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 16-Mar-20 20:08:38 GMT
userconnect.js
js.adscale.de// Frame F616
13 KB
5 KB
Script
General
Full URL
https://js.adscale.de//userconnect.js
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/getads.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.60.16.116 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-60-16-116.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
f42c1660abb2f7cab90dbb53e00646b993e52af97b452f929d2828735e3fd55b

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

x-amz-version-id
CUS4UlFYDRvq1QJqkBG1fpWORbOoTsem
Content-Encoding
gzip
Last-Modified
Wed, 11 Mar 2020 22:16:27 GMT
Server
AmazonS3
x-amz-request-id
ABF67314557C0B6F
ETag
"a60e8a5ff130c8f08ffb04322194a45e"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Mon, 16 Mar 2020 20:08:39 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4178
x-amz-id-2
zgC1qlyzV6uiTnGPOdKWtPXlY+2OZ/poZ1ECVIj+sol2WnorfhUrvsNB4bK1FHaONjg3g24LrVo=
impr
gaa.adscale.de/ Frame 4F2C
488 B
724 B
Script
General
Full URL
https://gaa.adscale.de/impr?v=2&sid=b3ba06a3-ed89-4016-8bc7-405fced49d02&nu=0&t=1584389319319&iFrame&ssl=1&pos=above&ws=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&uuid=253ca734-6251-4cce-aa51-d29670883c4e
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/getads.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.185.214.82 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-185-214-82.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
38cdd1d888b19fb9f901184bb9ae0976f81bbfb846eebb76e824d26a56508504

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

status
200
date
Mon, 16 Mar 2020 20:08:39 GMT
cache-control
no-cache
p3p
CP=NOI PSA OUR
x-robots-tag
none
content-length
488
content-type
text/javascript
impr
gaa.adscale.de/ Frame BDAB
488 B
724 B
Script
General
Full URL
https://gaa.adscale.de/impr?v=2&sid=fc43ae9a-7f57-49c6-96cb-695920e570d5&nu=0&t=1584389319322&iFrame&ssl=1&pos=below&ws=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&uuid=66f508e4-ddeb-4b7b-9bce-86e1f23bb687
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/getads.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.185.214.82 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-185-214-82.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
90544f91855b26f04d78e50d32a7093766645479ff524fd28231aa6cee610aa7

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

status
200
date
Mon, 16 Mar 2020 20:08:39 GMT
cache-control
no-cache
p3p
CP=NOI PSA OUR
x-robots-tag
none
content-length
488
content-type
text/javascript
getAd
video-adserver.ibillboard.com/ Frame 77A0
48 B
603 B
XHR
General
Full URL
https://video-adserver.ibillboard.com/getAd?tagid=d9915971-6900-4502-9602-3f2f1a3d6d98&bust=3abd1354a4&ref=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.125 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-125.billboard.cz
Software
nginx/1.16.1 /
Resource Hash
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:41 GMT
Server
nginx/1.16.1
Vary
*
Content-Type
text/xml
Access-Control-Allow-Origin
https://www.pcgameshardware.de
Cache-Control
private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
48
Expires
Tue, 01 Jan 1991 00:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 77A0
43 B
307 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5051&bannerid=23395&eventId=21&plr=3&cb=0.48221665147256476&loc=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2Fhttps%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&dur=0
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
185.22.221.117 , Germany, ASN60955 (WAVECON, DE),
Reverse DNS
wv-gw1.wavecloud.de
Software
lighttpd/1.4.45 /
Resource Hash
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:39 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
/
ssl.2.damoh.pcgameshardware.de/4fbafaa03aabbe29e1e32787678f2aa09df3cd2d/ Frame FABB
120 B
693 B
XHR
General
Full URL
https://ssl.2.damoh.pcgameshardware.de/4fbafaa03aabbe29e1e32787678f2aa09df3cd2d/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpeGVDZWVkVGhlZXNvaGo9YWl4ZUNlZWRUaGVlc29oanx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cuc2Z8fCh3LnNmPTApO3cuc2YrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5zZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxELmxlbmd0aDtjKyspRFtjXS5sb2FkKCk7CmZvcihjPTA7YzxELmxlbmd0aDtjKyspe3ZhciBhPURbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXt0cnl7Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChjKXt9aWYobSl7dmFyIGE9dmMoZnVuY3Rpb24oKXtmLk5lKHdpbmRvdyxILnltKCkse2lkOmF9KX0sNTAwKTtpZihmLnduKWwuRGwoKTtlbHNle20ucGF1c2VCdXR0b258fChtLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BhdXNlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKbS5wbGF5QnV0dG9ufHwobS5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3BsYXkxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5tdXRlQnV0dG9ufHwobS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS51bm11dGVCdXR0b258fChtLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0uc2tpcGFibGVCdXR0b258fChtLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bS5za2lwQnV0dG9ufHwobS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKG0uc2lkZWxvYWRzKXt2YXIgYj1mdW5jdGlvbigpe307bS5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgZSYmKGU9ZSgpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtmLmZiKGEsZSxbXSxiLGIsbCl9KX1sLmcobS5nbG9iYWxDb25maWcsbS5jbGllbnRDb25maWcsbS5wcmVjaGVja2VkLG0ub25SZWFkeSxtLm9uRmFpbHVyZSxtKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgZT1tLnN0YXJ0UGxheWVyO2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgZSYmZSgpfX1lbHNlIHdjKGVhLDUwKX1mdW5jdGlvbiB0KGMsYSl7aWYoZi5kbClmLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLm8oay5IYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpOwpiJiZmLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9sLkNhPSEwOmYudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGZhO2IuR2YoYyk7Yi5ZbihsKTtiLlhuKG0pO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKGwuemIubGVuZ3RoKXt2YXIgYj1sLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGU7ZT1mLmZvKHsiW0xPQURTQ1JJUFRdIjpmLlYoMTApLCJbVVRJTFNdIjpmLlYoMTApLCJbQ0FMTEJBQ0tdIjpmLlYoMTApfSk7d2luZG93W2VbIltMT0FEU0NSSVBUXSJdXT1mLkZoLmJpbmQoZik7d2luZG93W2VbIltVVElMU10iXV09bDtmb3Iod2luZG93W2VbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBlIGluIGIpbVtlXT1iW2VdO3QoYyxhKX07ZT1iLnNjcmlwdHMuc2hpZnQoKTspZi5GaChlLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLlVrfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLk5iPSJzZXR1cCI7dGhpcy5hZD1bXTt0aGlzLkZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQ24uYmluZCh0aGlzKSk7dGhpcy51Yj17fTt0aGlzLnJoPXt9O3RoaXMuRGY9ITE7dGhpcy5KYz1bXX1jLnNqPWE7YS5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYTtmb3IoYSBpbiB0aGlzLnViKXRoaXMudWIuaGFzT3duUHJvcGVydHkoYSkmJgooYis9YSt0aGlzLnViW2FdKyJfIik7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dGhpcy5EZnx8KHRoaXMuRGY9Zi5WKDEwKSk7cmV0dXJuIHRoaXMuRGZ9LHZiOmZ1bmN0aW9uKGIpe3RoaXMudWJbYl18fCh0aGlzLnViW2JdPTApO3RoaXMudWJbYl0rPTE7NTx0aGlzLnViW2JdJiYhdGhpcy5yaFtiXSYmKHRoaXMucmhbYl09ITAsIm5ld0JpZ0FkSWQiPT1iJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy53bygpLCEwKSl9LEZlOmZ1bmN0aW9uKCl7dGhpcy5aPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUWs6ZnVuY3Rpb24oYil7dGhpcy5aLmVycm1zZy5wdXNoKGIpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihiLAphKXt0cnl7Yi5jb250ZW50V2luZG93JiYoYj1iLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31iJiZiLnBvc3RNZXNzYWdlJiZiLnBvc3RNZXNzYWdlKGEsIioiKX0sbWE6ZnVuY3Rpb24oYixhLGQpe3RoaXMucG9zdE1lc3NhZ2UoYix7dHlwZToidnBhaWQiLGV2ZW50OmEsZGF0YTpkfSl9LENuOmZ1bmN0aW9uKGIpe2ImJmIuZGF0YSYmYi5kYXRhLnR5cGUmJiJ2cGFpZCI9PWIuZGF0YS50eXBlJiZ0aGlzLkJuKGIuZGF0YSl9LEJuOmZ1bmN0aW9uKGIpe2lmKHRoaXMuWiYmdGhpcy5aLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBhPXRoaXMuWi5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxhO2QrKyl0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyJiZ0aGlzLlouZXZlbnRsaXN0ZW5lcltkXSYmYi5ldmVudD09dGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0uY2IoYil9LHllOmZ1bmN0aW9uKGIsYSl7dGhpcy5aLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTpiLApjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2goYiksZD0hMTtpZihhKXJldHVybiB0aGlzLktkKGIsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6YX0sZnVuY3Rpb24oYil7dHJ5e2Q9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sZ2g6ZnVuY3Rpb24oYil7dmFyIGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGE9YS5leGVjKGIpKSYmKGFbMl18fGFbNV0pKXtpZihhWzJdKXJldHVybiBhWzJdO2lmKGFbNV0pcmV0dXJuIGFbNV19ZWxzZSBpZihhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGE9YS5leGVjKGIpKSYmYVs0XSlyZXR1cm4gYVs0XTtyZXR1cm4hMX0sT2s6ZnVuY3Rpb24oYixhKXtpZihhJiYKISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09YSl7aWYoZi5SbChiKSlyZXR1cm47KGE9dGhpcy5OZyhiKSl8fChhPWIpfTA9PT1hLmluZGV4T2YoIi8vIikmJihhPSJodHRwczoiK2EpO3RoaXMuWi51cmxzW2JdPWE7dGhpcy5aLnVybHNbYV09Yjt0aGlzLlouaG9tYWRVcmxzW2JdPWE7dGhpcy5aLm9yaWdpbmFsVXJsc1thXT1ifX0sUmw6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5aLmhvbWFkVXJsc1tiXSYmKGE9dGhpcy5aLmhvbWFkVXJsc1tiXSk7cmV0dXJuIGF9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5vcmlnaW5hbFVybHMmJnRoaXMuWi5vcmlnaW5hbFVybHNbYl0mJihhPXRoaXMuWi5vcmlnaW5hbFVybHNbYl0pO3JldHVybiBhfSxLbTpmdW5jdGlvbihiKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1ifHwiYWJvdXQ6c2VsZiI9PWJ8fCIiPT1ifSxTZTpmdW5jdGlvbihiKXtpZighYnx8Im9iamVjdCIhPT10eXBlb2YgYilyZXR1cm4gMDsKdmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSsrO3JldHVybiBhfSxmaDpmdW5jdGlvbihiLGEpe3ZhciBkPWJbYV07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0saW86ZnVuY3Rpb24oYixhLGQpe2ImJihiLnN0eWxlW2FdPWQpfSxJZjpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD10aGlzLkFsKGEpLGc9MDtnPGQubGVuZ3RoO2crKyl0aGlzLmlvKGIsZFtnXS5rZXksZFtnXS52YWx1ZSl9LGdsOmZ1bmN0aW9uKGIpe2lmKCJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuIiI7dHJ5e3JldHVybiBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSl9Y2F0Y2goYSl7cmV0dXJuIiJ9fSxBbDpmdW5jdGlvbihiKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGE9CltdLGQ9e30sZz1kPSIiLHE9MDtxPGIubGVuZ3RoO3ErKyl7dmFyIGM9YltxXS5zcGxpdCgiOiIpLGQ9Y1swXS50cmltKCk7Y1sxXSYmY1sxXS50cmltP2c9Y1sxXS50cmltKCk6Zz0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoYz1kLnNwbGl0KCItIiksZD1jWzBdK3RoaXMuZ2woY1sxXSkpO2Q9e2tleTpkLHZhbHVlOmd9O2EucHVzaChkKX1yZXR1cm4gYX0sUGY6ZnVuY3Rpb24oYil7Zm9yKDtiIT1kb2N1bWVudC5ib2R5JiZudWxsIT1iOyliPWIucGFyZW50RWxlbWVudDtyZXR1cm4gYj09ZG9jdW1lbnQuYm9keT8hMDohMX0sQWg6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhiPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWIudG9wJiYwPD1iLmxlZnQmJmIuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sYWY6ZnVuY3Rpb24oYixhKXt2YXIgZD0wLGc9MCxxPTAsYz0wLGY9ITE7aWYoIWJ8fCFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgaD1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFoKXJldHVybiExO3E9aC5oZWlnaHQqaC53aWR0aDtkPWgud2lkdGg7Zz1oLmhlaWdodDswPmgudG9wJiYoZys9aC50b3ApO2guYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZy09aC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+aC5sZWZ0JiYoZCs9aC5sZWZ0KTtoLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5nJiYoZz0wKTswPmQmJihkPTApOzA8cSYmKGM9MTAwL3EqZCpnKTtjPj1hJiYoZj0hMCk7cmV0dXJuIGZ9LGJmOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuYWYoYi5lbCxiLnBlcmNlbnQpO2Iuc3RhcnRUaW1lfHwoYi5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGEpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWIuc3RhcnRUaW1lPj1iLnRpbWVNUyl7Yi5jYigpO3JldHVybn19ZWxzZSBiLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmYoYil9LmJpbmQodGhpcyksMTAwKX0sU2I6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiP01hdGguYWJzKGIpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGIpKgooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFY6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYwPGI/TWF0aC5yb3VuZChiKToxMDtmb3IodmFyIGE9IiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LFVlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYTtmb3IoZD0wO2Q8Yi5sZW5ndGg7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBhfSxKZjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGIpe3ZhciBlPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9Yj4+PjQqZCYxNSxlKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gZX1mdW5jdGlvbiBkKGIsYSl7cmV0dXJuIGI8PGF8Yj4+PjMyLWF9dmFyIGcscSxjPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsaD00MDIzMjMzNDE3LApBPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx5LHQscDtiPWImJiJzdHJpbmciPT09dHlwZW9mIGI/YjoiIjtuPWIubGVuZ3RoO3ZhciByPVtdO2ZvcihnPTA7ZzxuLTM7Zys9NClxPWIuY2hhckNvZGVBdChnKTw8MjR8Yi5jaGFyQ29kZUF0KGcrMSk8PDE2fGIuY2hhckNvZGVBdChnKzIpPDw4fGIuY2hhckNvZGVBdChnKzMpLHIucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWIuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWIuY2hhckNvZGVBdChuLTIpPDwyNHxiLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9Yi5jaGFyQ29kZUF0KG4tMyk8PDI0fGIuY2hhckNvZGVBdChuLTIpPDwxNnxiLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHIucHVzaChnKTsxNCE9ci5sZW5ndGglMTY7KXIucHVzaCgwKTtyLnB1c2gobj4+PjI5KTtyLnB1c2gobjw8CjMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyljW2ddPWQoY1tnLTNdXmNbZy04XV5jW2ctMTRdXmNbZy0xNl0sMSk7cT1mO249aDttPUE7eT1rO3Q9bDtmb3IoZz0wOzE5Pj1nO2crKylwPWQocSw1KSsobiZtfH5uJnkpK3QrY1tnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD15LHk9bSxtPWQobiwzMCksbj1xLHE9cDtmb3IoZz0yMDszOT49ZztnKyspcD1kKHEsNSkrKG5ebV55KSt0K2NbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9eSx5PW0sbT1kKG4sMzApLG49cSxxPXA7Zm9yKGc9NDA7NTk+PWc7ZysrKXA9ZChxLDUpKyhuJm18biZ5fG0meSkrdCtjW2ddKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXkseT1tLG09ZChuLDMwKSxuPXEscT1wO2ZvcihnPTYwOzc5Pj1nO2crKylwPWQocSw1KSsobl5tXnkpK3QrY1tnXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD15LHk9bSwKbT1kKG4sMzApLG49cSxxPXA7Zj1mK3EmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O0E9QSttJjQyOTQ5NjcyOTU7az1rK3kmNDI5NDk2NzI5NTtsPWwrdCY0Mjk0OTY3Mjk1fXJldHVybihhKGYpK2EoaCkrYShBKSthKGspK2EobCkpLnRvTG93ZXJDYXNlKCl9LGFiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGcscSxjLGYsaCxBPTA7QTxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQoQSsrKSxnPWIuY2hhckNvZGVBdChBKyspLHE9Yi5jaGFyQ29kZUF0KEErKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zz4+NCxmPShnJjE1KTw8MnxxPj42LGg9cSY2Myxpc05hTihnKT9mPWg9NjQ6aXNOYU4ocSkmJihoPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGYpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpO3JldHVybiBhfSxGbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci5wbHVnaW5zIGluc3RhbmNlb2YgUGx1Z2luQXJyYXkmJjAhPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD93aW5kb3cuSGE/ITA6ITE6ITB9LEJkOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT0hMSxkPSExLGc9ITEscT0hMSxjPSExLGY9ITEsaD0hMSxBPSExLGs9ITEsbD0hMTt0cnl7YT10aGlzLmxsKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYKKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5mYz8hMDohMX1jYXRjaCh0KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGs9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksQT0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KGt8fHEpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWc7Yi5pc09wZXJhPQpxO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1mO2IuaXNJRT1oO2IuaXNFZGdlPUE7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSxEYTpmdW5jdGlvbigpe3ZhciBiPXtQaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxXaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx2bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxTajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx3azpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sR2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxnazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHwKbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlBpKCl8fGIuV2koKXx8Yi52bSgpfHxiLlNqKCl8fGIud2soKXx8Yi5HaigpfHxiLmdrKCl9fTtyZXR1cm4gbnVsbCE9Yi5aaygpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPQpiW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxlKXthJiYoZC5xdWVyeUtleVthXT1lKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHE9Yi5sZW5ndGg7ZzxxOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LFI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9CiEwKTtyZXR1cm4gZH0saW06ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LEZsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV09ITA7Zm9yKHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dfHxnLnB1c2goYltxXSk7cmV0dXJuIGd9LG9vOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rCjYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHEpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGFoOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy52aShhKSsiOiIrdGhpcy52aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sdmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LEZmOmZ1bmN0aW9uKGIpe3RoaXMuTmI9Yn0sTmU6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5OYjt0aGlzLnZlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChxKXt0aGlzLnduPQohMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LExjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZShkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxxLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtxJiYoeD1rLlNhKHgscSkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtmLkxjKHgpfSxEbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8CmIuY29ycm9ib3JhdGVfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmltKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPQpiLmR1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGF9LHBvOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5sYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudmUoYil9LHZlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwucWMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9CmE7bC5LYShiLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bC5xYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShnLCEwKTtnPWwudmEoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7CnRyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZz0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZz0hMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxjZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPWwucWMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bC52YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkthKGQpfX0sa2Y6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2YoKX0uYmluZCh0aGlzKSwKNTAwKX0sUWU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLnRiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxUZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sdGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5HZChiKToiIn0sR2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5UZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LEFlOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS5jZihiKXx8dGhpcy5LbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LkJmJiZ3aW5kb3cuc2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5CZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5aZyhiKSlyZXR1cm4gdGhpcy5aZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuYWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBmPQohMTtkPSExO2Q9dGhpcy5mYihiLGEuQWEsYyxmdW5jdGlvbihiKXtmPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2Z8fChmPWQpLGY9SlNPTi5wYXJzZShmKX1jYXRjaChoKXtmPSExfWYudXJsJiZmLmhhc2gmJihmPWEuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGYuaGFzaCkpO3RoaXMuT2soZixiKTtyZXR1cm4gZn0sZmI6ZnVuY3Rpb24oYixhLGQsZyxjLGYsaCx4KXt2YXIgaz1mfHxsO2Y9ITA7eCYmKGY9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixmKTtmPWsudmEoYixmKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2YuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWYuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGYsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmIoYixhLGQsZyxjLGssaCx4KX0uYmluZCh0aGlzKSw1MDApfSxLZDpmdW5jdGlvbihiLGEsZCxnLGMsZixoKXt2YXIgeD0hMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWYsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sVG06ZnVuY3Rpb24oYixhLGQpe3RoaXMuS2QoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuYWQpZm9yKHZhciBjIGluIHRoaXMuYWQpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5hZFtjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2YuYWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5mYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlRtKGcuSWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFkPWJ9LERiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5mYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChmKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LERtOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKylpZihhW2ddPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxBYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnNqfHxQO25ldyBQO3ZhciBmPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnJqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuZ249e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EucXA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2EuSWw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5zcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnVnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLm1nPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5yZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS52Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuR2s9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLnBnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuWG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmZuPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkpsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5ycD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEud2Q9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5IYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2EudGc9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLklrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5tZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Euc2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EudWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLkhrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EuRGk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5rbj17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlZmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EucHA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuVG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuU289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5obj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5yanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQ2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkNsfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRqPWE7YS5wcm90b3R5cGU9e1VlOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZyxjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWc9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZyxhfD0wO3JldHVybiBNYXRoLmFicyhhKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxlbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LEVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5FZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5VZSh0aGlzLmthKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LHltOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2EoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLlVlKHRoaXMuZW0oKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5FZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy50anx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLnFufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihlKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBlKWdbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZVtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChlW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZTtyZXR1cm4gZ319KGMsZVtjXSk6ZVtjXTtlPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307ZS5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWU7ZS5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGV9O2MuJGk9YX0pKGMpO3ZhciBLPWMuJGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5jbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuWGo9Sy5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5MYT17fTt0aGlzLkY9bnVsbDt0aGlzLlhjPTEwMDt0aGlzLlRiPTA7dGhpcy5WYT0xNTA7dGhpcy5aYj0wO3RoaXMuWm4oYSl9LGY6ZnVuY3Rpb24oKXt9LE86ZnVuY3Rpb24oKXt0aGlzLlRiPD10aGlzLlZhPyh0aGlzLlRiKyssdGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSk6MD50aGlzLlZhJiYodGhpcy5aYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlhjKSl9LFRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVGI+dGhpcy5WYT8hMDohMX0sQWY6ZnVuY3Rpb24oKXt0aGlzLlRiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxabjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxMOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5rYSgpXT0KYTtMJiZMLkVoJiZMLnZvKGEpfSxicTpmdW5jdGlvbigpe3JldHVybiBmLlNlKHRoaXMuTGEpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZTtmb3IoZSBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZV0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5rYSgpXT8hMDohMX0sRW06ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx3cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcD1jLlhqfHxwOyhmdW5jdGlvbihjKXtjLlpqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuWGM9MTA7dGhpcy5UYj0wO3RoaXMuVmE9NTA7dGhpcy5YPW51bGw7dGhpcy5oYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuTWI9IiI7dGhpcy5RZz0hMTt0aGlzLkkoKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGU9dGhpcy5UYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZSlhLmNvbnRhaW5lcklkPWUuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxJOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30sa286ZnVuY3Rpb24oYSl7dGhpcy5YPWF9LGNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWH0sYW86ZnVuY3Rpb24oYSl7dGhpcy5uZj1hfSxhcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5mfSxtZjpmdW5jdGlvbigpe30sTzpmdW5jdGlvbigpe3RoaXMuVGI8PXRoaXMuVmEmJih0aGlzLlRiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5JLmJpbmQodGhpcyksdGhpcy5YYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSx5cTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5ybSgpfHx0aGlzLktrKCk7dGhpcy5SZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LAplcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxLazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZi5WKDEwKSl9LHJtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFplOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYX0sVTpmdW5jdGlvbigpe3RoaXMuaGE9ITB9LFpjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxnZjpmdW5jdGlvbigpe3JldHVybiExfSxlaTpmdW5jdGlvbihhKXt0aGlzLk1iPWF9LCRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWJ9LFpoOmZ1bmN0aW9uKCl7dGhpcy5NYj1udWxsfSxncTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuTWImJihhPSEwKTtyZXR1cm4gYX0sdHE6ZnVuY3Rpb24oKXt0aGlzLlFnfHwodGhpcy5RZz0hMCl9LFBlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5aanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRj10aGlzLnBsYXllcj0iIjt0aGlzLmpnPSIxIjt0aGlzLmtnPSIyIjt0aGlzLkRrPSIzIjt0aGlzLmhkPTA7dGhpcy4kbT0zMDt0aGlzLmJjPVtdO3RoaXMub2I9W107dGhpcy53Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy53Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuaGQ7dGhpcy5pZD1mLlYoMTApO3RoaXMuR2YoYSk7dGhpcy4kbihiKX0sZjpmdW5jdGlvbigpe30samE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxmLmtmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1EmJlEub2MmJiFtYSYmKG1hPSEwLGYudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx4bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5nYSgpXXx8KHdpbmRvd1tiLmdhKCldPXt9KTt3aW5kb3dbYi5nYSgpXVthLmthKCldfHwod2luZG93W2IuZ2EoKV1bYS5rYSgpXT17fSx3aW5kb3dbYi5nYSgpXVthLmthKCldLmluaXRpYXRvcj1mLmxjKCkpO3dpbmRvd1tiLmdhKCldW2Eua2EoKV1bZi5sYygpXT93aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV0rKzp3aW5kb3dbYi5nYSgpXVthLmthKCldW2YubGMoKV09MX0sQm06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZT1uZXcgSTt3aW5kb3dbZS5nYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXSYmd2luZG93W2UuZ2EoKV1bYS5rYSgpXS5pbml0aWF0b3IhPWYubGMoKSYmKHRoaXMuSGYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBlPSEwO2EmJihlPSExKTtpZighdGhpcy55YSgpKXt0aGlzLnhtKCk7CmlmKCF0aGlzLkJtKCkpe2YudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkhmKCk7cmV0dXJufXRoaXMuSGYoKTt0aGlzLkYodGhpcy5nZXRQbGF5ZXIoKSxlKTt0aGlzLnJpKCk7dGhpcy53Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy55YSgpfHwodGhpcy5iYy5wdXNoKGEpLHRoaXMub2IucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHJpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5iYyYmMDx0aGlzLmJjLmxlbmd0aCYmKHRoaXMuYmM9Zi51bmlxdWUodGhpcy5iYyksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYmMuam9pbigiLCIpKSk7aWYodGhpcy5vYil7Zm9yKHZhciBlPTA7ZTx0aGlzLm9iLmxlbmd0aDtlKyspdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl09PXRoaXMud2NbYV0mJmIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksdGhpcy53Y1t0aGlzLm9iW2VdLnJlYXNvbl08CnRoaXMud2NbYV0mJihiPVtdLGIucHVzaCh0aGlzLm9iW2VdLmRldGFpbCksYT10aGlzLm9iW2VdLnJlYXNvbik7dGhpcy53Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihlPWYudW5pcXVlKGIpLGE9YSsiLSIrZS5qb2luKCItIikpO2YudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2d9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmpnfSxIZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2d9LGhvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Ea30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmhkfSxvZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5qZ30sTnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMua2d9LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmhkfSxHZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSwkbjpmdW5jdGlvbihhKXt0aGlzLkY9YX0sY206ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GfSxYbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmVqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy5lanx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuaGp8fG9hOyhmdW5jdGlvbihjKXtjLmlqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5PcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuamEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmlqfHxwYTsoZnVuY3Rpb24oYyl7Yy5qaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgcGEoYSx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIHFhPWMuamp8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT2k9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLk9pfHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Caj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMud2I9ITE7dmFyIGE9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5ZZygpO3RoaXMuTWUoKTt0aGlzLnhsPSExfSxtcTpmdW5jdGlvbigpe3JldHVybiExfSxZZzpmdW5jdGlvbigpe3RoaXMud2I9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLndiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5NZSgpO2lmKHRoaXMud2IpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxNZTpmdW5jdGlvbigpe2lmKCF0aGlzLndiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMud2I9ITApOwp0aGlzLlcoYil9fSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5YJiYoMCx0aGlzLlgpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sbWY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXI7YS5fZXZlbnRzJiZhLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuVGQoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlRkKGIpfS5iaW5kKHRoaXMpKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLm5mJiYoMCx0aGlzLm5mKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9CmEuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LFBlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7CnJldHVybiBifX0pfSkoYyk7dmFyIHNhPWMuQmp8fHNhOyhmdW5jdGlvbihjKXtjLkFqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEk6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5oZDt0aGlzLmlzUGxheWluZz10aGlzLnJlPSExO3RoaXMudGU9MTt0aGlzLmpkPVtdO3RoaXMuR2I9ITF9LG9xOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5yZT0hMTt0aGlzLnRlPTE7dGhpcy5qZD1bXTt0aGlzLkdiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXt9O2lmKGEuZ2V0Q29uZmlnKWlmKGI9YS5nZXRDb25maWcoKSxiLmFkdmVydGlzaW5nKXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzKWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmCmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnRlPWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5HYj0hMCk7ZWxzZXtpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlIGluc3RhbmNlb2YgQXJyYXkpZm9yKHZhciBlPTA7ZTxiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmxlbmd0aDtlKyspaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZVtlXS50YWcpe3RoaXMuR2I9ITA7YnJlYWt9Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5HYj0hMCk7Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy5HYj0hMCl9Yi5hZHZlcnRpc2luZy50YWcmJih0aGlzLkdiPSEwKX1lbHNlIHRoaXMudygibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7dmFyIGQ9CiJhZFBsYXkgYWRDbGljayBhZEltcHJlc3Npb24gYWRNZXRhIGFkU2tpcHBlZCBhZFRpbWUiLnNwbGl0KCIgIik7aWYoZi5SKCJzcGllZ2VsLmRlIikmJi0xIT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpKXthLm9uKCJiZWZvcmVQbGF5IixmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5qdy12aWRlbyIpOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtiLmZvckVhY2goZnVuY3Rpb24oYil7ImF0dHJpYnV0ZXMiIT1iLnR5cGV8fCJzcmMiIT1iLmF0dHJpYnV0ZU5hbWV8fHRoaXMucm58fC0xIT1iLnRhcmdldC5zcmMuaW5kZXhPZigidmNkbjAxIil8fCh0aGlzLnJuPSEwLGIudGFyZ2V0LnNyYz0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iK2YuYWIoYi50YXJnZXQuc3JjKSx6LmJpbmQodGhpcykoKSl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSkub2JzZXJ2ZShiLAp7YXR0cmlidXRlczohMCxjaGlsZExpc3Q6ITAsY2hhcmFjdGVyRGF0YTohMH0pfS5iaW5kKHRoaXMpKTt2YXIgZyxjLGgsej1mdW5jdGlvbigpe2g9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiei0xMCIpO2Zvcih2YXIgYj0wO2I8aC5sZW5ndGg7YisrKWhbYl0uY2xhc3NMaXN0LnJlbW92ZSgiei0xMCIpO2c9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5wYXJlbnRFbGVtZW50O2I9andwbGF5ZXIoKS5nZXRDb250YWluZXIoKTtjPWIuc3R5bGU7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSItIisoYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55LWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWFyZWE9J2hlYWRlci1iYXInXSIpLm9mZnNldEhlaWdodCkrInB4IjtiLnN0eWxlLmxlZnQ9IjBweCI7Yi5zdHlsZS53aWR0aD0iMTAwJSI7Yi5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IiwxNipiLm9mZnNldFdpZHRoLzkrInB4IiwKImltcG9ydGFudCIpO2Iuc3R5bGUuekluZGV4PTFFMztiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Yi5sb2FkKCk7Yi5wbGF5KCl9O2Eub24oImFkQ29tcGxldGUiLGZ1bmN0aW9uKCl7Zy5pbnNlcnRCZWZvcmUoandwbGF5ZXIoKS5nZXRDb250YWluZXIoKSxnLmZpcnN0Q2hpbGQpO2p3cGxheWVyKCkuZ2V0Q29udGFpbmVyKCkuc3R5bGU9Yztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXtpZihnJiZjKXtnLmluc2VydEJlZm9yZShqd3BsYXllcigpLmdldENvbnRhaW5lcigpLGcuZmlyc3RDaGlsZCk7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5zdHlsZT0KYztmb3IodmFyIGI9MDtiPGgubGVuZ3RoO2IrKyloW2JdLmNsYXNzTGlzdC5yZW1vdmUoInotMTAiKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7andwbGF5ZXIoKS5nZXRDb250YWluZXIoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXS5wbGF5KCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSl9Zm9yKGU9MDtlPGQubGVuZ3RoO2UrKylhLm9uKGRbZV0sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtlXSYmKHRoaXMucmU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtlXSYmdGhpcy5MaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLiRtJiYhdGhpcy55YSgpJiYodGhpcy5HYj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5pKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsCjFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMueWEoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5NYjtiJiYoYi5OZCgpLGIueGQoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuVmd8fCh0aGlzLlZnPVtdKTt0aGlzLlZnLnB1c2goe2NvZGU6YS5jb2RlLG1zZzphLm1lc3NhZ2V9KTt2YXIgYj1hLnRhZzstMT09dGhpcy5qZC5pbmRleE9mKGIpJiZ0aGlzLmpkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuamEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJgowPGEubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMudygiZW1wdHkiKToodGhpcy5tKCJhZGVycm9yIixhLmNvZGUpLHRoaXMuamQubGVuZ3RoPj10aGlzLnRlJiZ0aGlzLmkoKSl9LFhtOmZ1bmN0aW9uKGEpe3RoaXMuaigiSlc6ICIrYS50eXBlKX0saTpmdW5jdGlvbihhKXthP3RoaXMuTGU/dGhpcy5MZSsrOnRoaXMuTGU9MTp0aGlzLktlP3RoaXMuS2UrKzp0aGlzLktlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtmLlBmKGIudmlkZW9UYWcpP2Iud2I/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5yZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuS2U+dGhpcy5MZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLllnKCksYi5NZSgpLGIud2J8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHRhPWMuQWp8fHRhOyhmdW5jdGlvbihjKXtjLkNqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuWmwoKXx8IWEuYXV0aG9yaXR5fHwhYS5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGUmJmUoKS5pZCl7YT1bXTtpZigxPGIubGVuZ3RoKWZvcihlPTA7ZTxiLmxlbmd0aDtlKyspYS5wdXNoKGJbZV0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGEucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgc2Eod2luZG93Lmp3cGxheWVyKGFbYl0pKTtlLndifHx0aGlzLksoZSl8fHRoaXMuRW0oZSl8fCh0aGlzLkwoZSksZT1uZXcgdGEoZSx0aGlzLkYpLGUuSSgpLGUuZigpKX19dGhpcy5PKCl9fSxacDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxabDpmdW5jdGlvbigpe3ZhciBhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGYuYWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQ2p8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9CmE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgd2E9Yy5Ya3x8d2E7bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mucms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuJGQoYSl9LmJpbmQodGhpcykpfSwKJGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5jdXJyZW50VGltZSgpLGE9YS5kdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTImJnRoaXMuWCYmdGhpcy5YKCl9LFplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBiPUpTT04ucGFyc2UoYSk7aWYoYi5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGUpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChlKXtiPSExfWImJmEuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEuY3VycmVudFRpbWUpcmV0dXJuIGEuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLnJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5xaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnphPXRoaXMuUmM9dGhpcy5CYT10aGlzLnBkPSExO3RoaXMuVWg9Zi5TYigxMCk7dGhpcy54aT0hMDt0aGlzLkNjPXRoaXMudmg9ITE7dGhpcy5lbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksCnRoaXMueWIoKSl9LGVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLlIoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX0sdXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmthKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixhLlksIjsiLHR5cGVvZiBhLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWT9hLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlk/dHlwZW9mIGEuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkcsIjsiLHR5cGVvZiBhLkcsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGEuRz9hLkcuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5JYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5HJiZhLkcuSWE/YS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IixhLkcmJmEuRy5JYT90eXBlb2YgYS5HLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEucWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5HP2EuRy5xZToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnFlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5wYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYS5HP2EuRy5wYToidW5kZWZpbmVkWCIsIjsiLGEuRz90eXBlb2YgYS5HLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS56ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuRz9hLkcuemU6InVuZGVmaW5lZFgiLCI7IixhLkc/dHlwZW9mIGEuRy56ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlVoKX0sT2M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPQphLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGIpe319cmV0dXJuIHRoaXMuaW1hfSxQYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLk9jKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0sCmloOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUmMpe3ZhciBhPXRoaXMuT2MoKTthJiYoYS5hZHNNYW5hZ2VyJiYodGhpcy5SYz1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMuUmM9YS5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5SY30sQ206ZnVuY3Rpb24oKXtpZighdGhpcy51aCl7dmFyIGE9dGhpcy5PYygpLGI9dGhpcy5BbSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxBbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMucGQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLnBkPSEwKTtyZXR1cm4gdGhpcy5wZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBjKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGU9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihlPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PQp0eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5lYShiLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXt0aGlzLkxuKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sTG46ZnVuY3Rpb24oKXt0aGlzLkNjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnlhKCkpe3ZhciBiPSJhZEVycm9yIixlPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk0pO3RoaXMuZGEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtmLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKwoic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkRjPSEwO2lmKGYuUigiY2hpcC5kZSIpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2YudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2YudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwphLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuRGM9ITA7Zi5SKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5EYz0hMDtmLlIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5EY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuZGEoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxZcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYKKHRoaXMuTWc9YS5hZHMpO3JldHVybiB0aGlzLk1nfSxobDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWR0cmlnZ2VyIixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmRhKCEwKTt0aGlzLm0oInRyaWdnZXIiLCJIT01BRCIpfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy5kYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5lYShiKTt0aGlzLmRhKCk7dGhpcy5tKCJhZGVycm9yIiwKdGhpcy5NKX0uYmluZCh0aGlzKSk7YS5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpO3RoaXMuTGgoKX0uYmluZCh0aGlzKSl9LHpkOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e2lmKGhvbWFkVXRpbHMmJmhvbWFkVXRpbHMuUylob21hZFV0aWxzLkNhJiYoYT0hMCk7ZWxzZXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuQ20oKSl7dmFyIGI9dGhpcy5PYygpLAplPXRoaXMuUGMoKTtiJiZlJiYodGhpcy5DY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNjP3RoaXMudygpOih0aGlzLmRhKCEwKSx0aGlzLm0oIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLnZoP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5PYygpLGE9dGhpcy5QYygpO2ImJiFhPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuZGEoKSk6KHRoaXMuZGEoITApLHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy55YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZT0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PQpifHw0MDM9PWIpZT0hMDtlfHwhYi5pbmRleE9mfHwtMT09PWIuaW5kZXhPZigiMTAwOSIpJiYtMT09PWIuaW5kZXhPZigiMzAzIikmJi0xPT09Yi5pbmRleE9mKCI0MDMiKXx8KGU9ITApOyJudW1iZXIiPT10eXBlb2YgYiYmKGEuTT1iLGEubSgiYWRlcnJvciIsYikpfXJldHVybiBlfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGU9YS5nZXRFcnJvcigpO2lmKGUuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRFcnJvckNvZGUmJmIoZS5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxpbDpmdW5jdGlvbigpe3RoaXMuSWN8fCh0aGlzLkljPSJ1bmtub3duIik7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkcyl7aWYodGhpcy5JYyE9YS5hZHMuc3RhdGUmJih0aGlzLkljPWEuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLkljKXt0aGlzLncoImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuSWM9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlsKCl9LmJpbmQodGhpcyksMTApfSx4YjpmdW5jdGlvbigpe3ZhciBhPSEwO2YuT2c/KGE9ITEsdGhpcy5tKCJhZGVycm9yIiwiY29va2llbW9kZSIpKTphPXRoaXMuemE7cmV0dXJuIGF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0saHE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZGE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhiKCk/Cih0aGlzLncoKSx0aGlzLmphKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMueWEoKXx8KGF8fCh0aGlzLnhpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLnhpLGZ1bmN0aW9uKCl7dGhpcy56ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMuaXF8fCgxMDx0aGlzLmJwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmRhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuYnArKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5TbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ybCgpfS5iaW5kKHRoaXMpLDUwKSkpfSxTbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYKIXRoaXMuY3Ape3RoaXMuY3A9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5kYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5xa3x8eWE7KGZ1bmN0aW9uKGMpe2Muc2s9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuaWkod2luZG93KTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl0cnl7Yj1ifHx0aGlzLmlpKGFbZV0pfWNhdGNoKGQpe310aGlzLk8oKX19LGlpOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1iLmxlbmd0aCYmCihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGYuU2UoYikpe2Zvcih2YXIgZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJihhPW5ldyB4YShiW2VdKSxhLmhhfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTChhKSwobmV3IHlhKGEsdGhpcy5GKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LE86ZnVuY3Rpb24oKXt0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuWGMpfX0pfSkoYyk7dmFyIHphPWMuc2t8fHphLEFhPW5ldyB6YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBCYT1jLmZqfHxCYTtuZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy50Zj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmKGI9YS5wYXJlbnROb2RlKSwhYikpe3RoaXMuVSgpO3JldHVybn10aGlzLlQoYik7KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlUoKX0seW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5NYixlPXRoaXMua2EoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIub2MmJigwPD1lLmluZGV4T2YoZCl8fApiLk5kKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy50Zj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LHVhOmZ1bmN0aW9uKCl7dGhpcy50ZisrO2lmKDEwPHRoaXMudGYpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTphLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sJGQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX19KX0pKGMpO3ZhciBSPWMuVWp8fFI7KGZ1bmN0aW9uKGMpe2MuVGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXtpZighdGhpcy5PZSlpZih0aGlzLk9ifHwodGhpcy5PYj0KMCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5PYisrLDE1PHRoaXMuT2IpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5PZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZWEoYik7dGhpcy54YigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk0pLHRoaXMuaSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBlPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWU9ITA7ZXx8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChlPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk09YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBlPWEuZ2V0RXJyb3IoKTtpZihlLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0RXJyb3JDb2RlJiZiKGUuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5NPXRoaXMuTXx8ITE7dGhpcy5CYSgpO3ZhciBiPXdpbmRvdy5vdlZpZGVvO2J8fChiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2ImJmIucmVnaXN0ZXJFdmVudCYmIXRoaXMuTWw/KGIucmVnaXN0ZXJFdmVudChiLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLm5hKCl9LmJpbmQodGhpcykpLGIucmVnaXN0ZXJFdmVudChiLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5NKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5NbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLnluKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXImJih0aGlzLnBsYXllcj1uZXcgUih3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTsKdGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuVGp8fENhOyhmdW5jdGlvbihjKXtjLlZqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZT1uZXcgUihhW2JdKTtlLmhhfHx0aGlzLksoZSl8fCh0aGlzLkwoZSksKG5ldyBDYShlLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRGE9Yy5Wanx8RGEsRWE9bmV3IERhKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5zbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuc218fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnlqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1mLmZoKGEsImVsZW1lbnRJRCIpO3N3aXRjaChhLmVsZW1lbnRQYXRoKXtjYXNlICJ1cCI6Yi5wYXJlbnROb2RlJiYKKGI9Yi5wYXJlbnROb2RlKX10aGlzLkFuPWEucG9zaXRpb25pbmc7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5zdHlsZS53aWR0aD1hLndpZHRoO2Uuc3R5bGUubWluV2lkdGg9YS53aWR0aDtlLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7ZS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7ZS5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtlLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5Bbil7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZSk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYil9dGhpcy5UKGUpO3RoaXMuVyhlKTsKdGhpcy5DZD1lfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQ2QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkNkKX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtmLkFoKHRoaXMuQ2QpO2YuYWYodGhpcy5DZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFsKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LGdmOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy55anx8R2E7KGZ1bmN0aW9uKGMpe2MueGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkMoITApfX0pfSkoYyk7dmFyIElhPWMueGp8fElhOyhmdW5jdGlvbihjKXtjLnpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGE9Cm0uaW5yZWFkLGI9Zi5maChhLCJlbGVtZW50SUQiKTtpZihmLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuSyhhKSkpe3RoaXMuTChhKTsobmV3IElhKGEsdGhpcy5GKSkuZigpO3JldHVybn10aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnpqfHxKYSxLYT1uZXcgSmEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGE9Yy5ibHx8TGE7bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT0Ke319Yy51aj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LExrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBDPWMudWp8fEM7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixhLGQsZyxjKXt0aGlzLkZhPWI7dGhpcy4kZz10aGlzLkdpPSExO3RoaXMuTWg9ZDt0aGlzLmppPSExOyJzdHJpbmciPT09dHlwZW9mIGImJih0aGlzLkZhPW5ldyBDKGIpKTt2YXIgaD10aGlzLmxiPW5ldyBYTUxIdHRwUmVxdWVzdDtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFhfHw0IT1oLnJlYWR5U3RhdGV8fDIwMCE9aC5zdGF0dXMmJjIwMSE9aC5zdGF0dXN8fGEoaCk7ZCYmND09aC5yZWFkeVN0YXRlJiYyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzP2QoaCk6ND09CmgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmwmJmwuZGYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9Yy52aj1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5GYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYil7dmFyIGE9YixiPSIiLGQ7Zm9yKGQgaW4gYSliKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFbZF0pO2I9Yi5zdWJzdHIoMSl9dGhpcy4kZyYmKGIrPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dGhpcy5sYi51cmxDYWxsZWQ9dGhpcy5GYS51cmw7dHJ5e3RoaXMuamk/dGhpcy5sYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCExKTp0aGlzLmxiLm9wZW4odGhpcy5GYS5tZXRob2QsdGhpcy5GYS51cmwsITApLHRoaXMuR2l8fAoodGhpcy5sYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMubGIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLHRoaXMubGIuc2VuZChiKX1jYXRjaChnKXtiPXRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfa2V5Iil8fHRoaXMuRmEuZGF0YS5oYXNPd25Qcm9wZXJ0eSgiaG9tYWRfdHJhY2tfdmFsdWUiKSxsJiZsLmRmKHRoaXMuRmEudXJsKSYmIWI/Zi50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJjYXRjaCIsITApOmwuZGYodGhpcy5GYS51cmwpLHRoaXMuTWgmJnRoaXMuTWgoKX1yZXR1cm4gdGhpcy5sYn19fSkoYyk7dmFyIE1hPWMudmp8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5HYT10aGlzLm1lPSExfWMuYWo9CmE7YS5wcm90b3R5cGU9e2VvOmZ1bmN0aW9uKGIpe3RoaXMubWU9Yn0sY286ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxRbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXt4cDoiQWRDbGlja1RocnUiLHpwOiJBZEVycm9yIixBcDoiQWRTdG9wcGVkIixEcDoiQWRMaW5lYXJDaGFuZ2UiLEVwOiJBZFRhZ1BhcnNlZCIsSHA6IkFkVmlkZW9Db21wbGV0ZSIsS3A6IkFkTG9hZGVkIixMcDoiQWRTa2lwcGVkIixNcDoiQWRTdGFydGVkIixCcDoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLENwOiJBZEltcHJlc3Npb24iLHlwOiJBZENyZWF0aXZlVmlldyIsRnA6IkFkVmlkZW9NaWRwb2ludCIsR3A6IkFkUGF1c2VkIixJcDoiQWRWaWRlb1N0YXJ0IixKcDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7CmZvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5tZSxhW2RdKX0sUG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmxlKWZvcih2YXIgYSBpbiB0aGlzLkdhLmxlKXRoaXMuR2EubGUuaGFzT3duUHJvcGVydHkoYSkmJmIodGhpcy5HYSx0aGlzLkdhLmxlW2FdKTt0aGlzLkdhJiZ0aGlzLkdhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkdhLmdldEVycm9yKCl9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5tZSYmdGhpcy5RbigpO3RoaXMuR2EmJnRoaXMuUG4oKX19fSkoYyk7dmFyIE5hPWMuYWp8fE5hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5DYT0hMTt0aGlzLnFiPSIiO3RoaXMucWQ9dGhpcy5lYz10aGlzLnBiPW51bGw7dGhpcy5UZz10aGlzLnpiPXRoaXMuZmY9ITE7dGhpcy5BYT0iIjsKdGhpcy5lZj0hMTt0aGlzLnFhPXRoaXMuUWM9IiI7dGhpcy4kZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy55Zj0hMTt0aGlzLmlhPVtdO3RoaXMuV2U9dGhpcy5WYj0iIjt0aGlzLmplPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuaWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLm5iPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLmFjPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLldiPSIiO3RoaXMuWGI9W107dGhpcy5ZYj1bXTt0aGlzLmJkPVtdO3RoaXMudGM9IiI7dGhpcy5IYj0hMTt0aGlzLlpkPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMubmM9ITE7dGhpcy5IZz10aGlzLmVlPW51bGw7dGhpcy5MZj10aGlzLmpiPXRoaXMuU2c9dGhpcy5iZT10aGlzLldmPXRoaXMuc2Q9dGhpcy54Yz0hMTt0aGlzLmJiPXtnbG9iYWw6ITEsY2xpZW50OiExLApjdXN0b21lcjohMX07dGhpcy5IZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5FYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmtkPXRoaXMubGQ9IiI7dGhpcy5EYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5ZYz10aGlzLlFkPW51bGx9Yy53aj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5DYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXI6dGhpcy5wYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZWMsYWR0YWdyZWdleDp0aGlzLnFkLGJpdHJhdGU6dGhpcy5QYSxqc3BvcHVwczp0aGlzLmZmLHNpZGVsb2Fkczp0aGlzLnpiLGRpc2FibGV0ZXN0czp0aGlzLlRnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuZWYsZ2xvYmFsQ29uZmlnOnRoaXMuUWMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLiRlLApzZXJ2ZXI6dGhpcy5pYSxzdm1Db25maWc6dGhpcy5WYixob21hZEFkcGF0aDp0aGlzLldlLEhPTUFEX1ZFUklGSUVEOnRoaXMuamUsSE9NQURfQkxPQ0tFRDp0aGlzLmllLEhPTUFEX05PQkxPQ0tFUjp0aGlzLm5iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmFjLHRlc3RIaWRlOnRoaXMuV2IsdGVzdFRhZ3M6dGhpcy5YYix0ZXN0VGFnc0pTOnRoaXMuWWIsdGVzdFRhZ3NYSFI6dGhpcy5iZCx0ZXN0M1BDb29raWU6dGhpcy50Yyx0aHJvdHRsZTp0aGlzLlpkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubmMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5IZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5zZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5XZix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5iZSxjb25maWdGYWlsdXJlczp0aGlzLmJiLHNpdGVDb25maWc6dGhpcy54YSxzZXJ2ZXJJZDp0aGlzLkNmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuZWIsdnBhaWQ6dGhpcy5qYixza2lwQWxsb3dlZDp0aGlzLkxmLHZtYXBzOnRoaXMuYWcsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLkVjLGFkRmFsbGJhY2tVUkw6dGhpcy5sZCxhZEZhbGxiYWNrQ29uZmlnOnRoaXMua2QseWllbGRsYWI6dGhpcy5EYn19LFduOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkNhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLnFiPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMucGI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy5lYz1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLnFkPWIuYWR0YWdyZWdleCk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLmZmPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy56Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLlRnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5lZj1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5RYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJgoodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLiRlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuaWE9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5WYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuV2U9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuamU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy5pZT1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy5uYj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLmFjPWIuSE9NQURfQURCTE9DS0VSKTsKInVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuV2I9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuWGI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5ZYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLmJkPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy50Yz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuWmQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMubmM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmCih0aGlzLkhnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnhjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuc2Q9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuV2Y9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5iZT1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuYmI9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy54YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLkNmPWIuc2VydmVySWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLmViPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuamI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuTGY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuYWc9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy5FYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMubGQ9Yi5hZEZhbGxiYWNrVVJMKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tDb25maWcmJih0aGlzLmtkPWIuYWRGYWxsYmFja0NvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi55aWVsZGxhYiYmKHRoaXMuRGI9Yi55aWVsZGxhYil9LApxbTpmdW5jdGlvbigpe3ZhciBiPSExLGE7Zm9yKGEgaW4gdGhpcy5iYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmJiW2FdJiYxPT10aGlzLmJiW2FdJiYoYj0hMCk7cmV0dXJuIGJ9LEVmOmZ1bmN0aW9uKGIpe3RoaXMuYmJbYl09ITB9LCRsOmZ1bmN0aW9uKCl7dmFyIGI9W10sYTtmb3IoYSBpbiB0aGlzLmJiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuYmJbYV0mJjE9PXRoaXMuYmJbYV0mJmIucHVzaChhKTtyZXR1cm4gYn0sWGQ6ZnVuY3Rpb24oYil7Yj1ifHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGI7Yj1iLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIiwKZG9jdW1lbnQuVVJMKTtiPWIucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBiPWYuJGsoYil9LHZhOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZz0iIixjPSIiLGY9IiIsaD0iIjtpZighdGhpcy5DYSYmIWEpcmV0dXJuIG5ldyBDKGIpO2c9dGhpcy5jZihiKTtjPXRoaXMuYWEoYik7Zz8odGhpcy5TYygpP2Y9YjpmPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGg9Yy5wYXRoLnN1YnN0cigxKSk6KGY9dGhpcy5xYygpLGg9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLnFifHx0aGlzLnBifHx0aGlzLmVjfHx0aGlzLnFkKSYmKGg9dGhpcy5ibihoKSk7Yj1uZXcgQyhmKTtiLnVybD1mO2Y9IiI7Zj1nP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmJtKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD0KaDtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5hYihoKTtiLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGJ9LGNmOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGIpKSYmKGRbMl18fGRbNV0pP2E9ITA6dGhpcy5TYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGIpKSYmZFs0XSYmKGE9ITApKTtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuaWEmJnRoaXMuaWEubGVuZ3RoJiYwPHRoaXMuaWEubGVuZ3RoJiYoYT10aGlzLmlhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj0KYS5zcGxpdCgiLiIpKSYmYlswXSYmIltoYXNoXSI9PWJbMF0/ITE6ITApO3JldHVybiBifSxkZjpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYik7ZCYmKGRbMl18fGRbNV0pP2E9ITA6YT10aGlzLmNmKGIpO3JldHVybiBhfSxibTpmdW5jdGlvbihiKXt2YXIgYT0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuQWEmJjA8dGhpcy5BYS5sZW5ndGgpcmV0dXJuIHRoaXMuQWE7Zm9yKGQgaW4gdGhpcy5BYSlpZihhPXRoaXMuQWFbZF0sYS5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmEudXJsPT09YilyZXR1cm4gYS5UcDtyZXR1cm4ibm9uZSJ9LElkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWFbdGhpcy5DZl19LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JZCgpLGE9dGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIiwKYS5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sSWg6ZnVuY3Rpb24oYixhLGQpe2I9ITE7YT0iIjtpZihkLmV2YWwpdHJ5e2E9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChnKXtiPSEwfWVsc2UgYj0hMDtiJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYT1kLmZhbGxiYWNrKTtyZXR1cm4gYX0sYW46ZnVuY3Rpb24oYixhKXt2YXIgZD1mLmFhKGIpLGc9IiIsZz0iIixjO2ZvcihjIGluIGEpe2lmKGFbY10uc3VidmFsdWVzKXtmb3IodmFyIGg9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZz17fSx6PTA7ejxoLmxlbmd0aDt6Kyspe3ZhciBrPWhbel0uc3BsaXQoIj0iKTtnW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWdbbF09dGhpcy5JaChnW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZyloLnB1c2gobCsiPSIrZ1tsXSk7Zz1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBnPQp0aGlzLkloKGQucXVlcnlLZXlbY10sYyxhW2NdKTtkLnF1ZXJ5S2V5W2NdPWd9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZz1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sYm46ZnVuY3Rpb24oYil7dGhpcy5xYiYmKGIrPXRoaXMucWIpO2lmKHRoaXMucGIpZm9yKHZhciBhIGluIHRoaXMucGIpdGhpcy5wYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGI9Yi5yZXBsYWNlKGEsdGhpcy5wYlthXSkpO2lmKGYuSmMpZm9yKHZhciBkPTA7ZDxmLkpjLmxlbmd0aDtkKyspe3ZhciBnPWYuSmNbZF07Zm9yKGEgaW4gZyliPWIucmVwbGFjZShhLGdbYV0pfXRoaXMuZWMmJihiPXRoaXMuYW4oYix0aGlzLmVjKSk7cmV0dXJuIGJ9LHBsOmZ1bmN0aW9uKCl7dGhpcy54YSYmdGhpcy54YS5jbGllbnRBUElzJiZ0aGlzLmpsKHRoaXMueGEuY2xpZW50QVBJcyl9LGpsOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBOYTtiLnB1Ymxpc2hlckFQSSYmCmEuZW8oYi5wdWJsaXNoZXJBUEkpO2IucGxheWVyJiZhLmNvKGIucGxheWVyKTthLmYoKX19LGc6ZnVuY3Rpb24oYixhLGQsZyxjLGYpe2w9dGhpczt0aGlzLmVmPSEwO3RoaXMuUWM9Yjt0aGlzLnFhPWE7dGhpcy55Zj1kO3RoaXMuZWU9Zzt0aGlzLmljPWM7dGhpcy54YT1mfHx7fTt0aGlzLnBsKCk7dGhpcy5TbSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5xYSl0aGlzLlFtKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEoKSx0aGlzLkdjKCl9Y2F0Y2goaCl7dGhpcy5zYSgibm9DbGllbnRDb25maWciKX1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgdGhpcy5xYSl0cnl7dGhpcy5xYT1hLHRoaXMuR2MoKX1jYXRjaChrKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfX0sZ2I6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwKITAsITEpfXJldHVybiBhfSxEbDpmdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkPSExO3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sU206ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuUWMrdGhpcy54ZSgiZ2xvYmFsIikpLHRoaXMub20uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRWYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5HYygpfS5iaW5kKHRoaXMpLCEwKX0sUW06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy54ZSgiY2xpZW50IiwtMSE9dGhpcy5xYS5pbmRleE9mKCI/IikpKSx0aGlzLkdjLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkVmKCJjbGllbnQiKTt0aGlzLnNhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx4ZTpmdW5jdGlvbihiLGEpe3ZhciBkO2Q9KGE/IiYiOiI/IikrKCJjYWNoZT0iKwp0aGlzLlNiKCkpO3RoaXMueGEmJnRoaXMueGEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnhhJiZ0aGlzLnhhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMuc2Qpe3RoaXMuc2Q9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGUpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7CmZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaWM9ITEpOyJmb2N1cy5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLmljPSExKTt0aGlzLmljJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaWM/dGhpcy5pYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPQp0aGlzLiRlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5nYih0aGlzLmllKSk7dGhpcy5CYigpO2YuTGMoay54bik7KGE9Zi5VYSh0aGlzLklkKCkpKXx8KGE9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sb206ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWYuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJihnPSEwKX1jYXRjaChoKXt9aWYoIShnfHxhLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmEuaGFzT3duUHJvcGVydHkoImZvcmNlX2Rpc2FibGVkIikpKXRyeXthPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csCiIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuaXNFbmFibGVkPXRoaXMuQWIoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5WYnx8dGhpcy5BYXx8dGhpcy5HYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuQmIoKSl9fSxHYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExO3RyeXt2YXIgYz1mLmFhKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2MmJmMuaW5kZXhPZiYmMDw9Yy5pbmRleE9mKCJ0dm5vdyIpJiYoYT0hMCl9Y2F0Y2goaCl7fWM9ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPGQuc2VydmVyLmxlbmd0aDtiKyspe3ZhciBhPQpkLnNlcnZlcltiXTt0cnl7dmFyIGU7KGU9dm9pZCAwPT09YSl8fChlPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5KZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihlKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaCh6KXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pYT1kLnNlcnZlcnx8CltdO2ZvcihiPTA7Yjx0aGlzLmlhLmxlbmd0aDtiKyspdGhpcy5pYVtiXT10aGlzLmlhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZi5SKCJ3ZWIuZGUiKXx8Zi5SKCJnbXgubmV0Iil8fGYuUigiZ214LmF0Iil8fGYuUigiZ214LmNoIil8fGYuUigiMXVuZDEuZGUiKSkmJiF0aGlzLlNjKCkpZm9yKGI9MDtiPHRoaXMuaWEubGVuZ3RoO2IrKyl0aGlzLmlhW2JdPXRoaXMuaWFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5kaShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMua2Q9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuVmI9ZC5jb25maWd8fCIiO3RoaXMuQWE9ZC5hbGlhc3x8bnVsbDt0aGlzLldlPWQuYWRwYXRofHwiIjt0aGlzLkNmPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmlhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuVmImJgp0aGlzLkFhJiZ0aGlzLmlhLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMubmIpKSx0aGlzLkJiKCkpfSxkaTpmdW5jdGlvbihiKXt0aGlzLmxkfHwodGhpcy5sZD1ifHwiIil9LFRjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucWMoKSksZD10aGlzLmFhKHRoaXMuVmIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEModGhpcy5WYit0aGlzLnhlKCJjdXN0b21lciIpKTt0aGlzLkthKGEsdGhpcy55by5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5FZigiY3VzdG9tZXIiKTsKYj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlRjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSx5bzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubmMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm5jPSEwO3RoaXMuVGMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9Zi5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fApkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goeil7fXRoaXMuV2Y9dGhpcy5BYihkLnN0cmljdCk7dGhpcy5iZT10aGlzLkFiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlNnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5lYj10aGlzLkFiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5BYihkLmVuYWJsZWQpO3RoaXMuV2I9ZC50ZXN0aGlkZXx8IiI7dGhpcy5ZYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmJkPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy50Yz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5xYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLnBiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmVjPWQuYWR0YWdtb2RpZmllcl9hZHZ8fApudWxsO3RoaXMucWQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZmY9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYj1kLnZwYWlkfHwhMTt0aGlzLnhhLnZwYWlkPXRoaXMuamI7dGhpcy5MZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnRkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5hZz1kLnZtYXBzfHwiIjt0aGlzLkVjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmRpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5aZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMuRGI9ZC55aWVsZGxhYnx8bnVsbDt0aGlzLlFkPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7IXRoaXMubmMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm5jPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuS28oKSYmCih0aGlzLldifHx0aGlzLllifHx0aGlzLlhifHx0aGlzLmJkKT90aGlzLnlmPyh0aGlzLkNhPXRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpLHRoaXMuRWUoKSx0aGlzLkJiKCkpOnRoaXMuQm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5UZigpKX19LFdtOmZ1bmN0aW9uKGIpe3RoaXMuSGk9ITA7dmFyIGE9ZnVuY3Rpb24oYil7aWYoYj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58ICkiK2IrIj0oW147XSspIikpKXJldHVybiBiWzJdfSgiYWRwX3NlZ3MiKXx8ImUwIixhPXRoaXMuRGIudXJsLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKS5yZXBsYWNlKCJbc2Vnc10iLGVuY29kZVVSSUNvbXBvbmVudChhKSksYT17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6YSxob21hZF91cmxfc3VmZml4X2Jhc2U2NDpmLmFiKGEpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07CmYuS2QodGhpcy5xYygpLCJQT1NUIixhLGZ1bmN0aW9uKGEpe3RyeXt2YXIgZT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXt9Zi50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghZXx8IWUubGVuZ3RoKSwhMCk7dHJ5e2lmKGUmJmUubGVuZ3RoJiZ0aGlzLkRiLnBhcmFtZXRlcil7dmFyIGg9dGhpcy5EYi5wYXJhbWV0ZXIuc3BsaXQoIltpZF0iKS5qb2luKGVbMF0uaWR8fCIwIiksaD1oLnNwbGl0KCJbcHJpY2VdIikuam9pbihlWzBdLnByaWNlfHwwKTt0aGlzLnFiKz1ofX1jYXRjaCh6KXtiKCl9YigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YigpfS5iaW5kKHRoaXMpLCEwKX0sQm86ZnVuY3Rpb24oKXt0aGlzLkFvKCk7dGhpcy5DbygpfSxDbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIithKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrCmErIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtnLndpZHRoPTE7Zy5oZWlnaHQ9MTtnLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2cuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9Zi5WKDEwKSxoPWYuVigxMCksej1mLlYoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHosZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTtnLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoeikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2YuYWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChnKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9Zi5CZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWYuRGEoKSl7aWYodGhpcy54YSYmdGhpcy54YS5wbGF5ZXImJnRoaXMueGEucGxheWVyLmxlbmd0aCl7Zi50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLnNhKCJjc3BfIithKX1mLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxUZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKX0sWWQ6ZnVuY3Rpb24oYSl7dGhpcy54Yz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IoYSkpLHRoaXMuQmIoKSx0aGlzLkVlKCkpfSxBbzpmdW5jdGlvbigpe2lmKHRoaXMuV2Ipe3ZhciBhPWYuQmQoKTtpZigoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiZ0aGlzLkhtKCkpdGhpcy5ZZCh0aGlzLmFjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2E9ITE7dHJ5e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5XYik7ZS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLldiKTsKZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIGQ9MD09PWUub2Zmc2V0V2lkdGh8fDA9PT1lLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGUpO2E9ZH1jYXRjaChnKXt9YT90aGlzLllkKHRoaXMuYWMsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm1pKCl9fWVsc2UgdGhpcy5taSgpfSxSZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuU2IoKSksdGhpcy5GbyhnLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuUWYuYmluZCh0aGlzKSxlLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuUWYoKX19ZnVuY3Rpb24gZSgpe3RoaXMuWWQodGhpcy5hYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5YYj10aGlzLmJkKSYmdGhpcy5YYi5sZW5ndGgpe3ZhciBkPXRoaXMuWGIuc2xpY2UoKSxnPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5RZigpfSxGbzpmdW5jdGlvbihhLGUsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZj8od2luZG93LmNsZWFyVGltZW91dChmKSwhMCk6ITF9dmFyIGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbWk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLlNiKCkpLHRoaXMuR28oZywwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLlJmLmJpbmQodGhpcyksZS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLlJmKCl9fWZ1bmN0aW9uIGUoKXt0aGlzLllkKHRoaXMuYWMsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlliJiZ0aGlzLlliLmxlbmd0aCl7dmFyIGQ9dGhpcy5ZYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlJmKCl9LEdvOmZ1bmN0aW9uKGEsZSxkKXtmdW5jdGlvbiBnKCl7ZigpJiZlKCl9ZnVuY3Rpb24gYygpe2YoKSYmZCgpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZSl7ZT09YSYmZigpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWc7ay5vbmVycm9yPQpjO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sUWY6ZnVuY3Rpb24oKXtpZih0aGlzLnRjKXRyeXtmLktkKHRoaXMudGMsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuSGI9IXRoaXMuQWIoYS5jYyk7dGhpcy5UZigpfS5iaW5kKHRoaXMpLHRoaXMua2kuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5raSgpfWVsc2UgdGhpcy5UZigpfSxraTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZ2IodGhpcy5uYikpO3RoaXMuQmIoKTt0aGlzLkVlKCl9LEhtOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LEJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGU9IjAiO3RyeXtmLkRhKCkmJgooYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnhjJiYoZT0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitlLCEwKTt0aGlzLkNhJiZ0aGlzLmlzRW5hYmxlZCYmdGhpcy5RZCYmdGhpcy5jbCgpO3RoaXMudGMmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5IYiwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmdiKHRoaXMuamUpKTt0aGlzLmVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuZWUmJnRoaXMuZWUoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuSGJ9KX0sY2w6ZnVuY3Rpb24oKXt0aGlzLlljPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWWMuaWQ9Zi5WKDEwKTt0aGlzLlljLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5ZYyk7dmFyIGE9dGhpcy5ZYy5jb250ZW50V2luZG93LGU9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ubG9hZD0KZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5RZC5sZW5ndGg7ZSsrKWQ9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5RZFtlXSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcyk7ZS5zcmM9Zi5BZSgiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYTthPShhPWRvY3VtZW50LmNvb2tpZS5tYXRjaCgvKF58IClhZHBfc2Vncz0oW147XSspLykpP2FbMl06dm9pZCAwO2EmJmYudHJhY2soInN0YXRzX2hkX3NlZ3MiLCJlMCIhPWEsITApfS5iaW5kKHRoaXMpLDJFMyl9LG9sOmZ1bmN0aW9uKCl7aWYodGhpcy5iZSYmdGhpcy5xbSgpKXt2YXIgYT10aGlzLiRsKCk7YSYmYS5qb2luJiZmLnRyYWNrKCJjb25maWdfZmFpbGVkIiwKYS5qb2luKCJfIiksITApfX0scmk6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGUpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxLYTpmdW5jdGlvbihhLGUsZCxnLGMsaCl7dGhpcy5IZHx8KHRoaXMuSGQ9MCk7dGhpcy5IZCsrO3RoaXMuSGQ+dGhpcy5waCYmIXRoaXMucWgmJih0aGlzLnFoPSEwLGYudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5waCwhMCkpO2E9bmV3IE1hKGEsZSxkLG51bGwsYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKSYmYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja192YWx1ZSIpKTtnJiYoYS5HaT0hMCk7YyYmZi5GbSgpJiYoYS4kZz0hMCk7aCYmKGEuamk9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLlptfHwKKHRoaXMuWm09ITAsZi5EYSgpfHxmLmZiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgZT1udWxsLGQ9bnVsbCxnPSIiO3RyeXsoZT1hLnJlc3BvbnNlWE1MKXx8KGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLnNhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihnPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGdbMF0mJihnPWdbMF0pLGcpe2c9ZyYmZy5jaGlsZE5vZGVzJiZnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlNjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKwoiOi8vIitnLmhvc3QpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7YT1mdW5jdGlvbihhKXt2YXIgYj0iIjt0cnl7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiYoYj1hLnRhcmdldC5lcnJvci5jb2RlKX1jYXRjaChkKXt9Zi5uZXR3b3JrU3RhdGU9PWYuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuc2EoIm1lZGlhZmlsZV9ub3NvdXJjZSIrYil9O2YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGEuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIixmdW5jdGlvbigpeyIxLjA0IiE9Zi5kdXJhdGlvbiYmdGhpcy5zYSgibWVkaWFmaWxlX2R1cmF0aW9uIil9LmJpbmQodGhpcykpO2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFwcGVuZENoaWxkKGUpO2Yuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2YubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuc2EoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcykpfSx6bzpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5hZ30sbWw6ZnVuY3Rpb24oKXt0aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnZhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5Xby5iaW5kKHRoaXMpLHRoaXMuVm8uYmluZCh0aGlzKSl9LFdvOmZ1bmN0aW9uKGEpe3ZhciBlPW51bGwsZD1udWxsOwp0cnl7KGU9YS5yZXNwb25zZVhNTCl8fChlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZyl7cmV0dXJufWR8fHRoaXMuS2woKX0sVm86ZnVuY3Rpb24oKXt9LEtsOmZ1bmN0aW9uKCl7Zi5MYyhrLkpsKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLnNhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxFZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnpiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuemIubGVuZ3RoO2ErKyl7dmFyIGU9dGhpcy56YlthXTsicmVxdWVzdCI9PWUudHlwZSYmZi5mYihlLnVybCxlLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWUudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZ2EoKV09dGhpcztmLmZiKGUudXJsLGUuYWxpYXMsCm51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxLbzpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLlpkfSxTYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxWOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBlPSIiLGQ9MDtkPGE7ZCsrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBlfSxBYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxhYjpmdW5jdGlvbihhKXtmb3IodmFyIGU9IiIsZCxnLGMsZixoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz0KYS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxmPWQ+PjIsZD0oZCYzKTw8NHxnPj40LGg9KGcmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGcpP2g9az02NDppc05hTihjKSYmKGs9NjQpLGU9ZSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gZX0sYWE6ZnVuY3Rpb24oYSl7dmFyIGU9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZz0xNDtnLS07KWRbZVtnXV09YVtnXXx8IiI7ZC5xdWVyeUtleT17fTtkW2VbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZSl7YiYmKGQucXVlcnlLZXlbYl09ZSl9KTtyZXR1cm4gZH0sSmY6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZShhKXt2YXIgYj0iIixkLGU7Zm9yKGQ9NzswPD1kO2QtLSllPWE+Pj40KmQmMTUsYis9ZS50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZj1BcnJheSg4MCksCmg9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAscix1LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZz0wO2c8bi0zO2crPTQpYz1hLmNoYXJDb2RlQXQoZyk8PDI0fGEuY2hhckNvZGVBdChnKzEpPDwxNnxhLmNoYXJDb2RlQXQoZysyKTw8OHxhLmNoYXJDb2RlQXQoZyszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGc9MDsxNj5nO2crKylmW2ddPXdbYStnXTtmb3IoZz0xNjs3OT49ZztnKyspZltnXT1kKGZbZy0zXV5mW2ctOF1eZltnLTE0XV5mW2ctMTZdLDEpO2M9aDtuPWs7cD1sO3I9bTt1PXQ7Zm9yKGc9MDsxOT49ZztnKyspdj1kKGMsNSkrKG4mcHx+biZyKSt1K2ZbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGc9MjA7Mzk+PWc7ZysrKXY9ZChjLDUpKyhuXnBecikrdStmW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXIscj1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihnPTQwOzU5Pj1nO2crKyl2PWQoYyw1KSsobiZwfG4mcnxwJnIpK3UrZltnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT1yLHI9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecF5yKSt1K2ZbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXAscD1kKG4sMzApLG49YywKYz12O2g9aCtjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oZShoKStlKGspK2UobCkrZShtKStlKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy53anx8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLldrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUGE9Yy5Xa3x8UGE7bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUsZCl7dGhpcy5hPWE7YS5jLlA/dGhpcy5oYj1hLmMuUCgpOnRoaXMuaGI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5haS5iaW5kKHRoaXMpLG11dGU6dGhpcy5vZi5iaW5kKHRoaXMpLAp1bm11dGU6dGhpcy5Rby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLnNiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuamM9dGhpcy5yZD0hMTt0aGlzLllrPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5BPWU7dGhpcy5rYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuVmQ9e307Zi52YigibmV3QmlnQWRJZCIpO3RoaXMuYWw9Zi5WKDEwKTt0aGlzLk5mPTA7dGhpcy5vZD0iV2VyYnVuZyAtIFt0aW1lXSI7ZCYmZC5hZG1lc3NhZ2UmJih0aGlzLm9kPWQuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBkLmFkbWVzc2FnZSYmKChhPXRoaXMuYS5jKSYmdGhpcy5hLmMubCYmKGE9dGhpcy5hLmMubCgpKSx0aGlzLm9kPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlJrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuV2M9dGhpcy5VZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoPwpwYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMud2U9ITE7dGhpcy51aT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLm9jPSExO3RoaXMuemw9Zi5WKDEwKTt0aGlzLlJiPWYuVigxMCk7dGhpcy5QYj1mLlYoMTApO3RoaXMuZmk9Zi5WKDEwKTt0aGlzLmNvbmY9e307dGhpcy5mZT10aGlzLiRiPXRoaXMuSWU9dGhpcy55ZD10aGlzLldkPXRoaXMuQ2I9dGhpcy52Yz10aGlzLlBoPXRoaXMuSGU9dGhpcy5EZD10aGlzLkxvPXRoaXMuRmI9dGhpcy5RYj0hMTt0aGlzLkFjPVtdO3RoaXMucGM9e307dGhpcy50bj0yMDA7dGhpcy5kZz10aGlzLmRkPXRoaXMuRmM9dGhpcy5jZz10aGlzLnhmPSExO3RoaXMucWY9e319Yy5xaj1hO2EucHJvdG90eXBlPXtWbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmhiXSYmdGhpcy5jb25mW3RoaXMuaGJdW2FdJiYoZT0KdGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gZX0sc2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWYuTmImJmYudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5ZYSgpLCEwKTt0aGlzLnJvKCk7Zi5vKGsuSWssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0samY6ZnVuY3Rpb24oYSxlLGQsYyl7dGhpcy5GYj1kO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkEuUyl0aGlzLk5mKyssZi52YigibmV3U21hbGxBZElkIiksdGhpcy5BLm9sKCksYz1sLmdldENvbmZpZygpLGYuT2cmJih0aGlzLkEuV24oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsCmtlZXBVUkw6ZSxiaXRyYXRlOmMuUGEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkEuamIsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6ZT8odGhpcy5zaSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5BLmpiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5QYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB4Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt4Yy5qZihhLGUsZCl9LDUwKX19LHVmOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO2EuJGEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJ5bCIsImFkIiwhMCk7dGhpcy5mZT10aGlzLiRiPXRoaXMuSGU9dGhpcy5EZD0hMTt0aGlzLmI9YTt0aGlzLmxvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLkFjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5WZD10aGlzLmttKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBlPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGU9dGhpcy5iaChiLnBhcmVudCkpLGUucHVzaCh0aGlzLlZsKGIpKSk7cmV0dXJuIGV9LFZsOmZ1bmN0aW9uKGEpe3ZhciBlPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtlPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmUsY3JlYXRpdmVJRDpkfX0sa206ZnVuY3Rpb24oYSl7dmFyIGU9W10sZD1bXSxjPVtdLGY9W10saD0iIjtpZihhLkope2U9YS5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZi5wdXNoKGgpKTtmb3Ioaz0wO2s8ZS5sZW5ndGg7aysrKWQucHVzaChhLnRiKGVba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczpmLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmYudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTthLiRhJiZmLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyeWwiLCJub2FkIiwhMCk7dmFyIGU9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihlPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQWQmJmEuQWQuZXJyb3ImJmEuQWQuZXJyb3IuY29kZSYmKGU9YS5BZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB2LmZkLmNvZGU6ZT09Ri5uZS5jb2RlP2YubyhrLnFwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk6KGYua2YoKSxlPT1GLmhnLmNvZGUmJmYubyhrLmZuLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOwpmLm8oay5JbCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuc28oKTt0aGlzLldhKCJlbXB0eSIpO3RoaXMuQS5IYiYmZi50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkhiLCEwKTticmVhaztjYXNlIHYuZmcuY29kZTpmLm8oay5Ybyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB2LmlnLmNvZGU6Zi5vKGsucnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIHYub2UuY29kZTpmLm8oay5zcCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoInhtbHBhcnNlIik7YnJlYWs7Y2FzZSB2LmtlLmNvZGU6Zi5vKGsuZ24sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7CmJyZWFrO2Nhc2Ugdi5oZS5jb2RlOmYubyhrLlRvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmYubyhrLlVvLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuV2EoInVua25vd24iKX10aGlzLmtjKGEpO3RoaXMuUWEoKX0sa2M6ZnVuY3Rpb24oYSl7dmFyIGU9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGU9YS5lcnJvci5jb2RlLDkwMTxlJiYoZT05MDApKTtmb3IoZT17IltFUlJPUkNPREVdIjplfTthLk9hLmxlbmd0aDspdHJ5e3ZhciBkPWEuT2EucG9wKCk7dGhpcy5oZihkLnVybCxkLnR5cGUsZSl9Y2F0Y2goYyl7fX0sbG86ZnVuY3Rpb24oYSl7dGhpcy5JZT0hMTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTsKdmFyIGU9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoZT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMua2IuekluZGV4PWU7ZT10aGlzLmEuQjt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksYz0iIjtkJiZkLmVudnZhcnMmJihjPWQuZW52dmFycygpKTtjLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLkZkJiYoYz1kLkZkKCkpO2MudmlkZW9TbG90JiYoZT1jLnZpZGVvU2xvdCx0aGlzLnhmPSEwKX1jYXRjaChoKXt9ZS52cT0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoZS5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGUuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJgplLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLlJrJiZ0aGlzLnBsYXllci5QZSgpJiYoZS52b2x1bWU9dGhpcy5wbGF5ZXIuUGUoKS8xMDApO2Zvcig7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPGEuTi5sZW5ndGg7ZCsrKWUuY2FuUGxheVR5cGUoYS5OW2RdLnR5cGUpJiZ0aGlzLk1rKGUsYS5OW2RdLnVybCsiIixhLk5bZF0udHlwZSk7dGhpcy54ZiYmZS5sb2FkKCk7aWYodGhpcy5uaShlKSl7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dGhpcy5QayhlKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPQp0aGlzLmtiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLnhmP3RoaXMudmlkZW89ZTp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2gobCl7dGhpcy52aWRlbz1lfX1lbHNlIHRoaXMuYi52bCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLnRhPXRoaXMua2IuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLnRhLmFwcGVuZENoaWxkKGUpLHRoaXMuam8oKSk6dGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sam86ZnVuY3Rpb24oKXt0aGlzLmNnPSEwO3RoaXMuQ2I9dGhpcy52Yz0hMTt0aGlzLmEuYy5sYSYmdGhpcy5hLmMubGEoKSYmKGYubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5DYj0hMCk7Zi5GZSgpO3RoaXMuYiYmCnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4uYmEmJmYuUWsodGhpcy5iLm9yaWdpbi5iYSk7dGhpcy5naSgic2V0dXAiLHRoaXMuWWEoKSk7dmFyIGE9dGhpcy5hLkI7dGhpcy5hLkI9RC5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5CLGEpO3RoaXMuYS5RaCgpO3RoaXMuYS5LZigpO2ZvcihhPXRoaXMuYS5IO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmEuS2YoKTt0aGlzLmtiPXRoaXMuYS5IO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmYuSWYodGhpcy5rYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt0aGlzLnRhPXRoaXMuYS5IO3RoaXMuemkoInZwYWlkIik7aWYodGhpcy5DYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlViKCJtdXRlZCIsCiJjb250ZW50Iik7Zi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX10aGlzLkQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5ELnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuRC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmEuSC5hcHBlbmRDaGlsZCh0aGlzLkQpO3RoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZi5JZih0aGlzLkQsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkQub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuYS5jLmxhJiZ0aGlzLmEuYy5sYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLm5tKCksYz10aGlzLmIucy5PcmlnaW5hbEFkUGFyYW1ldGVycztpZihiJiZiLnVybCYmMDw9Yi51cmwuaW5kZXhPZigid2VsZWN0LmpzIikmJnRoaXMuQSl7dmFyIGg9dGhpcy5BLmdldENvbmZpZygpO2gmJmguYWRGYWxsYmFja0NvbmZpZyYmaC5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzJiYoYz1KU09OLnN0cmluZ2lmeShoLmFkRmFsbGJhY2tDb25maWcpKX12YXIgaz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSC5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5ILnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2YubWEodGhpcy5ELCJjb25maWciLGspO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5tYSh0aGlzLkQsImNvbmZpZyIsayl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELAoiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YubWEodGhpcy5ELCJjb25maWciLGspfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLm1hKHRoaXMuRCwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9Zi5BZSgiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQSk7dGhpcy5ELnNyYz1hO2YueWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLnVhJiYhdGhpcy5XZCYmdGhpcy5hLmMudWEoKSYmZi5vKGsuSGMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubWMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuQWM9CmEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuZXAoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5mcCgpLHRoaXMuYS5tYyghMCksIXRoaXMuJGIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuJGI9e2VsOnRoaXMuRCxjYjpmdW5jdGlvbigpe3RoaXMuZmU9ITA7Zi5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9IkFkU3RhcnRlZCI9PQphLmRhdGEubmFtZSYmKHRoaXMuYS5tYyghMCksdGhpcy5qcCgpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEubWMoITApLHRoaXMubnAoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMubXAoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5vcCgpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5rcCgpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5FaSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5yYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtmLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CiJfdG9wIjt0cnl7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmlwKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmdwKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5kZCYmKHRoaXMuZGc9ITEsdGhpcy5zYygpKSx0aGlzLmhwKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/Cih0aGlzLkNiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5VYigibXV0ZWQiLCJ1c2VyIiksZi5vKGsuTGQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSk6KHRoaXMuQ2I9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlViKCJ1bm11dGVkIiwidXNlciIpLGYubyhrLlZmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGYubyhrLnVlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7Zi55ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtmLnllKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnlnKGZ1bmN0aW9uKGEpe2YubWEodGhpcy5ELAoicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LGdwOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy50cmFjaygicGF1c2UiKTtmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy52Yz0hMH0saHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudmM9ITF9LGpwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7Zi5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0saXA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7CmYubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGZwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuaGkoKTtmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxucDpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5YYSgic3RhcnQiKTtmLm8oay5tZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxscDpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLkRkPSEwO3RoaXMuWGEoImZpcnN0UXVhcnRpbGUiKTtmLm8oay5tZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxtcDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxvcDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTsKdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpO2YubyhrLnZnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LGtwOmZ1bmN0aW9uKCl7dGhpcy5ZZigpO3RoaXMuWGEoImNvbXBsZXRlIil9LEVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuRCYmdGhpcy5ELnBhcmVudE5vZGUmJnRoaXMuRC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuV2EoInZwYWlkc3RvcHBlZCIpO3ZhciBlPXRoaXMuRC5wYXJlbnROb2RlO3RoaXMuRC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO2YuRmUoKTt0aGlzLkQ9ITE7dGhpcy5RYShhKX19LGVwOmZ1bmN0aW9uKGEpe3ZhciBlPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWUmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGU9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGUubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTsKZi5vKGsucHAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLkVpKCEwKX0sTWs6ZnVuY3Rpb24oYSxlKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5DYSYmYi5pc0VuYWJsZWQmJiFiLlNjKCkpe3ZhciBkPWIuYWEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Muc3JjPWQoZSx0aGlzLkEpO2Mub25lcnJvcj10aGlzLmFwLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoZSx0aGlzLkEpKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLAp0aGlzLiRmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5DaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLllmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuWmYuYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuJGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5aZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5qY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpjfHwKdGhpcy4kZihhKX0uYmluZCh0aGlzKSx0aGlzLllrKSl9LCRmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJkJiZ0aGlzLm5pKHRoaXMudmlkZW8pJiYhdGhpcy5RYiYmIXRoaXMuamMpe3RoaXMucmQ9ITA7dHJ5e2lmKCFmLkRhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLlFifHwodGhpcy5RYj0hMCx0aGlzLlBkKHRoaXMudmlkZW8pLGYudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5ZYSgpLCEwKSx0aGlzLkEuU2d8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChlKXtmLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLlpvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuS2YoKTt0aGlzLllvKCk7dGhpcy56aSgpO3RoaXMuQmcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJgp0aGlzLk9mKCl9fSxPZjpmdW5jdGlvbigpe3RoaXMueWR8fHRoaXMubmcoKX0sbmc6ZnVuY3Rpb24oYSl7dmFyIGU9dGhpcy52aWRlby5wbGF5KCk7aWYoZSYmZVsiY2F0Y2giXSllWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy55ZHx8KGE/dGhpcy5RYSgpOih0aGlzLm9mKCEwKSx0aGlzLm5nKCEwKSkpfS5iaW5kKHRoaXMpKTtjYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMucmMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5yYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfS5iaW5kKHRoaXMpO3RoaXMuUmUoKS5laSh0aGlzKX0sWWY6ZnVuY3Rpb24oKXt0aGlzLkEuZWImJiF0aGlzLlFiJiYoZi50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKSx0aGlzLlhhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO3RoaXMuSGU9ITA7Zi5vKGsuR2ssdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLlFhKCl9LEprOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT1bXSxkPSExLGM9MDtjPGEubGVuZ3RoO2MrKylkPWYuZ2goYVtjXSksZS5wdXNoKGQpO2E9e2hhc2hlczplfTthPWsuU2EoYSx0aGlzLnUoKSk7Zi5wbyhhKX0sUWE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuZ2UmJnRoaXMuSmsodGhpcy5iLmdlKTtpZighdGhpcy5JZSlpZih0aGlzLkllPSEwLHRoaXMuZmV8fChmLm8oay5rbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5FYnx8dGhpcy5iLnljKXtmLnZiKCJuZXdTbWFsbEFkSWQiKTt0aGlzLk5mKys7dGhpcy5qYz10aGlzLnJkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGUpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMua2IucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuVWQ9ITE7dHJ5e3RoaXMuYS53aSgpfWNhdGNoKGgpe310aGlzLldkPSEwO3RoaXMuYS5WZSgpO3RoaXMub2M9ITE7dGhpcy5SZSgpLlpoKCk7dGhpcy5iLkViJiZ0aGlzLmIub3JpZ2luLnBmKCk7dGhpcy5iLnljJiYoYT90aGlzLmIub3JpZ2luLkpoKCk6dGhpcy54ZCgpKX1lbHNlIHRoaXMueGQoKX0sYXA6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLlpmKGEpKX0sWmY6ZnVuY3Rpb24oYSl7dGhpcy5qYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTsKdGhpcy5iLm9yaWdpbi5VZyh2LmtlKX0sQ2k6ZnVuY3Rpb24oKXtpZih0aGlzLkxvKXRoaXMuUWEoKTtlbHNle3RoaXMub2M9ITA7dGhpcy5hLmMudWEmJiF0aGlzLldkJiZ0aGlzLmEuYy51YSgpJiZmLm8oay5IYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5PbyhhKTtpZighdGhpcy4kYil7dmFyIGU9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGU9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLiRiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5mZT0hMDtmLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzplLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2YuYmYodGhpcy4kYil9ZD0iIjt0aGlzLmIuTWYmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmkpKSYmKGQ9dGhpcy5iLk1mLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlVkfHwodGhpcy5VZD0hMCxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtmLm8oay50Zyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5FYj8odGhpcy5qYz10aGlzLnJkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmtiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuVWQ9ITEsdGhpcy5hLndpKCksdGhpcy5iLm9yaWdpbi5wZigpKTp0aGlzLlFhKCl9LmJpbmQodGhpcykpKSksZS5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLm9kLnJlcGxhY2UoIlt0aW1lXSIsZi5haCh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLndlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx0aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuRGR8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxPbzpmdW5jdGlvbihhKXtmLm8oay51ZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudWl8fHRoaXMuUWJ8fCgwPT1hJiYodGhpcy5GYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5GYiksdGhpcy5GYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp0aGlzLkEuSGImJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkhiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMudGkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnRpKCl9LmJpbmQodGhpcykpLHRoaXMuUWJ8fHRoaXMuaGkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5lYiYmdGhpcy5YYSgic3RhcnQiKSxmLm8oay5wZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGYubyhrLnVnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLAp0aGlzLkRkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZi5vKGsubWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkEuZWImJihmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5YYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLm8oay5yZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmViJiYoZi50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5vKGsudmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy51aT1hKX0sZ2k6ZnVuY3Rpb24oYSxlKXtmLnRyYWNrKCJzdGF0c19oZF9hZF8iKwphLGUsITApfSxybzpmdW5jdGlvbigpe2YuY2QoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0saGk6ZnVuY3Rpb24oKXtmLmNkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWWEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LHNvOmZ1bmN0aW9uKCl7Zi5jZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2YuY2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuY2d8fHRoaXMuQS5lYikmJmYudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxVYjpmdW5jdGlvbihhLGUpe3RoaXMuQS5lYiYmZi50cmFjaygic3RhdHNfaGRfIithLGUsITApfSx0cmFjazpmdW5jdGlvbihhLGUpe2lmKCF0aGlzLlFiKXt0aGlzLnFmJiYKdGhpcy5xZi50cmFjayYmdGhpcy5xZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmYuT2cmJmYudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBkPVtdO3RyeXtkPXRoaXMubG0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5GYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlZkLmltcHJlc3Npb25zJiZmLkRtKGgudXJsLHRoaXMuVmQuaW1wcmVzc2lvbnMpP3RoaXMuaGYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YubyhrLkhrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSwKdGhpcy52KCkse2FkSWQ6dGhpcy5WZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy51KCkpfWNhdGNoKGQpe319LmJpbmQodGhpcykpOnRoaXMuaGYoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWUpdHJ5e3RoaXMuYi5PYT10aGlzLkVsKHRoaXMuYi5PYSxhKX1jYXRjaCh6KXt9fX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT1mLkRhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGU9IiI7dGhpcy5jZyYmKGU9Il92cGFpZCIpO3RoaXMuZGQmJihlPSJfd2VsZWN0Iik7cmV0dXJuIGErZX0saGY6ZnVuY3Rpb24oYSxlLGQsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZT10aGlzLkEudmEoYSksZCYmZS5MayhkKSxjfHwoYz10aGlzLlJnKSxmfHwoZj10aGlzLlJnKSx0aGlzLk5rKGEpLHRoaXMuQS5LYShlLGZ1bmN0aW9uKCl7dGhpcy5ZaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlloKGEpO2YoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxOazpmdW5jdGlvbihhKXt0aGlzLnBjW2FdPQoib3BlbiJ9LFloOmZ1bmN0aW9uKGEpe3RoaXMucGNbYV09ImNsb3NlZCJ9LHNsOmZ1bmN0aW9uKCl7dGhpcy5wYz17fX0sdW86ZnVuY3Rpb24oKXt2YXIgYT0wLGU7Zm9yKGUgaW4gdGhpcy5wYyl0aGlzLnBjLmhhc093blByb3BlcnR5KGUpJiYib3BlbiI9PXRoaXMucGNbZV0mJmErKztyZXR1cm4gYX0sbG06ZnVuY3Rpb24oYSxlKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09ZX0pfSxFbDpmdW5jdGlvbihhLGUpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09ZX0pfSxabzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2EueGcmJmEueGcodGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGYuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMuc2MoKTsKZWxzZSBpZih0aGlzLmIucmIpe3RyeXt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTt0aGlzLmIuR2V8fCh0aGlzLmIuR2U9MSk7aWYoMTAwPmEtdGhpcy5iLkdlKXJldHVybjt0aGlzLmIuR2U9YX1jYXRjaChlKXt9Zi5vKGsuSmcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5BLkVjfHx0aGlzLmRkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnJifWNhdGNoKGUpe2E9d2luZG93Lm9wZW4odGhpcy5iLnJiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucmIsIl90b3AiKX19fS5iaW5kKHRoaXMpLAo1MDApfX0sWW86ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5vZC5yZXBsYWNlKCJbdGltZV0iLGYuYWgoMCkpOwp2YXIgZT10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkEudGQmJihlPXRoaXMuQS50ZCk7ZSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDFFMyplKTt0aGlzLmNhcHRpb249dGhpcy50YS5hcHBlbmRDaGlsZChhKX19LEpiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJub25lIil9LFNkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEudGQpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZi5QZih0aGlzLmNvbnRyb2xzKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKZC5pZD10aGlzLnpsO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9kLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUud2lkdGg9IjEwMCUiLGQuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGQuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGQuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGQuc3R5bGUuYm90dG9tPSIwcHgiLGQuc3R5bGUuekluZGV4PSIxMDAwMCIpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06CihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlJiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnBpLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpOihjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9pLmJpbmQodGhpcykpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub2kuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLlNkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LYigpO3RoaXMuSmIoKX0uYmluZCh0aGlzKSk7CnZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2guc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGguc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksaC5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGguc3R5bGVbImZsb2F0Il09InJpZ2h0IixoLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2guaWQ9dGhpcy5QYjtoLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjsidnBhaWQiPT1hP2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuTm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Nby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5TZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuS2IoKTt0aGlzLkpiKCl9LmJpbmQodGhpcykpOwp2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPSItNTBweCIsbC5zdHlsZS5yaWdodD0iMHB4IixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2wuaWQ9dGhpcy5maTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiOwpkLmFwcGVuZENoaWxkKGMpO3RoaXMuYi5NZiYmZC5hcHBlbmRDaGlsZChsKTtkLmFwcGVuZENoaWxkKGgpO2Quc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5EYSgpfHwodGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMuU2QoKX0uYmluZCh0aGlzKSksdGhpcy50YS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLktiKCk7dGhpcy5KYigpfS5iaW5kKHRoaXMpKSk7dGhpcy5jb250cm9scz10aGlzLnRhLmFwcGVuZENoaWxkKGQpO3RoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLndpZHRoPSIxMDAlIixlLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixlLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixlLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIiwKZS5zdHlsZS5ib3R0b209IjBweCIsZS5zdHlsZS56SW5kZXg9IjEwMDAwIixlLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksZC5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy53YSYmKHRoaXMud2Euc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSxkLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPSIsCmUuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiLAplLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO3RoaXMud2E9dGhpcy50YS5hcHBlbmRDaGlsZChlKTt0aGlzLmEueWcoZnVuY3Rpb24oYSl7dGhpcy53YS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In0uYmluZCh0aGlzKSk7InZwYWlkIiE9YSYmdGhpcy5hLmMubGEmJnRoaXMuYS5jLmxhKCkmJihmLm8oay5LZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMub2YoKSk7dGhpcy5LYigpfX0sS2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxzYzpmdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMud2EmJiJibG9jayI9PXRoaXMud2Euc3R5bGUuZGlzcGxheXx8dGhpcy5kZ3x8KHRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlJiKTt0aGlzLmEuQi5wYXVzZWQ/Cih0aGlzLmEuQi5wbGF5KCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQi5wYXVzZSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSl9LHBpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5SYik7dGhpcy52Yz8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwbGF5IiksdGhpcy53YSYmKHRoaXMud2Euc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnZjPSExKTooZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLktiKCksdGhpcy5KYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudmM9ITApfSxOZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZHx8KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGYubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxhaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUmIpO3RoaXMuYS5CLnBhdXNlZCYmKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5vKGsubWQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LE1vOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWQ/KHRoaXMuYS5CLm11dGVkPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsInVzZXIiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5hLkIubXV0ZWQ9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlViKCJtdXRlZCIsInVzZXIiKSxmLm8oay5MZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sTm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTsKdGhpcy5DYj8oZi5tYSh0aGlzLkQsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLkNiPSExLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbikpOihmLm1hKHRoaXMuRCwiY29udHJvbCIsIm11dGUiKSx0aGlzLkNiPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSl9LG9mOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIubXV0ZWR8fCh0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuVWIoIm11dGVkIiwiY29udGVudCIpLGYubyhrLkxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLm11dGVkJiYodGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5VYigidW5tdXRlZCIsImNvbnRlbnQiKSxmLm8oay5WZix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0scmM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5yYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMucmMpO3RoaXMueWR8fHRoaXMud2V8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk9mKCkpfSx4ZDpmdW5jdGlvbigpe3RoaXMuTW0oKSYmdGhpcy5MbSgpJiYodGhpcy5BLnhjfHwic3BpZWdlbC5kZSI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJ3ZWIuZGUiPT1mLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwiZ214Lm5ldCI9PWYuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYKInByZXJvbGwiPT1mLk5iJiZ0aGlzLlBvKCl8fCh0aGlzLnlkPSEwLHRoaXMuRmImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRmIpLHRoaXMuRmI9ITEpLHRoaXMuTGcoKSl9LE1tOmZ1bmN0aW9uKCl7dmFyIGE9Zi5CZCgpO2lmKCF0aGlzLkEuamJ8fGYuRGEoKXx8IWEuaXNDaHJvbWUmJiFhLmlzRmlyZWZveHx8YS5pc0VkZ2Upe3ZhciBlPXRoaXMuQS5qYj8iIjoibm92cGFpZCIsZD1mLkRhKCk/Im1vYmlsZSI6IiI7Zi50cmFjaygic3RhdHNfd3RfcG9zc2libGUiLGUrZCsoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3g/IiI6Im5vZmZjaHIiKSsoYS5pc0VkZ2U/ImVkZ2UiOiIiKSwhMCl9cmV0dXJuIHRoaXMuQS5qYiYmIWYuRGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfSxMbTpmdW5jdGlvbigpe3ZhciBhPSExLGU9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyIhPWYuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yfHx0aGlzLldjfHwoYT0KITAsZS5hZEZhbGxiYWNrVVJMfHwoZS5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpOyhhfHwhdGhpcy5GYyYmZS5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuV2N8fGYudHJhY2soInN0YXRzX3d0X2FsbG93ZWQiLCh0aGlzLkZjPyJhbnkiOiIiKSsoZS5hZEZhbGxiYWNrVVJMPyIiOiJub2ZiIikrKHRoaXMuV2M/Im9ubHkiOiIiKSwhMCk7cmV0dXJuKGF8fCF0aGlzLkZjJiZlLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5XY30sYW06ZnVuY3Rpb24oKXt2YXIgYT1sLmdldENvbmZpZygpLmFkRmFsbGJhY2tVUkwsZT1mLmFhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2F8fCJzdm1wcmV2aWV3IiE9ZS5hbmNob3J8fChhPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIik7cmV0dXJuIGF9LFBvOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtpZihiJiZiLnJlc3BvbnNlVGV4dCl0cnl7dmFyIGU9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCk7CmYudHJhY2soInN0YXRzX3d0X2F2YWlsYWJsZSIsZS5hdmFpbGFibGUsITApO2lmKGUuaGFzT3duUHJvcGVydHkoImF2YWlsYWJsZSIpJiZlLmF2YWlsYWJsZSl7Zi50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWWEoKSwhMCk7dmFyIGM9Zi5BZShkLHRoaXMuQSwhMSx7b25seVVSTDohMH0pO2lmKGMpcmV0dXJuIHRoaXMuamYoYywhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSwhMH19Y2F0Y2goaCl7Zi50cmFjaygic3RhdHNfd3RfY2F0Y2giLCIiLCEwKX10aGlzLnhkKCl9dmFyIGU9bC5nZXRDb25maWcoKS5hZEZhbGxiYWNrQ29uZmlnLndlbGVjdGFsaWFzLGQ9dGhpcy5hbSgpO3RoaXMuRmM9dGhpcy5XYz10aGlzLmRkPXRoaXMuZGc9ITA7cmV0dXJuIGU/KGYuZmIoImh0dHBzOi8vd3d3LndlbGVjdC5kZS9hcGkvdjEvcHJlZmxpZ2h0L2J5X2FsaWFzLyIrZSwiZGV3ZWxlY3R3d3d3ZWxlY3RkZSIse30sYS5iaW5kKHRoaXMpLGEuYmluZCh0aGlzKSx0aGlzLkEpLAohMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMudW8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSx0aGlzLnRuKToodGhpcy5XZD0hMCx0aGlzLmEuVmUoKSx0aGlzLmEuVW4oKSx0aGlzLm9jPSExLGE9dGhpcy5iLnN8fHt9LHRoaXMuSGV8fChhLm5vQ29tcGxldGVRdWFydGlsZT0hMCksZi5vKGsueWwsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSx0aGlzLlJlKCkuWmgoKSl9LFJlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LEJnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KYSgibWluVmlzIik7YSYmKGYuYWYodGhpcy52aWRlbyxhKT90aGlzLmFpKCk6dGhpcy5OZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CZygpfS5iaW5kKHRoaXMpLDEwMCkpfSx2OmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5iJiYoYS5jbGlja3Rocm91Z2g9CnRoaXMuYi5yYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5FYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLkFjJiYwPHRoaXMuQWMubGVuZ3RoJiYoYS5hZElkcz10aGlzLkFjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHU6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLmFsKyItIit0aGlzLk5mO3RoaXMuYiYmdGhpcy5iLmhoJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYi5oaCgpKTtyZXR1cm4gYX0sUmc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLnFqfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBSYT1jLkhsfHxSYTtuZXcgUmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGQsYyl7dGhpcy5vcHRpb25zPWN8fHt9O2U9ZDt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5vYT1udWxsO3RoaXMuWT1bXTt0aGlzLko9bnVsbDt0aGlzLnpjPXRoaXMuQmM9ITE7dGhpcy5iYT0iIjt0aGlzLmJnPSExO3RoaXMuc2g9IiI7YyYmYy5lbXB0eT90aGlzLlZtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBiPTAsZSxkPVtdO2Mub2s9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWYuQmQoKSxiO2I9Zi5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgZD0iIjtiLnF1ZXJ5S2V5JiYoZD1iLnF1ZXJ5S2V5Lmh2cCk7ZCYmKHRoaXMub3B0aW9ucy52cGFpZD0KITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOmwudmEobC5YZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFmLkRhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxjPWZ1bmN0aW9uKCl7cmV0dXJuIGUoKSYmKGYuUigibWFydGhhc3Rld2FydC5jb20iKXx8Zi5SKCJmYW5kb20uY29tIil8fGYuUigiZ2lnYS5kZSIpfHxmLlIoImtpbm8uZGUiKXx8Zi5SKCJzcGllbGV0aXBwcy5kZSIpfHxmLlIoImRlc2lyZWQuZGUiKSl9LmJpbmQodGhpcyk7aWYoZSgpfHxjKCkpe3ZhciBoPWYuTmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgYz1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYKIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4oZi5SKCJnaWdhLmRlIil8fGYuUigia2luby5kZSIpfHxmLlIoInNwaWVsZXRpcHBzLmRlIil8fGYuUigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG49ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihjKCl8fGsoKXx8bSgpfHwiYXBwc3BvdCI9PQpkKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLlhkKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLlhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixmLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuWGQoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5VbS5iaW5kKHRoaXMpLHRoaXMuUm0uYmluZCh0aGlzKSl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5vYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5vYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGQpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuTmIpdHJ5e3ZhciBlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09ZS5maXJzdENoaWxkfWNhdGNoKGMpe2RbYl09e319ZWxzZSBkLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLm9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMub2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZSl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLk5ifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5OYnx8dGhpcy5KbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC56bygpKXRyeXt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Yy5sZW5ndGgmJihjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2NbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtlW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspZC5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChkKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxKbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGQ9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZT0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZT1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZT1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZSYmTWF0aC5hYnMoZS1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWQ/ITA6ITF9LFVtOmZ1bmN0aW9uKGEpe3RoaXMuRW4oYSk7dHJ5e3RoaXMub2E9YS5yZXNwb25zZVhNTCx0aGlzLm9hfHwodGhpcy5vYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuc2g9YS51cmxDYWxsZWQ7aWYodGhpcy5ZLmxlbmd0aCl0aGlzLlZjKCk7ZWxzZXt0aGlzLnJhKHRoaXMuUmEodi5mZCx7ZXJyb3I6dGhpcy5iZz8KRi5uZTpGLmdnfSkpO3RyeXtmLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGYuVWEodGhpcy5iYSksITApfWNhdGNoKGQpe319fSxWbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5vYXx8KHRoaXMub2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlJhKHYub2UpKX10aGlzLlk9dGhpcy5kaCgpO3RoaXMuQmM9dGhpcy5TZigpO3RoaXMuemM9dGhpcy5saSgpO3RoaXMuWS5sZW5ndGg/dGhpcy5WYygpOnRoaXMucmEodGhpcy5SYSh2LmZkLHtlcnJvcjp0aGlzLmJnP0YubmU6Ri5nZ30pKX0sUm06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUmEodi5mZyx7ZGVwdGg6Yn0pKX0sVmM6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5ObSgpP3RoaXMuSG8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5taCgpLGUse0FkU3lzdGVtOnRoaXMuVWwoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6CnRoaXMucmEodGhpcy5SYSh2LmlnKSk6KGI9MCx0aGlzLlJvKCkmJnRoaXMudWYodGhpcy5CbCgpKSl9LHBmOmZ1bmN0aW9uKCl7dGhpcy5CYz8odGhpcy5CYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5wZigpfSxKaDpmdW5jdGlvbigpe3RoaXMuemM/KHRoaXMuemM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuVmMoKSk6dGhpcy5wYXJlbnQuSmgoKX0sUm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FbygpP3RoaXMuRG8oKT8hMDooLTEhPXRoaXMuTmMoKT90aGlzLnJhKHRoaXMuUmEodi5oZSkpOnRoaXMucmEodGhpcy5SYSh2LmVnKSksITEpOih0aGlzLnJhKHRoaXMuUmEodi5mZCxGLmhnKSksITEpfSx1ZjpmdW5jdGlvbihhKXt0aGlzLmJhfHwodGhpcy5iYT0iIik7YS5nZXx8KGEuZ2U9W10pO2EuZ2UucHVzaCh0aGlzLnNoKTthLk9hPWEuT2EuY29uY2F0KHRoaXMubGYoKSk7YS5FYj1hLkViP2EuRWI6dGhpcy5CYzsKYS55Yz1hLnljP2EueWM6dGhpcy56YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7dGhpcy5wYXJlbnQudWYoYSl9LEJsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuYmF8fCh0aGlzLmJhPSIiKTthLmR1cmF0aW9uPXRoaXMuTmMoKTthLk49dGhpcy5qaCgpO2EucmI9dGhpcy5XbCgpO2EuQ3E9W107YS5vcmlnaW49dGhpczthLnM9dGhpcy5UbCgpO2EuTWY9dGhpcy5qbShhLmR1cmF0aW9uKTthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5iYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7YS4kYT1hLiRhP2EuJGE6LTEhPXRoaXMuYmEuaW5kZXhPZigiYWQueWllbGRsYWIubmV0IikmJiF0aGlzLm9wdGlvbnMuTWM7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMuYmF8fAoodGhpcy5iYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMuYmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLmJhLmluZGV4T2YoImFkLnlpZWxkbGFiLm5ldCIpJiYhdGhpcy5vcHRpb25zLk1jO2lmKCF0aGlzLkomJnRoaXMub2EmJnRoaXMub2EuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5vYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmQubGVuZ3RoJiZmLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZSl7fX10aGlzLkomJihhLk9hPWEuZXJyb3IuY29kZSE9di5oZS5jb2RlP2EuT2EuY29uY2F0KHRoaXMuWGwoKSk6YS5PYS5jb25jYXQodGhpcy5mbSgpKSk7dGhpcy5ZLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmtjJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmtjJiZ0aGlzLnBhcmVudC5rYyhhKSxiPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGtjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmtjKGEpfSxVZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxIbzpmdW5jdGlvbigpe3JldHVybiBiPGV9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5qaCgpLmxlbmd0aH0sRG86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLk5jKCl9LFNmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5ZLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTsKcmV0dXJuIGJ9KS5sZW5ndGh9LGxpOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5ZJiYyPD10aGlzLlkubGVuZ3RoJiYhdGhpcy5TZigpJiYoYT0hMCk7cmV0dXJuIGF9LEVuOmZ1bmN0aW9uKGEpe3RoaXMuYmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5iYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLmJhPSJVTktOT1dOIn10cnl7dGhpcy5iZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChlKXt9fSxObTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMubWgoKS5sZW5ndGh9LG1oOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUWUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZSh0aGlzLkosIkFkU3lzdGVtIil9LGxmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1lJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiQ29tcGFuaW9uIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUpKXJldHVybn1jYXRjaChkKXt9aWYoYSYmIXRoaXMuemgoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxlLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMudGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSx6aDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxmbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxYbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sV2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0samg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyliLnB1c2goe2lkOmFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtkXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxQYTphW2RdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbZF0uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFVwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnRiKGFbZF0pfSk7dmFyIGU9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBjPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGUtYS5QYSktTWF0aC5hYnMoZS1iLlBhKX0pLGY9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZS1hLlBhKS1NYXRoLmFicyhlLWIuUGEpfSksYj1jLmNvbmNhdChmKX1jYXRjaChoKXt9cmV0dXJuIGJ9LFRsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7CmZvcih2YXIgYj0iIixkPSExLGU9W10sYj0hMSxjPSIiLGY9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2M9Yj10aGlzLkdkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWUucHVzaChkKTtmLnB1c2goYyl9MTxhLmxlbmd0aD8oYj1lLGg9Yyk6KGI9ZCxoPWYpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxOYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnRiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sam06ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD0hMSxlPSExO3RyeXtkPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZT1kLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5vbyhlLAphKSwwPmImJihiPSExKX1jYXRjaChjKXtiPSExfXJldHVybiBifSxRZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMudGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx0YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkdkKGEpOiIifSxHZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5va3x8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucG49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLnBufHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk49W107dGhpcy5yYj0iIjt0aGlzLnM9dGhpcy55Yz10aGlzLkViPSExO3RoaXMuWGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlllPSIifWMuV2o9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsZT0wO2U8dGhpcy5OLmxlbmd0aDtlKyspaWYoMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sZG06ZnVuY3Rpb24oKXtpZighdGhpcy5YZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm9hKXt2YXIgYT10aGlzLm9yaWdpbi5vYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksZT0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGU9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1lLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLlhlPWFbZF0pfXJldHVybiB0aGlzLlhlfSwKaGg6ZnVuY3Rpb24oKXtpZih0aGlzLlllKXJldHVybiB0aGlzLlllO3ZhciBhPSIiOyhhPXRoaXMuZG0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlllPWF9LG5tOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGU9MDtlPHRoaXMuTi5sZW5ndGg7ZSsrKWlmKDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5OW2VdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTltlXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk5bZV0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5OW2VdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Xanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5OaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHY9e29lOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE5hOiJYTUxfUEFSU0VfRVJST1IifSxlZzp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLAptZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGZkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGlnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE5hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKTmE6IkxPQURfRVJST1IifSxrZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSx1cDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixOYToiTUVESUFGSUxFX0VSUk9SIn0saGU6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTmE6IkRVTU1ZX0FEIn19LEY9e2dnOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTmE6Ik5PX0FEUyJ9LGhnOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixOYToiTk9fTUVESUFGSUxFUyJ9LHZwOnt0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG5lOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMucGt8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZSl7dGhpcy5lcnJvcj1hO3RoaXMuQWQ9ZTt0aGlzLk9hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5naj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFRhPWMuZ2p8fFRhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ubj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPQpjLm5ufHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGUpe3RoaXMuJGg9YTt0aGlzLnZpZGVvPWU7dGhpcy5jZT1bXTt0aGlzLlhoPVtdO3RoaXMucmY9W107dGhpcy4kbz0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSSgpfWMud3A9YTthLnByb3RvdHlwZT17STpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy4kaC5sZW5ndGg7YSsrKXt2YXIgZT10aGlzLiRoW2FdLGQ9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsCmM9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO3ZhciBoPWYuY29udGVudFdpbmRvdztoLnJxPXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLkpuLmJpbmQodGhpcyl9O3ZhciBrPWguZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2sub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9aC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2guZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtoLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoayk7CnRoaXMuY2UucHVzaCh7c3JjOmQsZnJhbWU6Zix2bjpjLHZlbmRvcjplLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5yZi5sZW5ndGg7ZSsrKXt2YXIgZD10aGlzLnJmW2VdO2QudHlwZT09PWEmJmQuZmwodGhpcy5ZbChhKSl9fSxZbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntBcTohMCx6cTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntucToidmlkZW8iLERxOiJqc0N1c3RvbSIsRXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxGcToxLFZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsCmVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LG1tOmZ1bmN0aW9uKGEpe2Zvcih2YXIgZT0wO2U8dGhpcy5jZS5sZW5ndGg7ZSsrKWlmKHRoaXMuY2VbZV0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5jZVtlXS52bjtyZXR1cm4iIn0sUm46ZnVuY3Rpb24oYSxlKXt0aGlzLlhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLm1tKGUpLHZlbmRvcjplfSk7dGhpcy5xbygpfSxKbjpmdW5jdGlvbihhLGUpeyJ2aWRlbyI9PT1hP3RoaXMuJG8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMuemcoYSxlKX0uYmluZCh0aGlzKSk6dGhpcy56ZyhhLGUpfSx6ZzpmdW5jdGlvbihhLGUpe3RoaXMucmYucHVzaCh7dHlwZTphLApmbDplLHhxOiExfSl9LHFvOmZ1bmN0aW9uKCl7dGhpcy5YaC5tYXAoZnVuY3Rpb24oYSl7YS5HbXx8KGEucXEoe2FkU2Vzc2lvbklkOmYuVigyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuQnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSxhLkdtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5QbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFlhPWMuUGx8fFlhO25ldyBZYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMuc2I9YS5laCgpO3RoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkguaWQ9CmYuVigxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy5BZz0hMTt0aGlzLmZjPVtdfWMuY2o9YTthLnByb3RvdHlwZT17U2w6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxmPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGY9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6Zix5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5TbChhKTtmb3IodmFyIGM9MCxkPTAsZj0hMSxoPXRoaXMudW0oYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrCmEuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZj10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZiYmKGsucG9zaXRpb249Zik7cmV0dXJuIGt9LHhvOmZ1bmN0aW9uKCl7dGhpcy5BZz0hMH0sd2k6ZnVuY3Rpb24oKXt0aGlzLkI9RC5wb3AoKTt0aGlzLkJ8fChmLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsCiIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2YubyhrLkhjLHRoaXMuYy5sKCkpfSxVbjpmdW5jdGlvbigpe3RoaXMuQWd8fCh0aGlzLmMucGxheSgpLGYubyhrLndkLHRoaXMuYy5sKCkpKX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSC5zdHlsZS56SW5kZXg9YTt0aGlzLkguc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5ILnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkguc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkguc3R5bGUuYm94U2l6aW5nPXRoaXMuc2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLnNiLm9mZnNldFdpZHRoKwowKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD10aGlzLnNiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMuc2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5zYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5zYik7dGhpcy5jLlpjJiZ0aGlzLmMuWmMoKT90aGlzLmMuZWgoKS5hcHBlbmRDaGlsZCh0aGlzLkgpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5IKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm1jLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSx1bTpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0KITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LFFsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gY30sbWM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5RbCh0aGlzLnNiKTtpZihjLnghPXRoaXMuSGEueHx8Yy55IT10aGlzLkhhLnl8fGMucG9zaXRpb24hPXRoaXMuSGEucG9zaXRpb258fGMud2lkdGghPXRoaXMuSGEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLkhhLmhlaWdodHx8YSl7aWYoMDx0aGlzLkhhLndpZHRoJiYwPHRoaXMuSGEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5WZSgpO3JldHVybn10aGlzLkhhPWM7dGhpcy5jLlpjKCk/KHRoaXMuSC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkguc3R5bGUubGVmdD0KYy54KyJweCIsdGhpcy5ILnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5ILnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5ILnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkIuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuZmMubGVuZ3RoO2ErKyl0aGlzLmZjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWYuUGYodGhpcy5IKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5tYy5iaW5kKHRoaXMpLDEwKX0seWc6ZnVuY3Rpb24oYSl7dGhpcy5mY3x8KHRoaXMuZmM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmZjLnB1c2goYSl9LFZlOmZ1bmN0aW9uKCl7dGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CnRoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1mLlYoMTApO00uY29udHJvbHM9ITA7RC5wdXNoKE0pfXZhciBKPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWI9Yy50bXx8YWI7bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlFqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5SZChhKTt0aGlzLlBnKCl9LFJkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxQZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVGEoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxaZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sbGE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLlRhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTsKdmFyIGJiPWMuUWp8fGJiOyhmdW5jdGlvbihjKXtjLlBqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuZGM9dGhpcy5kY3x8ITE7dGhpcy5xZz10aGlzLnNnPXRoaXMud2g9dGhpcy56YT10aGlzLlVmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTmwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVmPSEwO3RoaXMud2gmJnRoaXMuR2coKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5NYjthJiZhLm9jJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnVkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpO3RoaXMuRGcoKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5kYyl7dGhpcy51ZCgpO2lmKCF0aGlzLlVmJiYhdGhpcy51ZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuVWYmJnRoaXMucWcmJiF0aGlzLnNnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0sdWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmtoKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LGtoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLApjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxEZzpmdW5jdGlvbigpe2lmKHRoaXMudWQoKSl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLnNnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMucWc9YS5TcH10aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZygpfS5iaW5kKHRoaXMpLDEwMCl9LFdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLmtxKCk6ITF9LE5jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5OYygpOi0xfSxnbTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sTmw6ZnVuY3Rpb24oYSxiKXt0aGlzLmRjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuZGN8fDMwMj09dGhpcy5kYz90aGlzLnphPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5kYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZkKCl9LmJpbmQodGhpcyksMTAwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuemE/KHRoaXMudygpLHRoaXMuamEoKSk6YS5aZSgpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmdtKGEpPyh0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBjYj1jLlBqfHxjYjsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEltOmZ1bmN0aW9uKCl7d2luZG93Lk9PLiRqLkVrLkNrP3dpbmRvdy5PTy4kai5Fay5Day5RcChmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5WYT0xNTAwO3ZhciBhPWRhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxmLlNlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBiYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5LKGMpfHwodGhpcy5MKGMpLChuZXcgY2IoYyx0aGlzLkYpKS5mKCkpfXRoaXMuTygpfX0pfSkoYyk7dmFyIGRiPWMuUmp8fGRiLGViPW5ldyBkYih0KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnNuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5zbnx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dGhpcy5oYT0hMTt0aGlzLm5oKCl9LG5oOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTsKYSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTWE6ZnVuY3Rpb24oKXt0aGlzLlRoKCl9LFRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5YJiYoMCx0aGlzLlgpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRoKCl9LmJpbmQodGhpcyksCjEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVWl8fGdiOyhmdW5jdGlvbihjKXtjLlRpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERlOmZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLmphKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMuamEoKTp0aGlzLmkoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMuRGUoYS5hZEVycm9yRXZlbnRzW2JdKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5EZShhKX0uYmluZCh0aGlzKSk7CmEucGxheWVyLm9uKCJwbGF5aW5nIixmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZEVycm9yRXZlbnRzKWZvcih2YXIgYj0wO2I8YS5hZEVycm9yRXZlbnRzLmxlbmd0aDtiKyspdGhpcy5EZShhLmFkRXJyb3JFdmVudHNbYl0pfS5iaW5kKHRoaXMpKTthLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlRpfHxoYjsoZnVuY3Rpb24oYyl7Yy5WaT1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFZoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwoYS5SZChNYXRoLmNlaWwoMUUxMCoKTWF0aC5yYW5kb20oKSkpLHRoaXMuTChhKSwobmV3IGhiKGEsdGhpcy5GKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMuT2x8fCh0aGlzLk9sPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5WaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuVmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2FdKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBpYj1jLlZpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLmJqfHwKamI7bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO2lmKGEpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVyhiKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sWmM6ZnVuY3Rpb24oKXt2YXIgYT1tO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sUDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLmlrfHxVOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3cubmQoIiMiK2EsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt3Lm5kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubG4oYSl9LmJpbmQodGhpcykpO3cubmQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7CncubmQoIiMiK2EsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuQygpfS5iaW5kKHRoaXMpKTt3LnBtKCl9LGxuOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXtiPWlzTmFOKGFbY10pPyExOmFbY107aWYoMTAwOT09YVtjXXx8MTAwMT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGFbY10paWYoYVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGI9aXNOYU4oYVtjXVtkXSk/ITE6YVtjXVtkXSwxMDA5PT1hW2NdW2RdfHwxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuamEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCmY6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYT1bXSxiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2goYltjXSk7dGhpcy5NZCYmKGE9Zi5GbChhLHRoaXMuTWQpKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5LKGQpKXt0aGlzLkwoZCk7dmFyIGc9bmV3IFYoZCx0aGlzLkYpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLk1kfHwKKHRoaXMuTWQ9W10pLHRoaXMuTWQucHVzaChhW2JdKSxkPW5ldyBVKGgpLHRoaXMuSyhkKXx8KHRoaXMuTChkKSxnPW5ldyBWKGQsdGhpcy5GKSxnLmYoKSl9Y2F0Y2goayl7fX19dGhpcy5PKCl9LG5kOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhfHwodGhpcy5jYT17fSk7dGhpcy5jYVthXXx8KHRoaXMuY2FbYV09e30pO3RoaXMuY2FbYV1bYl18fCh0aGlzLmNhW2FdW2JdPVtdKTt0aGlzLmNhW2FdW2JdLnB1c2goYyl9LElvOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc1BsYXllclNlbGVjdG9yO2lmKGEpaWYoIXRoaXMuY2F8fHRoaXMuY2EmJiF0aGlzLmNhW2JdKXRoaXMuVWN8fCh0aGlzLlVjPVtdKSx0aGlzLlVjLnB1c2goYSksdGhpcy5UbigpJiYodGhpcy5BZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNhW2JdW2NdJiYwPHRoaXMuY2FbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0KMDtkPHRoaXMuY2FbYl1bY10ubGVuZ3RoO2QrKyl0aGlzLmNhW2JdW2NdW2RdKGEpfX0scG06ZnVuY3Rpb24oKXtpZih0aGlzLlVjKWZvcih2YXIgYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLlVjW2FdLGM9Yi5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihkPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVtjXVtkXSYmMDx0aGlzLmNhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuY2FbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmNhW2NdW2RdW2ZdKGIpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYSl7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5JbyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMueGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBsYj1jLnhrfHxsYjtuZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5RaT1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLm11dGVkPSExO3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LAp1YTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLmlzUGxheWluZygpJiZhLnBhdXNlKCl9KX0sbGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIG1iPWMuUWl8fG1iOyhmdW5jdGlvbihjKXtjLlJpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXtmLkpjLnB1c2goeyJbd2lkdGhdIjp0aGlzLnBsYXllci5jb250YWluZXIub2Zmc2V0V2lkdGh9KTtmLkpjLnB1c2goeyJbaGVpZ2h0XSI6dGhpcy5wbGF5ZXIuY29udGFpbmVyLm9mZnNldEhlaWdodH0pO3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDsKYS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuQygpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuUml8fG5iOyhmdW5jdGlvbihjKXtjLlNpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7CmlmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuSyhoKXx8KHRoaXMuTChoKSwobmV3IG5iKGgsdGhpcy5GKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuTygpfSxLOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5MYVthLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIG9iPWMuU2l8fG9iLHBiPW5ldyBvYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5Wa3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLktjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9ITApO3ZhciBiPXRoaXMuWGcoYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLktjPWIpO2lmKCF0aGlzLklnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHxhLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9CmEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtmLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2YudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLkluKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0seGc6ZnVuY3Rpb24oYSl7dGhpcy5oY3x8KHRoaXMuaGM9W10pO3RoaXMuaGMucHVzaChhKX0sdWw6ZnVuY3Rpb24oKXtpZih0aGlzLmhjJiZ0aGlzLmhjLmxlbmd0aClmb3IodmFyIGE9CjA7YTx0aGlzLmhjLmxlbmd0aDthKyspdHJ5e3RoaXMuaGNbYV0oKX1jYXRjaChiKXt9fSxGZDpmdW5jdGlvbigpe2lmKHRoaXMuS2MpcmV0dXJuIHRoaXMuS2M7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuWGcoYSkpcmV0dXJuIHRoaXMuS2M9YX19LFhnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxJbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2EmJmEucmVzdW1lRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnJlc3VtZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS5yZXN1bWUmJnRoaXMuZmEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmZhJiZ0aGlzLmZhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx4aDpmdW5jdGlvbihhKXt0aGlzLmZhPWF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciByYj1jLkxqfHxyYjsoZnVuY3Rpb24oYyl7Yy5Laj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLApiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm5hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5GZCgpP3RoaXMuQygpOih0aGlzLkplfHwodGhpcy5KZT0xKSx0aGlzLkplKyssMTAwPHRoaXMuSmU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTApKX19KX0pKGMpO3ZhciBzYj1jLktqfHxzYjsoZnVuY3Rpb24oYyl7Yy5Naj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihtKXtpZihtLnBsYXllcil7dmFyIGE9bS5wbGF5ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9CmEoKX1jYXRjaChiKXtmLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLksoYyl8fCh0aGlzLkwoYyksKG5ldyBzYihjLHRoaXMuRikpLmYoKSl9fWVsc2UgdGhpcy5PKCl9fSl9KShjKTt2YXIgdGI9Yy5Nanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy50cHx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudWs9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudWt8fHZiOyhmdW5jdGlvbihjKXtjLnRrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LFBjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxHbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuaWJ8fCh0aGlzLmliPVtdKTt0aGlzLmliLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5qYSgpOnRoaXMubSgiYWRlcnJvciIsCmEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkduKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuUGMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7cmV0dXJufWlmKCF0aGlzLkNjKXt0aGlzLkMoKTtyZXR1cm59YT0hMDtpZih0aGlzLmliJiZ0aGlzLmliLmxlbmd0aCYmMTx0aGlzLmliLmxlbmd0aClmb3IodmFyIGI9MDtiPHRoaXMuaWIubGVuZ3RoLQoxO2IrKykxMDA5IT10aGlzLmliW2JdJiYzMDMhPXRoaXMuaWJbYl0mJjQwMyE9dGhpcy5pYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuamEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTt0aGlzLksoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkwoYyksKG5ldyB3YihjLHRoaXMuRikpLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgeGI9Yy52a3x8CnhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLk5qfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlcoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy52Zj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuem4oKX0uYmluZCh0aGlzKSw1MDApfSx6bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSwKYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5YJiZ0aGlzLlgoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy52ZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy52Zik7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJgphLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx0bzpmdW5jdGlvbigpe3RoaXMudmY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudWM9MH0sZjpmdW5jdGlvbigpe3RoaXMuWW09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnVjfHwodGhpcy51Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/Cih3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy51Y3x8dGhpcy51YysrLHRoaXMudWM8PXRoaXMuWW0/KHRoaXMudWMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnRvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBCYj1jLmNrfHxCYjsoZnVuY3Rpb24oYyl7Yy5laz1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLApiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgQmIoYSx0aGlzLkYpKS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy5HbHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuYms9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CnRoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EuZHVyYXRpb24mJihiPWEuZHVyYXRpb24pO3JldHVybiBifSxNYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZiJiYxPmItYT90aGlzLlgoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSwKMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53bCgpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YT10aGlzLkliKCk7CjA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUG0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm9nKCl8fHRoaXMuaSghMCl9LFBtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYigpOyFhLnBhJiZhLlkmJmEuUHAmJmEuUnAmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWIoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGM7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGMgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbY10pe2M9YVtjXTticmVhayBhfWM9dm9pZCAwfTEwMDk9PWN8fDMwMz09Y3x8NDAzPT0KYz8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEliOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZ2QuSWIoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxlPTA7ZTxhLmxlbmd0aDtlKyspYVtlXS5pZD09YiYmKHRoaXMuTmg9YVtlXSk7cmV0dXJuIHRoaXMuTmh9LGxxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/YT90aGlzLkliKCkuYWRzTG9hZGVyP3RoaXMuQyghMCk6dGhpcy5DKCk6dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5nZD1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLksoYSl8fCh0aGlzLkwoYSksKG5ldyBHYihhLHRoaXMuRikpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmdkLkliKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLk8oKX19KTtjLmdkLkliPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobSYmbS5wbGF5ZXJhcGkmJihhPW0ucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT1bXSxiPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYiYmYi5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD0KYltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpO2lmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfX0pKGMpO3ZhciBIYj1jLmdkfHxIYixJYj1uZXcgSGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy5uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMubmt8fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/dGhpcy5XKGIpOnRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGpxOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDw9Zi5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJgooYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LFpjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFRhOmZ1bmN0aW9uKCl7dmFyIGE7Rz8oYT10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZmlyc3RDaGlsZCk6CmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Janx8WDsoZnVuY3Rpb24oYyl7Yy5Iaj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy53Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLndmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMud2YmJmMhPXRoaXMud2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8Zi5SKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubSgiYWRlcnJvciIsYS5zcSksdGhpcy5DKCksCndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhqfHxZOyhmdW5jdGlvbihjKXtjLkpqPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYTtpZihHKWZvcih2YXIgYj13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSwKYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuaGE/dGhpcy5BZigpOnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBZKGEsdGhpcy5GKSxhLmYoKSl9dGhpcy5PKCl9fSl9KShjKTt2YXIgRyxLYj1jLkpqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55az1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE1iPWMueWt8fE1iO25ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm9qPQpyLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlcoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sY2k6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTthP2IuSXNQYXVzZWQoKSYmYi5QbGF5KCk6KGIuUGxheSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5KCEwKX0uYmluZCh0aGlzKSwxMCkpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/CiExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMub2p8fE5iOyhmdW5jdGlvbihjKXtjLm5qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk09dGhpcy5NfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQ2UoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYKImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5uYSgpfS5iaW5kKHRoaXMpKX0sQ2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5DZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5qYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmkoKSl9fSxpOmZ1bmN0aW9uKGEpe3RoaXMuQyhhKX19KX0pKGMpOwp2YXIgT2I9Yy5uanx8T2I7KGZ1bmN0aW9uKGMpe2MucGo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuaGF8fHRoaXMuSyhjKXx8KHRoaXMuTChjKSwobmV3IE9iKGMsdGhpcy5GKSkuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBQYj1jLnBqfHxQYixRYj1uZXcgUGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmI9Yy51bnx8UmI7bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlhpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxjaTpmdW5jdGlvbigpe30sbGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQnJpZFBsYXllciJ9LGpuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7CnZhciBTYj1jLlhpfHxTYjsoZnVuY3Rpb24oYyl7Yy5ZaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT1hKXRoaXMuQ2UoKTtlbHNle2lmKCJvYmplY3QiPT10eXBlb2YgYSlpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnZhc3RFcnJvckNvZGUmJihhPWFbYl0udmFzdEVycm9yQ29kZSk7CmVsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmphKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWWl8fFRiOyhmdW5jdGlvbihjKXtjLlppPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycyxiO2ZvcihiIGluIGEpe3ZhciBjPW5ldyBTYihhW2JdKTtjLmhhfHx0aGlzLksoYyl8fCh0aGlzLkwoYyksd2luZG93LmJyaWRwbGF5ZXI9YywobmV3IFRiKGMsdGhpcy5GKSkuZigpKX19dGhpcy5PKCl9fSl9KShjKTt2YXIgVWI9Yy5aaXx8VWIsVmI9bmV3IFViKHQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuT209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLk9tfHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpO2Vsc2V7Zm9yKHZhciBiPWE7YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlUoKX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9CiExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxIbjpmdW5jdGlvbigpe3RoaXMuZWQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5lZHx8KHRoaXMuZWQ9ITAsdGhpcy5hZSgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5lZCYmCih0aGlzLmFlKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZWQ9ITEpLHRoaXMuYWUoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUDpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLkFrfHxYYjsoZnVuY3Rpb24oYyl7Yy56az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxXaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5nYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2guYmluZCh0aGlzKSwxMCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5Gaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwKMzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkZrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxsZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5nYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGcuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5XaCgpO3RoaXMubGcoKTt0aGlzLktuKCl9LEtuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsCmZ1bmN0aW9uKGEpe3RoaXMuZ2MoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuRm4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuRm49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5nYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy56a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQms9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYS5IbigpLGE9bmV3IFliKGEsdGhpcy5GKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksCmEuZigpKX10aGlzLk8oKX19KX0pKGMpO3ZhciBaYj1jLkJrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy53bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMud218fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmxrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZG49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGNpOmZ1bmN0aW9uKCl7fSxsYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRufSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy4kZChhKX0uYmluZCh0aGlzKSl9LCRkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlgmJnRoaXMuWCgpKX19KX0pKGMpO3ZhciBOPWMubGt8fE47KGZ1bmN0aW9uKGMpe2Mua2s9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLk9lKWlmKHRoaXMuT2J8fAoodGhpcy5PYj0wKSx0aGlzLk9iKyssMTU8dGhpcy5PYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5obygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuT2U9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7dGhpcy5lYShhKTt0aGlzLnhiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0seGI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56YX0sZWE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTT1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9CmEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5NPXRoaXMuTXx8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLmtrfHxPOyhmdW5jdGlvbihjKXtjLm1rPQpwLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmhhfHx0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBPKGEsdGhpcy5GKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuaGF8fAp0aGlzLksoYSl8fCh0aGlzLkwoYSksYT1uZXcgTyhhLHRoaXMuRiksYS5mKCkpKTt0aGlzLkFmKCk7dGhpcy5PKCl9fSl9KShjKTt2YXIgYmM9Yy5ta3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Paj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMuT2p8fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuRWp8fFo7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLk09dGhpcy5NfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuemE9dGhpcy5SYz10aGlzLkJhPXRoaXMucGQ9ITE7dGhpcy5VaD1mLlNiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsCnRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5lYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTSk7dGhpcy5kYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxlYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09CmEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLk09YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSx4YjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphfSxFYTpmdW5jdGlvbigpe3RoaXMuemE9CiEwfSxkYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGIoKT8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkRqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Gaj1wLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDtiKyspYT1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSyhhKXx8KHRoaXMuTChhKSxhPW5ldyBhYShhLHRoaXMuRiksYS5mKCkpKTt0aGlzLk8oKX19KX0pKGMpO3ZhciBlYz1jLkZqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkxsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy5MbHx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MubGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxJOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5sanx8aGM7KGZ1bmN0aW9uKGMpe2Mua2o9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBpYz1jLmtqfHwKaWM7KGZ1bmN0aW9uKGMpe2MubWo9cC5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmhhKXt0aGlzLk8oKTtyZXR1cm59aWYoIXRoaXMuSyhhKSl7dGhpcy5MKGEpOyhuZXcgaWMoYSx0aGlzLkYpKS5mKCk7dGhpcy5PKCk7cmV0dXJufX10aGlzLk8oKX19KX0pKGMpO3ZhciBqYz1jLm1qfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Ua3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmkuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuQmUoKTt0aGlzLkNnKCl9LGVhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5NPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemF9LEVhOmZ1bmN0aW9uKCl7dGhpcy56YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQ2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5qYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkNnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuQmUuYmluZCh0aGlzKSwxMDApfSxCZTpmdW5jdGlvbigpe2lmKCF0aGlzLnlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubmEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJlLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXAuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuaGE/dGhpcy5PKCk6dGhpcy5LKGEpfHwodGhpcy5MKGEpLChuZXcgbmMoYSx0aGlzLkYpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuTygpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuU2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlNrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuT2Q9W107dGhpcy56Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWWo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5obShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmJpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy56Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMuemZbZF07dGhpcy5YZihjKSYmKHRoaXMuT2QucHVzaChjKSx0aGlzLmJpKGMpKX19LFhmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0saG06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWQ9YVtmXSxkPXRoaXMuemZbZF0sdGhpcy5YZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxiaTpmdW5jdGlvbihhKXt0aGlzLlhmKGEpJiZhLmYoKX0sdm86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuT2QubGVuZ3RoO2ErKyl0aGlzLk9kW2FdLlpiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuT2RbYV0uWmIpfX19KShjKTt2YXIgcmM9CmMuWWp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuZGp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZi5MYyhrLlNvKSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5MYyhrLmhuKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7aWYoZG9jdW1lbnQuYm9keSl7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSl9ZWxzZSB0YXJnZXRXaW5kb3c9d2luZG93O3ZhciB2Yz1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHdjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBIPW5ldyBJLG09ITE7SC5nYSgpO0gueWgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmdhKCksZnVuY3Rpb24oYyl7bXx8CihtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEgueWgoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtILmdhKCk7Zi5OZSh3aW5kb3csZi5WKDEwKSx7fSk7dmFyIGlhPWYuVigxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yz1jLm1ufHx0YztuZXcgdGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuU2g9dGhpcy5jb25mPXRoaXMuTGI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLkpkPTA7dGhpcy5oYj0iIjtmLnZiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtibzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5oYj10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFluOmZ1bmN0aW9uKGEpe3RoaXMuTGI9YX0sWG46ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5oYl0mJnRoaXMuY29uZlt0aGlzLmhiXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuaGJdW2FdKTtyZXR1cm4gY30sJGM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuem0oKSl0aGlzLkxiLmcodGhpcy5MYi5RYyx0aGlzLkxiLnFhLHRoaXMuTGIueWYsZnVuY3Rpb24oKXt0aGlzLiRjKGEsYyl9LmJpbmQodGhpcyksdGhpcy5MYi5pYyk7ZWxzZSBpZihsLkRiJiYhbC5IaSlsLldtKGZ1bmN0aW9uKCl7dGhpcy4kYyhhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5vKGsuSGMsdGhpcy5wbGF5ZXIubCgpKTt2YXIgaD10aGlzLmNvbmYsbT1uZXcgWmEodGhpcy5nZXRQbGF5ZXIoKSxoKTsKYyYmbS54bygpO20uZXhpdEZ1bGxzY3JlZW4oKTtmLnZiKCJuZXdIb21hZERpc3BsYXkiKTtRPW09bmV3IFFhKG0sdGhpcy5MYixoKTttLlZuKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgcD0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihwPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEocCl9YXx8Zi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuZ2YmJihkPXRoaXMucGxheWVyLmdmKCkpO2guYWRTdGFydFRpbWVvdXQmJihnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTttLmpmKGEsZCxnKTt0aGlzLnBsYXllci5laShtKX19LHptOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuSmQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy5KZC5nZXRUaW1lKCksdGhpcy5KZD1hLDNFNTxjPyEwOiExOwp0aGlzLkpkPWE7cmV0dXJuITF9LG5vOmZ1bmN0aW9uKCl7Zi52YigicHJlcm9sbCIpO2YuRmYoInByZXJvbGwiKTt2YXIgYT10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkphKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5XZyhhKSk/dGhpcy4kYyhhKTooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfSxtbzpmdW5jdGlvbihhKXtpZighdGhpcy5TaCl7Zi5GZigicG9zdHJvbGwiKTtmLnZiKCJwb3N0cm9sbCIpO3RoaXMuYm8oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkphKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuV2coZCkpP3RoaXMuJGMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8KITA6YSk6KGYudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGYubyhrLndkLHRoaXMucGxheWVyLmwoKSkpfX0sV2c6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LE5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIua28odGhpcy5tby5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5NYSgpfSxUZDpmdW5jdGlvbihhKXtmLnZiKCJtaWRyb2xsIik7Zi5GZigibWlkcm9sbCIpO2lmKCF0aGlzLkhoKXt0aGlzLkhoPSEwO3ZhciBjPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuSmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLiRjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoPSExfS5iaW5kKHRoaXMpLDFFMykpOgooZi50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxmLm8oay53ZCx0aGlzLnBsYXllci5sKCkpKX19LE1uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuYW8odGhpcy5UZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5tZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5ubygpO3RoaXMucGxheWVyLm1mJiZ0aGlzLk1uKCk7dGhpcy5ObigpfX19KShjKTt2YXIgZmE9Yy5MaXx8ZmEsUT0hMSxtYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSm89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB1Yz1jLkpvfHx1YztuZXcgdWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoYWl4ZUNlZWRUaGVlc29oaixhaXhlQ2VlZFRoZWVzb2hqKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.12.56 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.56.12.76.144.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
843170e06a22bc019928db6559cffe4b5820dc57c43ef9b9e1458fa754dbbc8b

Request headers

Referer
https://player.pcgameshardware.de/?vid=81933&article_id=1332425&product_id=216880&site_id=24&trafSrc=direct&bax=true&s=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&a_icategoryId=&noad=false&showhd=true
Origin
https://player.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/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
Mon, 16 Mar 2020 20:08:46 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://player.pcgameshardware.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
120
userconnect
ih.adscale.de/ Frame F616
23 B
117 B
Script
General
Full URL
https://ih.adscale.de/userconnect?ssl=1&sid=YzU4MjQw&cbfn=stroeerCoreConnect&ts=1584389319374&umd=false
Requested by
Host: js.adscale.de
URL: https://js.adscale.de//userconnect.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.185.150.7 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-185-150-7.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
f41460caba986527812bbc0aca59a5991e94c63ad31c613f8a60658bbd0ce727

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

status
200
date
Mon, 16 Mar 2020 20:08:39 GMT
server
Apache-Coyote/1.1
content-length
23
content-type
application/javascript
container
tracking.m6r.eu/pixel/
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=0&n31=1&n121=2&n116=0&n104=0&n15=1&n155=0&n106=0&n153=0&n11=2&n120=6&n53=1&n154=0&n13=1&n125=0&n8=4&n137=0&n101=0&n108=0&n54=0&n110=1&n87=1&n149=0&n76=1&n66=0&n139=0&n160=0&n28=1&n107=0&n21=1&n117=4&n86=0&n147=4&n64=0&n36=1&n119=5&n22=1&n18=1&n161=0&n126=0&n92=3&n62=1&n57=1&n77=0&n83=0&n102=0&n105=0&n159=1&n20=1&n80=1&n12=3&n141=0&n157=1&n26=1&n99=1&n128=1&n73=1&n118=3&n85=0&n9=3&n23=1&n6=2&n63=0&n138=0&n140=0&n94=2&n111=0&n136=1&n16=1&n79=0&n93=4&n90=0&n55=1&n142=0&n7=2&n103=1&n158=1&n124=0&n75=1&n91=0&n114=0&n69=0&n10=3&n3=1&n82=1&n33=1&n59=1&n84=1&n5=3&n48=1&n109=1&n122=2&n32=1&n67=1&n115=1&n89=2&n123=1&n17=1&n78=1&n41=1&n81=1&n88=0&n39=1&n156=0&n148=0&n133=1
Requested by
Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-53-21.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
0f10363f958690706082b7ab77d381af142c1ce290cf3a896960ff86487bc6c6

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Mon, 16 Mar 2020 20:08:39 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
1518
userconnect.js
js.adscale.de// Frame BDAB
13 KB
5 KB
Script
General
Full URL
https://js.adscale.de//userconnect.js
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/getads.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.60.16.116 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-60-16-116.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
f42c1660abb2f7cab90dbb53e00646b993e52af97b452f929d2828735e3fd55b

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

x-amz-version-id
CUS4UlFYDRvq1QJqkBG1fpWORbOoTsem
Content-Encoding
gzip
Last-Modified
Wed, 11 Mar 2020 22:16:27 GMT
Server
AmazonS3
x-amz-request-id
ABF67314557C0B6F
ETag
"a60e8a5ff130c8f08ffb04322194a45e"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Mon, 16 Mar 2020 20:08:39 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4178
x-amz-id-2
zgC1qlyzV6uiTnGPOdKWtPXlY+2OZ/poZ1ECVIj+sol2WnorfhUrvsNB4bK1FHaONjg3g24LrVo=
show_ads.js
pagead2.googlesyndication.com/pagead/ Frame 2D0A
80 KB
29 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/show_ads.js
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/getads.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
2c27360a7e59d60c8758374b4fb3eb1d348ae8258957d85cb19eee45641523e5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:39 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
29839
x-xss-protection
0
server
cafe
etag
4009051522505345749
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Mon, 16 Mar 2020 20:08:39 GMT
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=406234227e2a1d846150e4fae9b08605&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D406234227e2a1d846150e4fae9b08605%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=406234227e2a1d846150e4fae9b08605&userId=adscale-user:200cff74ec9843a392936e21733824be
44 B
574 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=406234227e2a1d846150e4fae9b08605&userId=adscale-user:200cff74ec9843a392936e21733824be
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-53-21.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:39 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

status
307
date
Mon, 16 Mar 2020 20:08:39 GMT
server
Apache-Coyote/1.1
content-length
0
location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=406234227e2a1d846150e4fae9b08605&userId=adscale-user:200cff74ec9843a392936e21733824be
p3p
CP=NOI PSA OUR
bounce
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=406234227e2a1d846150e4fae9b08605
  • https://ib.adnxs.com/bounce?%2Fsetuid%3Fentity%3D197%26code%3D406234227e2a1d846150e4fae9b08605
43 B
1 KB
Image
General
Full URL
https://ib.adnxs.com/bounce?%2Fsetuid%3Fentity%3D197%26code%3D406234227e2a1d846150e4fae9b08605
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.80 , Netherlands, ASN29990 (ASN-APPNEX, US),
Reverse DNS
251.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:41 GMT
AN-X-Request-Uuid
c530ed2f-92b8-4125-afe6-1fdd16384d59
Content-Type
image/gif
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
X-Proxy-Origin
194.187.251.52; 194.187.251.52; 251.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.46:80
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT

Redirect headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:41 GMT
AN-X-Request-Uuid
95d11d70-1556-4637-83af-e75513b23bb9
Content-Type
text/html; charset=utf-8
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"
Location
https://ib.adnxs.com/bounce?%2Fsetuid%3Fentity%3D197%26code%3D406234227e2a1d846150e4fae9b08605
Cache-Control
no-store, no-cache, private
Connection
keep-alive
X-Proxy-Origin
194.187.251.52; 194.187.251.52; 251.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.75:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=QGI0In4qHYRhUOT66bCGBQ
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=QGI0In4qHYRhUOT66bCGBQ&google_tc=
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
44 B
569 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-53-21.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:39 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

pragma
no-cache
date
Mon, 16 Mar 2020 20:08:39 GMT
server
HTTP server (unknown)
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
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
302
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
m
ad.yieldlab.net/
Redirect Chain
  • https://tracking.m6r.eu/sync/yieldlabRedirect
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=406234227e2a1d846150e4fae9b08605
0
360 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=406234227e2a1d846150e4fae9b08605
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.61.243.29 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-61-243-29.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:39 GMT
x-content-type-options
nosniff
x-frame-options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
x-xss-protection
1; mode=block
x-application-context
application
Expires
Sun, 15 Mar 2020 20:08:39 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=406234227e2a1d846150e4fae9b08605
Date
Mon, 16 Mar 2020 20:08:39 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
99
Content-Type
text/plain; charset=utf-8
userconnect.js
js.adscale.de// Frame 4F2C
13 KB
5 KB
Script
General
Full URL
https://js.adscale.de//userconnect.js
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/getads.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.60.16.116 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-60-16-116.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
f42c1660abb2f7cab90dbb53e00646b993e52af97b452f929d2828735e3fd55b

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

x-amz-version-id
CUS4UlFYDRvq1QJqkBG1fpWORbOoTsem
Content-Encoding
gzip
Last-Modified
Wed, 11 Mar 2020 22:16:27 GMT
Server
AmazonS3
x-amz-request-id
ABF67314557C0B6F
ETag
"a60e8a5ff130c8f08ffb04322194a45e"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Mon, 16 Mar 2020 20:08:39 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4178
x-amz-id-2
zgC1qlyzV6uiTnGPOdKWtPXlY+2OZ/poZ1ECVIj+sol2WnorfhUrvsNB4bK1FHaONjg3g24LrVo=
show_ads.js
pagead2.googlesyndication.com/pagead/ Frame CE67
80 KB
29 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/show_ads.js
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/getads.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
2c27360a7e59d60c8758374b4fb3eb1d348ae8258957d85cb19eee45641523e5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:39 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
29839
x-xss-protection
0
server
cafe
etag
4009051522505345749
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Mon, 16 Mar 2020 20:08:39 GMT
integrator.js
adservice.google.de/adsid/ Frame 2D0A
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.pcgameshardware.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/show_ads.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
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"
timing-allow-origin
*
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/ Frame 2D0A
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.pcgameshardware.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/show_ads.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
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"
timing-allow-origin
*
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_fy2019.js
pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/ Frame 2D0A
222 KB
83 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/show_ads.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
7a94735f3a0e915a85bd8e216702c3146e1ffd2f6395276c8e5baee1249baaf1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:39 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
84919
x-xss-protection
0
server
cafe
etag
4312303881591303584
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Mon, 16 Mar 2020 20:08:39 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20200305/r20190131/ Frame BC96
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20200305/r20190131/zrt_lookup.html
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/show_ads.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:818::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/html/r20200305/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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

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
Fri, 06 Mar 2020 00:52:06 GMT
expires
Fri, 20 Mar 2020 00:52:06 GMT
content-type
text/html; charset=UTF-8
etag
10348540741379653356
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
4494
x-xss-protection
0
cache-control
public, max-age=1209600
age
933393
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
integrator.js
adservice.google.de/adsid/ Frame CE67
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.pcgameshardware.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/show_ads.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
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"
timing-allow-origin
*
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/ Frame CE67
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.pcgameshardware.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/show_ads.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
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"
timing-allow-origin
*
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_fy2019.js
pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/ Frame CE67
222 KB
83 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/show_ads.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
7a94735f3a0e915a85bd8e216702c3146e1ffd2f6395276c8e5baee1249baaf1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:39 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
84919
x-xss-protection
0
server
cafe
etag
4312303881591303584
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Mon, 16 Mar 2020 20:08:39 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 05E3
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-8813347375005258&output=html&h=250&slotname=5657321521&adk=1821734436&adf=3530038685&w=300&guci=1.2.0.0.2.2.0.0&url=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1584389319510&bpp=16&bdt=31&fdt=56&idt=56&shv=r20200305&cbv=r20190131&ptt=5&saldr=sa&correlator=4330314914533&frm=23&ife=4&pv=2&ga_vid=344564226.1584389320&ga_sid=1584389320&ga_hid=1115592230&ga_fc=0&iag=15&icsg=170&nhd=2&dssz=5&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=848&ady=2940&biw=1585&bih=1200&isw=0&ish=0&ifk=3724966447&scr_x=0&scr_y=0&eid=44713363&oid=3&pvsid=3935956550367115&rx=0&eae=2&fc=640&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C0%2C0&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=1044&bc=31&ifi=1&uci=1.etqwj5vphiit&btvi=1&fsb=1&dtd=70
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:818::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-8813347375005258&output=html&h=250&slotname=5657321521&adk=1821734436&adf=3530038685&w=300&guci=1.2.0.0.2.2.0.0&url=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1584389319510&bpp=16&bdt=31&fdt=56&idt=56&shv=r20200305&cbv=r20190131&ptt=5&saldr=sa&correlator=4330314914533&frm=23&ife=4&pv=2&ga_vid=344564226.1584389320&ga_sid=1584389320&ga_hid=1115592230&ga_fc=0&iag=15&icsg=170&nhd=2&dssz=5&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=848&ady=2940&biw=1585&bih=1200&isw=0&ish=0&ifk=3724966447&scr_x=0&scr_y=0&eid=44713363&oid=3&pvsid=3935956550367115&rx=0&eae=2&fc=640&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C0%2C0&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=1044&bc=31&ifi=1&uci=1.etqwj5vphiit&btvi=1&fsb=1&dtd=70
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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
IDE=AHWqTUl-79x0PiGsN3stXyT8Iz_CQr7Bgr-DmBP34GU-cXBbEJESQ88GCFijrxtr
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-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

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
Mon, 16 Mar 2020 20:08:39 GMT
server
cafe
content-length
5436
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/ Frame 2D0A
73 KB
27 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/r20200305/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
2733fb957d8514f74ed5c70171329edfb5243b062b668ffef13d52dbc68e45de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1584099738113808"
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
27563
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:39 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 8F25
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-8813347375005258&output=html&h=250&slotname=5657321521&adk=1821734436&adf=3530038684&w=300&guci=1.2.0.0.2.2.0.0&url=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1584389319538&bpp=7&bdt=31&fdt=86&idt=86&shv=r20200305&cbv=r20190131&ptt=5&saldr=sa&correlator=4330314914533&frm=23&ife=4&pv=1&ga_vid=2006618431.1584389320&ga_sid=1584389320&ga_hid=595966684&ga_fc=0&iag=15&icsg=170&nhd=2&dssz=5&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&isw=0&ish=0&ifk=3724966447&scr_x=0&scr_y=0&oid=3&pvsid=2077835812915466&rx=0&eae=2&fc=640&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C0%2C0&vis=1&rsz=%7C%7CEr%7C&abl=CS&pfx=0&fu=1044&bc=31&ifi=1&uci=1.b6yteppaamj7&fsb=1&dtd=89
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:818::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-8813347375005258&output=html&h=250&slotname=5657321521&adk=1821734436&adf=3530038684&w=300&guci=1.2.0.0.2.2.0.0&url=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1584389319538&bpp=7&bdt=31&fdt=86&idt=86&shv=r20200305&cbv=r20190131&ptt=5&saldr=sa&correlator=4330314914533&frm=23&ife=4&pv=1&ga_vid=2006618431.1584389320&ga_sid=1584389320&ga_hid=595966684&ga_fc=0&iag=15&icsg=170&nhd=2&dssz=5&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&isw=0&ish=0&ifk=3724966447&scr_x=0&scr_y=0&oid=3&pvsid=2077835812915466&rx=0&eae=2&fc=640&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C0%2C0&vis=1&rsz=%7C%7CEr%7C&abl=CS&pfx=0&fu=1044&bc=31&ifi=1&uci=1.b6yteppaamj7&fsb=1&dtd=89
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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
IDE=AHWqTUl-79x0PiGsN3stXyT8Iz_CQr7Bgr-DmBP34GU-cXBbEJESQ88GCFijrxtr
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-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

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
Mon, 16 Mar 2020 20:08:39 GMT
server
cafe
content-length
5052
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/ Frame CE67
73 KB
27 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/r20200305/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
2733fb957d8514f74ed5c70171329edfb5243b062b668ffef13d52dbc68e45de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1584099738113808"
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
27563
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:39 GMT
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.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.37.53.21 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-53-21.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Date
Mon, 16 Mar 2020 20:08:39 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame 7764
0
0
Document
General
Full URL
https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.108 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx/1.9.13 /
Resource Hash

Request headers

Host
acdn.adnxs.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-Dest
iframe
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site
cross-site
Sec-Fetch-Mode
navigate
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Accept-Encoding
gzip, deflate, br
Accept-Language
en-US
Cookie
uuid2=5828863817140973350; anj=dTM7k!M4.FD>6NRF']wIg2C'!tAsvs!]tbPl1N!7Qhn_4=BWUcgkNKXfR0Ot1.)ekdWo`Jj3-=j2Q^i5fm^i?ck=:UhQfE@/tCa$.wL4W1R#Xp+%(ad*H9bN
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-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

Server
nginx/1.9.13
Content-Type
text/html
Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
W/"573e714d-3e3"
Expires
Sun, 06 Aug 2017 09:41:59 GMT
Cache-Control
max-age=31536000
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Via
1.1 varnish 1.1 varnish
Content-Length
506
Accept-Ranges
bytes
Date
Mon, 16 Mar 2020 20:08:39 GMT
Age
19304805
Connection
keep-alive
X-Served-By
cache-jfk8138-JFK, cache-fra19135-FRA
X-Cache
HIT, HIT
X-Cache-Hits
391291, 2274792
X-Timer
S1584389320.879883,VS0,VE0
Vary
Accept-Encoding
showad.js
ads.pubmatic.com/AdServer/js/ Frame 42E5
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?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
92.122.252.114 , Ascension Island, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a92-122-252-114.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-Dest
iframe
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site
cross-site
Sec-Fetch-Mode
navigate
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Accept-Encoding
gzip, deflate, br
Accept-Language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

Last-Modified
Tue, 04 Feb 2020 05:12:07 GMT
ETag
"13006b6-9f85-59db914d12ccf"
Server
Apache/2.2.15 (CentOS)
Accept-Ranges
bytes
Content-Encoding
gzip
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
14955
Content-Type
text/html; charset=UTF-8
Cache-Control
public, max-age=58598
Expires
Tue, 17 Mar 2020 12:25:17 GMT
Date
Mon, 16 Mar 2020 20:08:39 GMT
Connection
keep-alive
Vary
Accept-Encoding
index.html
cdn.districtm.io/ids/ Frame 24B8
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?pcgameshardware.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.16.68.69 , United States, ASN13335 (CLOUDFLARENET, 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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
date
Mon, 16 Mar 2020 20:08:39 GMT
content-type
text/html
set-cookie
__cfduid=d70b126f8a2c73465e0274fbea3e9038e1584389319; expires=Wed, 15-Apr-20 20:08:39 GMT; path=/; domain=.districtm.io; HttpOnly; SameSite=Lax
cf-ray
57511b812c822ba4-AMS
cache-control
s-maxage=1209600, max-age=14400
last-modified
Thu, 10 Jan 2019 16:50:48 GMT
strict-transport-security
max-age=31536000; includeSubDomains; preload
cf-cache-status
DYNAMIC
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
server
cloudflare
content-encoding
br
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame E4C9
0
0
Document
General
Full URL
https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.108 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx/1.9.13 /
Resource Hash

Request headers

Host
acdn.adnxs.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-Dest
iframe
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site
cross-site
Sec-Fetch-Mode
navigate
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Accept-Encoding
gzip, deflate, br
Accept-Language
en-US
Cookie
uuid2=5828863817140973350; anj=dTM7k!M4.FD>6NRF']wIg2C'!tAsvs!]tbPl1N!7Qhn_4=BWUcgkNKXfR0Ot1.)ekdWo`Jj3-=j2Q^i5fm^i?ck=:UhQfE@/tCa$.wL4W1R#Xp+%(ad*H9bN
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-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

Server
nginx/1.9.13
Content-Type
text/html
Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
W/"573e714d-3e3"
Expires
Sun, 06 Aug 2017 09:41:59 GMT
Cache-Control
max-age=31536000
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Via
1.1 varnish 1.1 varnish
Content-Length
506
Accept-Ranges
bytes
Date
Mon, 16 Mar 2020 20:08:39 GMT
Age
19304804
Connection
keep-alive
X-Served-By
cache-jfk8138-JFK, cache-fra19134-FRA
X-Cache
HIT, HIT
X-Cache-Hits
391291, 1006693
X-Timer
S1584389320.904267,VS0,VE0
Vary
Accept-Encoding
showad.js
ads.pubmatic.com/AdServer/js/ Frame 9C2B
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?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
92.122.252.114 , Ascension Island, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a92-122-252-114.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-Dest
iframe
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site
cross-site
Sec-Fetch-Mode
navigate
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Accept-Encoding
gzip, deflate, br
Accept-Language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

Last-Modified
Tue, 04 Feb 2020 05:12:07 GMT
ETag
"13006b6-9f85-59db914d12ccf"
Server
Apache/2.2.15 (CentOS)
Accept-Ranges
bytes
Content-Encoding
gzip
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
14955
Content-Type
text/html; charset=UTF-8
Cache-Control
public, max-age=58598
Expires
Tue, 17 Mar 2020 12:25:17 GMT
Date
Mon, 16 Mar 2020 20:08:39 GMT
Connection
keep-alive
Vary
Accept-Encoding
pd
eu-u.openx.net/w/1.0/ Frame 938F
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?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.179.0 /
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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
i=2d3e251e-43e7-0d76-2ae3-110988841e7c|1584389319
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-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
vary
Accept, Accept-Encoding
set-cookie
i=2d3e251e-43e7-0d76-2ae3-110988841e7c|1584389319; Version=1; Expires=Tue, 16-Mar-2021 20:08:39 GMT; Max-Age=31536000; Secure; Domain=.openx.net; Path=/; SameSite=None pd=v2|1584389319|mOgikimWiygu; Version=1; Expires=Tue, 31-Mar-2020 20:08:39 GMT; Max-Age=1296000; Secure; Domain=.openx.net; Path=/; SameSite=None
server
OXGW/16.179.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Mon, 16 Mar 2020 20:08:39 GMT
content-type
text/html
content-length
374
content-encoding
gzip
via
1.1 google
alt-svc
clear

Redirect headers

status
302
set-cookie
i=2d3e251e-43e7-0d76-2ae3-110988841e7c|1584389319; Version=1; Expires=Tue, 16-Mar-2021 20:08:39 GMT; Max-Age=31536000; Secure; Domain=.openx.net; Path=/; SameSite=None
server
OXGW/16.179.0
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
Mon, 16 Mar 2020 20:08:39 GMT
content-length
0
via
1.1 google
alt-svc
clear
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame 659B
0
0
Document
General
Full URL
https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.13.108 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
nginx/1.9.13 /
Resource Hash

Request headers

Host
acdn.adnxs.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-Dest
iframe
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site
cross-site
Sec-Fetch-Mode
navigate
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Accept-Encoding
gzip, deflate, br
Accept-Language
en-US
Cookie
uuid2=5828863817140973350; anj=dTM7k!M4.FD>6NRF']wIg2C'!tAsvs!]tbPl1N!7Qhn_4=BWUcgkNKXfR0Ot1.)ekdWo`Jj3-=j2Q^i5fm^i?ck=:UhQfE@/tCa$.wL4W1R#Xp+%(ad*H9bN
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-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

Server
nginx/1.9.13
Content-Type
text/html
Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
W/"573e714d-3e3"
Expires
Sun, 06 Aug 2017 09:41:59 GMT
Cache-Control
max-age=31536000
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Via
1.1 varnish 1.1 varnish
Content-Length
506
Accept-Ranges
bytes
Date
Mon, 16 Mar 2020 20:08:39 GMT
Age
19304805
Connection
keep-alive
X-Served-By
cache-jfk8138-JFK, cache-fra19135-FRA
X-Cache
HIT, HIT
X-Cache-Hits
391291, 2274793
X-Timer
S1584389320.904421,VS0,VE0
Vary
Accept-Encoding
usync.html
eus.rubiconproject.com/ Frame DCA3
0
0
Document
General
Full URL
https://eus.rubiconproject.com/usync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.37.55.184 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-37-55-184.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) / PHP/5.3.3
Resource Hash

Request headers

Host
eus.rubiconproject.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-Dest
iframe
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site
cross-site
Sec-Fetch-Mode
navigate
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Accept-Encoding
gzip, deflate, br
Accept-Language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

Server
Apache/2.2.15 (CentOS)
X-Powered-By
PHP/5.3.3
p3p
CP="NOI CURa ADMa DEVa TAIa OUR # BUS IND UNI COM NAV INT"
Last-Modified
Wed, 04 Mar 2020 22:48:14 GMT
Content-Encoding
gzip
Content-Length
7619
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=38559
Expires
Tue, 17 Mar 2020 06:51:19 GMT
Date
Mon, 16 Mar 2020 20:08:40 GMT
Connection
keep-alive
Vary
Accept-Encoding
4933062463
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/4933062463
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.194.21.214 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-194-21-214.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:40 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/4933062463
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
data
lb35.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb35.s400.meetrics.net/data?/hQk4OJOBALlnFHUkzFCCPIAAAAAAAABI3AAPAAAFAAI3ATjHWAPAAAQNA8tABjHWAZAAAOA55A55A85B55A58E55A55AEAz1Ay4ArjHWAPbDAQNA8tAHjHWAPAAAsEA6DAMjHWAPBAAAAAAAAIPhsASksFmGjAAAAAAAAAAAAEAAAI3AAAAAAAAHAklFzrF0vFwBFQAhyF0pFrlFsfFz0FhuFkhFykFeAkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFHAzwAy4Ey1AwBEMAxzA4yA20A20A5zAz5AGAkpFylFj0FAAAAIAy4AxyA11Az1AKA05AzzAw2AzxA51AKAylFj0FhuFnsFlzBKA05AzzAw2AzxA51AKA05AzzAw2AzxA51AIBlyAG0B00A0lAyGEkpFzwFfjF0jFfwFjnFhtFlzFohFykF3hFylFukElfFzkFlyAGhFy0FprFlsFfzF0hFukFhyFklByGEylFj0FhuFnsFlzBdQNA8tAuEA6DAFAAAjHWAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFgfQCTA
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.5.14 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h233.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:40 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Mon, 16-Mar-20 20:08:39 GMT
4933063195
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/4933063195
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?pcgameshardware.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.194.21.214 Frankfurt am Main, Germany, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-194-21-214.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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, 16 Mar 2020 20:08:41 GMT
x-powered-by
Express
etag
W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
x-key
/bl/4444/4933063195
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
2
tag
a.teads.tv/page/95637/ Frame 77A0
746 B
795 B
Script
General
Full URL
https://a.teads.tv/page/95637/tag
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.210.248.12 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-210-248-12.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
d170e295eea0907915ceb097e46c1e18d8ddb5e495bf7b0a4288c664c0bef6dd

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:41 GMT
content-encoding
gzip
access-control-allow-origin
*
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
status
200
cache-control
private, must-revalidate, max-age=3600
access-control-allow-credentials
true
content-length
463
expires
Mon, 16 Mar 2020 21:08:41 GMT
teads-format.min.js
a.teads.tv/media/format/v3/
675 KB
185 KB
Script
General
Full URL
https://a.teads.tv/media/format/v3/teads-format.min.js
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/page/95637/tag
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.210.248.12 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-210-248-12.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
40745144ae5b38c14311b9bbf54e81dcea13a65c431579155f70ef4f41bcff13

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:41 GMT
content-encoding
gzip
last-modified
Mon, 16 Mar 2020 15:12:13 GMT
x-amz-request-id
080A87FCA5C06280
etag
"5da052a35887c5a0814ad6c51b6baa22"
vary
Accept-Encoding
content-type
text/javascript;charset=utf-8
status
200
cache-control
private, must-revalidate, max-age=600, no-transform
x-bucket
9
accept-ranges
bytes
content-length
189029
x-amz-id-2
I1Z4mLHWszjoYjNB7pdQgnFVDmzOC8v/wJFSP4ijbG6K22NIfzQqtV1nTIN6hOVKqoRzmPiyApU=
expires
Mon, 16 Mar 2020 20:18:41 GMT
p2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1584389322059&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_s...
  • https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1584389322059&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_...
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1584389322059&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=16311930&cs_ucfr=1
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.11.238.95 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-11-238-95.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:42 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Expires
Mon, 01 Jan 1990 00:00:00 GMT
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

Location
https://sb.scorecardresearch.com/p2?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1584389322059&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=16311930&cs_ucfr=1
Pragma
no-cache
Date
Mon, 16 Mar 2020 20:08:42 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
track
t.teads.tv/
23 B
143 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1584389322056&pageId=95637&pid=103521&env=js-web&pfid=[pfid]&f=1&vid=[viewerId]&auctid=97cffea0-a55d-4598-8b73-42a5ab943c97&fv=278-for-3823&referer=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
72.247.225.182 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a72-247-225-182.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

status
200
date
Mon, 16 Mar 2020 20:08:42 GMT
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
23
expires
Sat, 26 Jul 1997 05:00:00 GMT
track
t.teads.tv/
23 B
143 B
Image
General
Full URL
https://t.teads.tv/track?action=slotAvailable&ts=1584389322057&pageId=95637&pid=103521&env=js-web&pfid=[pfid]&f=1&slot=native&vid=[viewerId]&auctid=97cffea0-a55d-4598-8b73-42a5ab943c97&fv=278-for-3823&referer=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
72.247.225.182 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a72-247-225-182.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

status
200
date
Mon, 16 Mar 2020 20:08:42 GMT
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
23
expires
Sat, 26 Jul 1997 05:00:00 GMT
ad
a.teads.tv/page/95637/
168 B
430 B
XHR
General
Full URL
https://a.teads.tv/page/95637/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F&page=%7B%22id%22%3A95637%2C%22placements%22%3A%5B%7B%22id%22%3A103521%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A610%2C%22height%22%3A343%7D%2C%22slotType%22%3A%22native%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&auctid=97cffea0-a55d-4598-8b73-42a5ab943c97&userId=3c5eae62-4f38-422e-90bc-3004526caf03&formatVersion=2.22.61&env=js-web&netBw=10&ttfb=332
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.210.248.12 , Netherlands, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-210-248-12.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
ab932140887619c7a62746e754bdf982840ed9adfcf54e72ef5f91224894071f

Request headers

Accept
application/json; charset=UTF-8
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:42 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/json
access-control-allow-origin
https://www.pcgameshardware.de
cache-control
max-age=0, no-cache, no-store
access-control-allow-credentials
true
content-length
168
expires
Mon, 16 Mar 2020 20:08:42 GMT
iframe
sync.teads.tv/ Frame 9508
0
0
Document
General
Full URL
https://sync.teads.tv/iframe?pid=103521&userId=3c5eae62-4f38-422e-90bc-3004526caf03&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&fromFormat=true&env=js-web&1584389322185
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
95.100.64.146 , Ascension Island, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a95-100-64-146.deploy.static.akamaitechnologies.com
Software
akka-http/10.1.5 /
Resource Hash

Request headers

:method
GET
:authority
sync.teads.tv
:scheme
https
:path
/iframe?pid=103521&userId=3c5eae62-4f38-422e-90bc-3004526caf03&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&fromFormat=true&env=js-web&1584389322185
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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
cookie
cs=1; tt_viewer=9b65e9bb-d9b0-4305-b053-3109cf4b2bde
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-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
content-type
text/html; charset=UTF-8
server
akka-http/10.1.5
vary
Accept-Encoding
content-encoding
gzip
expires
Mon, 16 Mar 2020 20:08:42 GMT
cache-control
max-age=0, no-cache, no-store
pragma
no-cache
date
Mon, 16 Mar 2020 20:08:42 GMT
content-length
621
set-cookie
tt_bluekai=; Expires=Tue, 17 Mar 2020 20:08:42 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_exelate=; Expires=Tue, 17 Mar 2020 20:08:42 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_emetriq=; Expires=Tue, 17 Mar 2020 20:08:42 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_liveramp=; Expires=Tue, 17 Mar 2020 20:08:42 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_neustar=; Expires=Tue, 17 Mar 2020 20:08:42 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_salesforce=; Expires=Tue, 17 Mar 2020 20:08:42 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_dar=; Expires=Tue, 17 Mar 2020 20:08:42 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_skp=; Expires=Tue, 17 Mar 2020 20:08:42 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None tt_retargetly=; Expires=Tue, 17 Mar 2020 20:08:42 GMT; Max-Age=86400; Domain=.teads.tv; Path=/; Secure; SameSite=None
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://www.google-analytics.com/r/collect?v=1&_v=j81&aip=1&a=1796390970&t=event&_s=2&dl=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-K...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1536541-2&cid=766020357.1584389316&jid=854485460&_gid=1542115608.1584389316&gjid=1164420051&_v=j81&z=568947992
35 B
102 B
Image
General
Full URL
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1536541-2&cid=766020357.1584389316&jid=854485460&_gid=1542115608.1584389316&gjid=1164420051&_v=j81&z=568947992
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c0c::9d Brussels, Belgium, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
strict-transport-security
max-age=10886400; includeSubDomains; preload
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
date
Mon, 16 Mar 2020 20:08:45 GMT
content-type
image/gif
status
200
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

Redirect headers

pragma
no-cache
date
Mon, 16 Mar 2020 20:08:45 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1536541-2&cid=766020357.1584389316&jid=854485460&_gid=1542115608.1584389316&gjid=1164420051&_v=j81&z=568947992
content-type
text/html; charset=UTF-8
status
302
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
416
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43099:time[url:%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F,type_article:shortread,article_layout:default,site_skin:desktop,device:desktop,custom_page_type:Article%20page,cdn_version:16]&s=cd2ea0ee84729421a1b2d2efabec8ba5&1584389325608
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/I99SivONLxYO
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:45 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
sodar
pagead2.googlesyndication.com/getconfig/ Frame 2D0A
7 KB
5 KB
XHR
General
Full URL
https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gda&tv=r20200305&st=env
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
c678042969d9f9d2bcbe0632519ccb358d097471ee3f9c85f142b8d6b685a2ae
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:48 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
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
private
content-disposition
attachment; filename="f.txt"
content-type
application/json; 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
5264
x-xss-protection
0
sodar2.js
tpc.googlesyndication.com/sodar/ Frame 2D0A
14 KB
5 KB
Script
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:48 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582746470043195"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
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
5456
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:48 GMT
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/ Frame 5EA5
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/sodar/sodar2/209/runner.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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
5727
date
Mon, 16 Mar 2020 19:13:52 GMT
expires
Tue, 16 Mar 2021 19:13:52 GMT
last-modified
Tue, 25 Feb 2020 17:32:01 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
3296
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
sodar
pagead2.googlesyndication.com/getconfig/ Frame CE67
7 KB
5 KB
XHR
General
Full URL
https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gda&tv=r20200305&st=env
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
69867d996e05e1aa4c941e9ffa394ac9ccc7faf50c92761942ed4f9b7bd9dab1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:49 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
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
private
content-disposition
attachment; filename="f.txt"
content-type
application/json; 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
5144
x-xss-protection
0
sodar2.js
tpc.googlesyndication.com/sodar/ Frame CE67
14 KB
5 KB
Script
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200305/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:49 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582746470043195"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
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
5456
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:49 GMT
gen_204
pagead2.googlesyndication.com/pagead/ Frame 2D0A
0
49 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gda_r20200305&jk=3935956550367115&bg=!cnGlcWlYS-EcU9Qgm1wCAAAAaFIAAAAPmQGIlBhOZstZRK1PZFOTmZWn8POnxxtl1edypGKXgorQo4EgDj7SZxjWC5jOWnjLhm8LyX4rT6FYNOV3kdHAMmAmjI2jkcnD3og6ATdlNzZ9oj9iyBXKjUxJpQYBZeMfhJG8d23zXDO3KwWkwOUwuVyAUKNcqHRwvCSr3Kl1n-eVOyEllSh5tbCTSnzq3YvwcijIK-tJV6a2-osDtB3yfwEYVBIKrPo-scP9v5CqCrfwIADggVsvidvzDQRDq4S3i7X7ktPYLHN0ywqC1mQKCTVOgYevidBff6bjigm57ThnXyHS_s01i_9X0ja508lWZasyi_WADw1OIBoLT-f72ljZC_Qnh0w6rYfsw3ICCcsIcpqrYmhjXvLx6JhuPhtYHSYTZpuWjOJOponOMWQyUrAnkfh6wIBl-MlFTq8UOMmnT1wYc6hmMrjoCDJgcYsYAgPQ2rlQ2TmK0RBTYjhaoXfHOLtp-HpguLhgoZzP6h_bztgF9w_rRvAJAdc34OI9S5q7XwAZsbf195Q
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

pragma
no-cache
date
Mon, 16 Mar 2020 20:08:49 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
timing-allow-origin
*
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
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/ Frame 399D
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/sodar/sodar2/209/runner.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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
5727
date
Mon, 16 Mar 2020 19:13:52 GMT
expires
Tue, 16 Mar 2021 19:13:52 GMT
last-modified
Tue, 25 Feb 2020 17:32:01 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
3297
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
gen_204
pagead2.googlesyndication.com/pagead/ Frame CE67
0
58 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gda_r20200305&jk=2077835812915466&bg=!6eql6vJYThZaUnT6vjoCAAAAgVIAAAAPmQGIbuirb4IzmPw8oRPdC2sPucYM4mf_DqZUR0OmXGb5vA7SkafNxU8Kw_bhtnosbyMYHkiwPW_A0nqqvQbJqL8BxT1RxboGugVcASDPn63Mdj_Jq1vCDcaR9SxmMB4uqtTNhi7J55Dl7AaALBzT2nVsALBWHHTxjvnmvI0kuJyKWuwYR5GoIcels7_LdIExHTDR62ZRelHtdSSY0hKIj0-thKp5FRLgb2_C4Jc3kuuZdtsADHLpqDNWlosXsoyneMG_6UGDlk65OxRrTVZp98uQMrupiFP7seatAn7FG_3o7KQG-p-ZwyKRPVXeVFiFCpF9pQBwzsJndmApTTCwUaKv2rPdaIDdZ7yyv2i7YO9XWfp8Uw1kGVbwcu6preWRjkSWPZJqYZc3C6QkyJ4tEf5nJPSxCxDj8yCIVguxy9veTdfLsuxV63FtE8ZGBKddw1nGfOLUiqClVsRlyzFAarIVLIjKzBwcf25wprLJ6s3QutktoOEVzAeh87EkqLdKOnqt_ruInoS9i34
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

pragma
no-cache
date
Mon, 16 Mar 2020 20:08:49 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
timing-allow-origin
*
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
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
style.min.css
www.pcgameshardware.de/common/disclaimer/
3 KB
941 B
Stylesheet
General
Full URL
https://www.pcgameshardware.de/common/disclaimer/style.min.css?v=8
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/general-min.js?12362
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:10::6814:d2f , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
364f899b805c5a35f212e72e9f974a5d2d6c92a5afd25e64110eabf9f7dba6a7
Security Headers
Name Value
Strict-Transport-Security max-age=15552000; preload

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
style

Response headers

date
Mon, 16 Mar 2020 20:08:49 GMT
content-encoding
br
vary
Accept-Encoding
cf-cache-status
HIT
age
1566765
status
200
alt-svc
h3-27=":443"; ma=86400, h3-25=":443"; ma=86400, h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-clacks-overhead
GNU Terry Pratchett
last-modified
Thu, 27 Feb 2020 16:55:57 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security
max-age=15552000; preload
content-type
text/css
cache-control
max-age=2592000
cf-ray
57511bbe2842d6d9-FRA
expires
Sat, 28 Mar 2020 16:56:04 GMT
/
track.adform.net/Serving/Cookie/
73 B
494 B
Script
General
Full URL
https://track.adform.net/Serving/Cookie/?adfaction=getjs;adfcookname=uid
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.6.246 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

pragma
no-cache
date
Mon, 16 Mar 2020 20:08:49 GMT
content-encoding
gzip
server
nginx
access-control-allow-origin
*
vary
Accept-Encoding
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
strict-transport-security
max-age=31536000; includeSubDomains
content-type
text/javascript; charset=utf-8
content-length
180
expires
-1
sodar
pagead2.googlesyndication.com/getconfig/
7 KB
5 KB
XHR
General
Full URL
https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020030501&st=env
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
448d79555f251e9bb3bcee9b24e9aa35e5f690832cebd97447fc9044e66d667b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:49 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
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
private
content-disposition
attachment; filename="f.txt"
content-type
application/json; 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
5196
x-xss-protection
0
sodar2.js
tpc.googlesyndication.com/sodar/
14 KB
5 KB
Script
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020030501.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:49 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1582746470043195"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
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
5456
x-xss-protection
0
expires
Mon, 16 Mar 2020 20:08:49 GMT
map.js
js.adscale.de/
8 KB
3 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
23.60.16.116 , United States, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a23-60-16-116.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
cd35bc55a5ecd62262573cf9ccc375655037af31050180f4bf0cebbf029cb24b

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

x-amz-version-id
qtZmWRBRr.Pa8PedETo_PyNfil3RjfiH
Content-Encoding
gzip
Last-Modified
Wed, 11 Mar 2020 22:16:27 GMT
Server
AmazonS3
x-amz-request-id
FBA39C46FFAB5F78
ETag
"08f4f578807fb4ba2164e4880934b605"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Mon, 16 Mar 2020 20:08:49 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2644
x-amz-id-2
aU2yu7/BXr6XaFVR17qUErb4h63Ty6rhO4+RxLaDAJ0gqldsbM6DO7C+9kiUI3uiu13GaAFmnzk=
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=59857018
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/metaTag.min.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.108 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
5318e6f99439de8be22212f030c069a25e38feb81952f4fed93121eed1aef3b4

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:50 GMT
content-encoding
gzip
last-modified
Thu, 16 Jan 2020 08:30:04 GMT
server
nginx
etag
W/"5e201f0c-9d13"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Mon, 16 Mar 2020 20:13:50 GMT
ibb_map.js
bbcdn-bbnaut.ibillboard.com/library/
0
316 B
Script
General
Full URL
https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/metaTag.min.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
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Mon, 16 Mar 2020 20:08:49 GMT
Last-Modified
Thu, 27 Feb 2020 10:44:01 GMT
Server
ibillboard
ETag
"5e579d71-0"
Content-Type
application/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
0
Expires
Mon, 23 Mar 2020 11:47:20 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: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.171.36.151 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-54-171-36-151.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
c66d3c57676253019cfd4315afeead909efc06b27b54a85a6debce549fb1f53e

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

status
200
date
Mon, 16 Mar 2020 20:08:50 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
1711
content-type
text/javascript
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: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_pcgameshardware/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:214f:c200:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 17:39:07 GMT
via
1.1 9d27077cd67d98c0474b05ec9d68df4a.cloudfront.net (CloudFront)
last-modified
Tue, 22 Oct 2019 20:22:52 GMT
server
AmazonS3
age
66394
etag
"f53f55cbab099be3a970b446a66c496a"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA53-C1
accept-ranges
bytes
content-length
3167
x-amz-cf-id
xUF1lJ-3Kv-NsqQvtySOOLlu-qoRUiV90qnDGTDgT6nepr8Viye67A==
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
582 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=78026141&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, US),
Reverse DNS
175.238.186.35.bc.googleusercontent.com
Software
Apache /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

pragma
no-cache
date
Mon, 16 Mar 2020 20:08:50 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
runner.html
tpc.googlesyndication.com/sodar/sodar2/209/ Frame EA14
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/sodar/sodar2/209/runner.html
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/sodar/sodar2/209/runner.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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
5727
date
Mon, 16 Mar 2020 19:13:52 GMT
expires
Tue, 16 Mar 2021 19:13:52 GMT
last-modified
Tue, 25 Feb 2020 17:32:01 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
3297
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
gen_204
pagead2.googlesyndication.com/pagead/
0
58 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=209&t=2&li=gpt_2020030501&jk=251194220074141&bg=!AgGlARlYbW2_AeM1IB4CAAAATlIAAAAOmQFidZxkY0eGIytadA1oJeEU0DHUyfunJrTKYlbbKl2yyxfeByHFppXt6h5RPXpgo1TLyVZ4-3dRsyWo6wayZIfbucmGFrr7tUS7-ypdTotlh-2T-Qp3iMVyFApsGA5WdSRckVIP72_LkeuuKoWq8RgYjHUYL2Pv9HNvtHSw7L5w2qcO3fVpjFd-OURYD2l_iDtPenkgUqOjAKNsttogIPd4h8NmJBqQDO4Mw-nb2Kev01N9evkzdqdNNI0uRFjQYHCWWya9huH-vP0hintt3tvJFLsz1DsOt4OvYr6XwFZQnzqOL_QgPzh9FNCrOoMQj96ED3cw4aN-xEYngm3TMU_bQbZw4epzSKKJr0YL2ewLJcM8Xrursm6AOLD2KJYI5oDthSdO_UDctJQwVdrh9oG87GBZmIdQqP5-VcanXanRNsVHMs_wdNxh1Tn2mOicoxaO27JmHu_eW3e5aX7cyXZ8Ljpd
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
image

Response headers

pragma
no-cache
date
Mon, 16 Mar 2020 20:08:49 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
204
cache-control
no-cache, must-revalidate
timing-allow-origin
*
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
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
launcher.js
sak.userreport.com/sdm/
64 KB
20 KB
Script
General
Full URL
https://sak.userreport.com/sdm/launcher.js
Requested by
Host: nugmw.userreport.com
URL: https://nugmw.userreport.com/rc-ap/a50c4aea-1a1c-4b59-9225-0fbb8df2380e/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=323749351&nuggtg=&nuggrid=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.194.82 Seattle, United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-224-194-82.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
11f657ce5b3863f922a6aeb2e3b941ef6e62e0ed7520a2c4219845dc6e9d7ce6

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

x-amz-version-id
EXU9V3ttNyKFw72iiKIE0d3m94vnR2Xc
content-encoding
gzip
last-modified
Mon, 16 Mar 2020 10:40:56 GMT
server
AmazonS3
age
37
date
Mon, 16 Mar 2020 20:08:13 GMT
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=7200, s-maxage=60
x-amz-cf-pop
FRA2-C1
x-amz-cf-id
V1Qcai4zRqC1LdKwaXT1Y3j5XbX6YeZn6zuEcVzpE5D03UpZBGtMxg==
via
1.1 5a5b94c62ea85e0c0d78b169589b08b5.cloudfront.net (CloudFront)
p.min.js
cdn.emetriq.de/adp/profiling/0.2.25/
5 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.25/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:2204:d200:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
fda97ec20907646eef81309463a8f352dd07cb189eabb717c66fc1757c8c6f3f

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 02 Mar 2020 20:05:24 GMT
content-encoding
gzip
last-modified
Fri, 21 Feb 2020 07:34:56 GMT
server
AmazonS3
age
1209807
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
5FyQWcxtGpTx80dn9lJhhCWeIQOZ27ta
status
200
cache-control
max-age=31536000, no-transform, public
x-amz-cf-pop
AMS50-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
_jRczfn0xJfyNKQKl_vonVzOXJKIHqM1OsRpa3z90JIALUeXKseBqA==
via
1.1 ec354e6d520d6c5c48f3933476169123.cloudfront.net (CloudFront)
/
d.agkn.com/iframe/8613/ Frame 2B96
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=573868803&gdpr=&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F%22%2C%22gdpr%22%3A%22%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Requested by
Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:21f3:7c00:19:fc2c:a140:93a1 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

:method
GET
:authority
d.agkn.com
:scheme
https
:path
/iframe/8613/?che=573868803&gdpr=&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F%22%2C%22gdpr%22%3A%22%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
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-dest
iframe
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
cross-site
sec-fetch-mode
navigate
referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

status
200
content-type
text/html;charset=UTF-8
content-length
481
cache-control
no-cache, must-revalidate
date
Mon, 16 Mar 2020 20:08:50 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%3AZjayvNEtZKL6YH6vAUHn1hB%2FTFGnK0nf;Path=/;Domain=agkn.com;Max-Age=31536000;SameSite=None;Secure u=C|0AEAmAplSJgKZUgAAAAAAAg1RAQCADVIBAIA;Path=/;Domain=agkn.com;Max-Age=31536000;SameSite=None;Secure
x-cache
Miss from cloudfront
via
1.1 f99b5b46e77cfe9c3413f99dc8a4088c.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA2-C2
x-amz-cf-id
GPSU2eRs388z6oY8Wr6XbqOBIbsK4kUYzpF2GH9C7zL67y97OQ0qCw==
data
ups.xplosion.de/
3 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=iPhone%2011%2C%20Pro%20und%20Max%3A%20Details%20zu%20Akku-Kapazit%C3%A4t%20und%20RAM&hostSiteUrl=https%3A%2F%2Fwww.pcgameshardware.de%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%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=406234227e2a1d846150e4fae9b08605&event_id=page_view&_sid=69511&_ver=0.2.25&_seg=jsonp&_=452904394588
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.25/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.171.36.151 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-54-171-36-151.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
00e55928cc2411c7cd9b0bf3995a8d03c14b72d554e2243ea9cd2a2123c03fb4

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

date
Mon, 16 Mar 2020 20:08:50 GMT
content-encoding
gzip
access-control-allow-origin
*
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
status
200
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
adrtxtag.min.js
cdn.adrtx.net/
840 B
849 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.pcgameshardware.de
URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.253.51.81 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-34-253-51-81.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.11 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
User-Agent
Mozilla/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-Dest
script

Response headers

Date
Sun, 15 Mar 2020 06:51:37 GMT
Content-Encoding
gzip
Last-Modified
Sun, 15 Mar 2020 06:51:22 GMT
Server
akka-http/10.1.11
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
activation
adstax-match.adrtx.net/ Frame EF8D
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.252.24.237 Dublin, Ireland, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-34-252-24-237.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.11 /
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-Dest
iframe
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site
cross-site
Sec-Fetch-Mode
navigate
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Accept-Encoding
gzip, deflate, br
Accept-Language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Dest
iframe
Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Mon, 16 Mar 2020 20:08:52 GMT
P3P
CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Server
akka-http/10.1.11
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43099:time[url:%2FiPhone-Serie-Smartphone-216880%2FNews%2F11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425%2F,type_article:shortread,article_layout:default,site_skin:desktop,device:desktop,custom_page_type:Article%20page,cdn_version:16]&s=cd2ea0ee84729421a1b2d2efabec8ba5&1584389335609
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/I99SivONLxYO
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
95.216.24.148 , Finland, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.148.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/
Origin
https://www.pcgameshardware.de
Sec-Fetch-Dest
empty
User-Agent
Mozilla/5.0 (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
Mon, 16 Mar 2020 20:08:55 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT

Failed requests

These URLs were requested, but there was no response received. You will also see them in the list above.

Domain
dmx.districtm.io
URL
https://dmx.districtm.io/b/v1

Verdicts & Comments Add Verdict or Comment

769 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 function| pushOnThe string| ioObject function| io object| objTrackingDataCurrentPage boolean| blnDefaultArticle string| listCollectionEntityIds number| iWordCount number| globalLandingpageID number| globalEntityID number| globalEntityTypeID number| globalTopGenreID boolean| brwLa boolean| blnOnlineAbo boolean| bIsLoggedin number| globalVideoIDList number| globalSiteID number| globalISiteID number| iCurrentPage number| iMaxPages object| $jscomp string| kvcxsegments object| cX object| swfobject function| $ function| jQuery object| adManager function| checkSearchForm function| setPreisvergleich function| SearchLeft function| setSearchBuffed function| setQL function| htmlEditFormat function| adjustFacebook function| endFacebookAdjust function| hideanddestroyPopup function| moveLogin function| searchFieldActiveBig boolean| bindState function| searchFieldActiveSmall function| searchFieldInactive function| searchFieldLate function| toggleLoginbox function| setLoginBoxPos function| makeHREF function| handlePlatformSmall function| handlePlatform function| handleGlobalWeight function| AddonTip function| initAddonTable function| getAddonTable function| setSearchVal function| changeMyViewport function| prepareSearchForm function| getSearchAction function| getIDX function| handleTypeahead function| killTypeahead function| setTypeahead function| goSearch function| handleRobotsIndex function| handleRobotsIndexOverview function| showIndexOverview function| showPlatformOverlay function| hidePlatformOverlay number| mainIndex number| subIndex string| sSubNavi string| sSubNaviItem string| sIdentID string| switchInterval string| switchInterval2 function| handleNavi function| handleNaviLate function| closeMegaMenu function| getSubmenu function| getContentLayer function| switchSubmenu function| doSwitchSubmenu function| switchSubmenu2 function| tapHandler function| editSubNavi function| unTagObjectFromForm function| submitTagForm function| initFirst function| initalizeTagging function| availableTags function| availableTagsCBOX function| initalizeTaggingCBOX function| handleScrollbarX function| toggleLoginboxClass function| initZoomCompare function| scrollto function| showSliderData function| checkNavi2016 object| loadedAds$1 function| lazyLoad function| handleResponse function| SetCharCounter function| check_recommessage function| callBackLoader function| openRegForm function| loadRegFormJS function| openPassForgot function| loadPassFormJS function| openUserSettings function| openChatSettings function| setAdminBarPosition function| setAdminBarPosition2 function| showIFrameWorkflow function| showWorkflowHistory function| showQPWindow function| showQuiz function| showBetakey function| switch_details function| check_nl function| uncheck_nl function| socialShareTracking function| getSocialShareCount function| set_cookie function| delete_cookie function| fetch_cookie function| getRect function| moveLoginToComment function| GetCookie function| getCookieVal function| isValidDate function| fxmbgclick function| fxmskyheight function| showFullHDSlider function| activateHideCount function| showInnerQuickpoll function| IVWImpression function| ivwImpression function| googleImpression function| ctImpression boolean| blnAdBlockerOff function| trackAdvImpression function| trackCampaigns function| trackWebsiteModules string| sAjaxURL object| COSEconfig function| cbox_edit_start function| cbox_editlayer_stop function| createBasicElements function| edit_defaultText object| previousPoint function| showTooltip function| extSort function| makeSurveyFlot function| unCheck function| labelFormatter function| sortSurveyQuestion function| initSurvey function| toggleSurvey function| resetSurvey function| checkDropdown string| searchText object| enquire function| placeAds function| initWeischer function| getMtrcsTag function| initialCTTrk function| withinviewport number| adgroupid function| voteQuickpoll function| voteQuickpollIPB function| checkIsTandem object| Handlebars function| Bloodhound number| iframeCreated object| isMobile boolean| blnMobile function| babelIsValidSelector boolean| a string| b function| c undefined| e undefined| f undefined| g boolean| blnNoFlashPlayer function| giveFeedback function| displayEmbCodeLink function| replayVideo function| loadVideoPlayer function| runVid function| updateCommentsCounter function| runFeaturedVideoTeaser function| runFeaturedVideoTeaser2 function| closeFeaturedVideoTeaser function| hideFeaturedVideoTeaser boolean| blnDebug number| iNumThumbsPerOverviewPage object| sRegExpCbbFontToHtml function| setOverviewLayer function| handleIndexBoxAndElemsWithAntiscroll2 function| scrollIndexBox2 function| collapseIndexBox function| switchPopularVideos function| indexBoxCollapseHandler function| CopyProductBoxIntoMainContent function| MoveLatedLoadedAds function| createArticleFeed function| createFeedItem function| slideTrippleGal function| clickSwitchMarkActiveLink function| switch_and_count function| clearAFField function| validEmail function| validCheckbox function| checkAFName function| checkStreet function| checkPLZ function| checkOrt function| checkLand function| checkPhone function| checkMobil function| checkText function| validBirthdate function| sendForm function| checkAllgemein function| actionFormInit function| zoomSwitchActive function| download function| showLoading function| handleTickerVisibility function| OutputModuleHeights function| toggleRatingBoxProsCons function| executeTrackings function| executeGaleryIOTracking function| initIOTracking function| IVWCount object| timerSchnaeppchenBox function| setLanguageSwitchCookie function| getLanguageSwitchCookie function| setUpdateMarker function| delUpdateMarker function| setUpdateMarkerCookie function| delUpdateMarkerCookie function| showSchnaeppchenArticle function| getURLParameters function| parseGalerieSubline function| isInViewport function| throttle function| loadStream function| setCookie function| getCookie function| deleteCookie object| objBMC object| oReloadedAdTags boolean| blnInitSkyFixedPos boolean| blnDebugDynAd object| oLoadingAdTags function| setSkyFixedPos function| isElementPartiallyInViewport function| reloadAdGPT string| FORUM_TYPE object| REMOTE_FILES function| makeToglable function| hideComment function| ajaxLoadNewPageHelper function| ajaxLoadNewPage function| deleteComment function| ajaxInsertComment function| checkForCapture function| sendCommentWrapper function| showFBSelectState function| blockCommentForm function| sendComment function| handleLikeButton function| loadComment object| imgLiquid string| sIvwCodeIvwGalleryB1 function| loadCarousel function| displayTeaserView function| animComplete function| carouselGetItemHTML function| carouselGetItemSubline function| setmyActiveCarouselarticle function| SuchenUndErsetzen function| Hashtable function| formatDate function| initAmazonGoldbox function| initUserProductRating function| setUserProductRating function| getUserProductRating function| highlightAvgStars function| saveUserProductRating boolean| blnBannerVariation1 function| initBeforeAfter function| setUserRatingForUserArticlesData function| adjustHashTagTargetAnchor function| scrollToAnchor function| displayClosedIndexItems function| trackAdvertorial function| makeVeeseoVideoWidgetTrackable function| loadCtVideoWidget function| appendCtWidgetToWrapper function| handleThumbnailsScrollbar function| animateCallback function| createThumbnailHtml function| createLightboxImagesArray function| showLightbox function| getThumbSetArrayByIndex function| displayOverviewPage function| initDataTable function| showRoyalSliderGallery function| swipeTeaser number| timerInterval boolean| reloadAds function| checkReloadAds function| reloadAdsWithInitConter function| initDiagramObj function| Hammer function| Waypoint object| jQuery19006548622291196937 object| objIvwGallerySubline function| adjustIvwGallerySubline object| objIvwGallerySublineHandler function| adjustIvwGallerySubline2 function| _anyNumberSort function| postscribe function| Color function| Chart boolean| canRunAds object| _taboola string| szmvars object| iom string| disableStr function| gaOptout string| GoogleAnalyticsObject function| ga function| JYWPYdd object| lceylb2dFlags string| lceylbf6Rnd object| lceyld477tc boolean| globalNoAds function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam function| checkAblc boolean| blnOk string| sIvwCodeCommentsModule string| sIvwCodeAndereDynFormate object| iam_data function| uniqid string| cttradd function| getHostName function| setTrUUCookie string| cttruu string| cname number| iCstart undefined| checkVis undefined| bArmCheck undefined| date object| php_js string| sTrafSrc object| oCTTrk object| arrKeyValueStrings object| config boolean| tt_Debug boolean| tt_Enabled boolean| TagsToTip function| Tip function| TagToTip function| UnTip object| tt_aElt object| tt_aV undefined| tt_sContent undefined| tt_t2t undefined| tt_t2tDad undefined| tt_musX undefined| tt_musY undefined| tt_over number| tt_x number| tt_y undefined| tt_w number| tt_h function| tt_Extension function| tt_SetTipPos function| tt_HideInit function| tt_Hide function| tt_GetElt function| tt_GetDivW function| tt_GetDivH function| tt_GetScrollX function| tt_GetScrollY function| tt_GetClientW function| tt_GetClientH function| tt_GetEvtX function| tt_GetEvtY function| tt_AddEvtFnc function| tt_RemEvtFnc function| tt_GetDad function| tt_MovDomNode object| tt_aExt object| tt_db boolean| tt_op boolean| tt_ie undefined| tt_ie56 boolean| tt_bBoxOld object| tt_body undefined| tt_ovr_ number| tt_flagOpa undefined| tt_maxPosX undefined| tt_maxPosY number| tt_iState undefined| tt_opa undefined| tt_bJmpVert undefined| tt_bJmpHorz undefined| tt_elDeHref object| tt_tShow object| tt_tHide object| tt_tDurt object| tt_tFade object| tt_tWaitMov boolean| tt_bWait string| tt_u function| tt_Init function| tt_MkCmdEnum function| tt_Browser function| tt_MkMainDiv function| tt_MkMainDivHtm function| tt_MkMainDivDom function| tt_GetMainDivRefs function| tt_ResetMainDiv function| tt_IsW3cBox function| tt_OpaSupport function| tt_SetOnloadFnc function| tt_HideSrcTags function| tt_HideSrcTagsRecurs function| tt_HideSrcTag function| tt_Tip function| tt_ReadCmds function| tt_AdaptConfig1 function| tt_AdaptConfig2 function| tt_MkTipContent function| tt_MkTipSubDivs function| tt_GetSubDivRefs function| tt_FormatTip function| tt_FixSize function| tt_DeAlt function| tt_OpDeHref function| tt_OpReHref function| tt_El2Tip function| tt_UnEl2Tip function| tt_OverInit function| tt_ShowInit function| tt_Show function| tt_ShowIfrm function| tt_Move function| tt_Pos function| tt_PosDef function| tt_PosAlt function| tt_CalcPosDef function| tt_CalcPosAlt function| tt_PosFix function| tt_Fade function| tt_SetTipOpa function| tt_OnCloseBtnOver function| tt_OnLClick function| tt_Int function| tt_GetWndCliSiz function| tt_SetOpa function| tt_Err function| tt_ExtCmdEnum function| tt_ExtCallFncs object| ctrwnd function| Ctrwnd_DoCenter object| fscrl function| tipDiv number| ABOVE number| BGCOLOR number| BGIMG number| BORDERCOLOR number| BORDERSTYLE number| BORDERWIDTH number| CENTERMOUSE number| CLICKCLOSE number| CLICKSTICKY number| CLOSEBTN number| CLOSEBTNCOLORS number| CLOSEBTNTEXT number| COPYCONTENT number| DELAY number| DURATION number| EXCLUSIVE number| FADEIN number| FADEOUT number| FADEINTERVAL number| FIX number| FOLLOWMOUSE number| FONTCOLOR number| FONTFACE number| FONTSIZE number| FONTWEIGHT number| HEIGHT number| JUMPHORZ number| JUMPVERT number| LEFT number| OFFSETX number| OFFSETY number| OPACITY number| PADDING number| SHADOW number| SHADOWCOLOR number| SHADOWWIDTH number| STICKY number| TEXTALIGN number| TITLE number| TITLEALIGN number| TITLEBGCOLOR number| TITLEFONTCOLOR number| TITLEFONTFACE number| TITLEFONTSIZE number| TITLEPADDING number| WIDTH number| CENTERWINDOW number| CENTERALWAYS number| FOLLOWSCROLL object| __io boolean| hasTouch object| availableLang string| articleLang object| google_tag_data object| gaplugins object| gaGlobal object| gaData boolean| blnHtml5Video function| cx_callQueueExecute function| cx_pollActivity function| cx_pollActiveTime function| cx_pollFragmentMessage number| iNumImages string| newClass object| TRC object| _tblConsole string| pm_pgtp undefined| msg object| _comscore undefined| cXJsonpCBk7uwho5fvgkrv3bh string| listAvailableTopVideoIds object| jsonAvailableTopVideos object| jsonSoldVideos number| iNumComments object| oCmntBox number| loadLimt number| time function| taboolaHandler number| iSiteId number| iArticleId number| iArticleTypeId number| iEntityId number| iEntityTypeId object| ggeac object| closure_memoize_cache_ object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken object| YLHH object| yieldlove_site_settings object| yieldlove_cmd object| __core-js_shared__ object| core function| pbjsYLHHChunk function| initNaviStack function| moveMainNavItems function| handleMenuItems function| startStackNavi string| strAdZone string| lstPrimaryAds string| lstRemoveHPA string| lstLazyLoad string| lstStickyAds boolean| bDebug object| Criteo object| stroeerCore boolean| globTagFormTouched object| fSearchSuggest object| fProductSuggest function| fProductTemplate function| fFooterTemplate function| fSearchSuggestTemplate function| initTypeAhead object| options function| benchmarkGlobalEventsBinder function| resetProductsToInitState object| _io_config boolean| lceyl4dcsdl boolean| lceyl4dcsdln string| lceyld477genat string| lceyld477sthash boolean| lceylfcfforceimp function| checkOmid3pExist object| de_meetrics undefined| list function| __trcCopyProps function| __trcFromError function| __trcClientTimestamp function| __trcLog function| __trcError function| __trcDebug function| __trcInfo function| __trcWarn function| __trcDOMWalker function| __trcJSONify function| __trcUnJSONify function| __trcTrim function| __trcGetElementsByClass function| __trcToArray function| __trcObjectCreate function| PageManager function| addHashParam function| _calculateEventsLength function| _countDOMNodes function| _countNetworkCalls function| _calculateFPS function| _trackVideoLoadLength function| _trackTimeToFirstUnitElement function| _trackTimeToDisplayImpression function| _trackTimeToPlayerCreation function| _hookToSrcProperty function| _trackTimeToFirstWaterfall number| trc_debug_level string| trc_article_id object| TRCImpl boolean| lceyl040Body boolean| lceyl75aDetect object| lceyl152Mobile object| lceyld4771 object| lceyld477o1 object| lceyld477o2 object| lceyld477o3 object| lceyld4772 number| lceyld477d3 number| uabInject object| lceyld4774 object| lceyld4775 boolean| lceyl97eij object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| OMSVad object| _m6rq function| udm_ object| ns_p object| COMSCORE string| _io_uniques_holing_params number| google_srt undefined| google_measure_js_timing number| __google_ad_urls_id number| google_unique_id boolean| apstagLOADED object| apstag object| confiant boolean| _tb_dis string| pm_ppy string| _pmep string| _pmep_geo string| _pmpmk boolean| _pmasync boolean| _pmoptimization boolean| _pmoptimizationmanipulation boolean| _pmhp boolean| _pmsb object| pmk object| pmglb object| pmfa object| pmad object| pmdebug_c object| _pmenv object| _pma undefined| _tb_d undefined| _tb_rand object| _pm_ecd string| _tb_vpx boolean| _tb_vautop function| _pmloadfile function| pmws_request_done function| _tb_getUrlParameter function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter function| TBClickToPlayVideo function| TBClickToPlayVideoElem function| TBVideoElem function| TBVideoEvents function| TBOptimizationAutoPlayInfoFromXPathAndURL object| _pmk function| TBWidgetVideoPlayer function| TBGenericVideoModule function| TBOtherPlayer function| TBVideoMetaData function| TBVideo function| TBVideoDetectionYoutubeAPI function| TBOptimizationTouchAndClickEventTracker function| TBWidgetStorage object| PMFileLoader object| PMPage object| PMTemplate function| PMTracking function| PMUniversalGA function| PMMdotLabs function| PMComScore function| PMPublisher function| TBOptimization function| PMGlobal function| pmws_getlocation_done object| pmdebug object| pmws object| pi object| _pm_mcg boolean| _tb_vd_pg object| __google_ad_urls object| ampInaboxIframes object| ampInaboxPendingMessages boolean| google_osd_loaded boolean| google_onload_fired function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb function| isSticky number| end boolean| lceylaceTrack string| sdm_ift function| changStickyBlock function| calculateDeminstions object| criteo_pubtag number| halfVal number| _m6rApiLoaded object| _m6rOnce number| _m6rContainerLoaded object| google_reactive_ads_global_state object| google_jobrunner object| google_ad_modifications number| google_global_correlator object| google_prev_clients object| teadsscript object| teads object| tbopt object| GoogleGcLKhOms function| setUpAgknTag object| Adform object| google_image_requests string| apsrc function| _h object| _adexc object| adex object| _EQLService object| _EQPScript function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet object| _EQPService object| _adrtx string| segments object| segmentsArr undefined| result string| _emqstr object| audienceProjectLayer

3 Cookies

Domain/Path Name / Value
.pubmatic.com/ Name: PugT
Value: 1584389329
.pubmatic.com/ Name: PUBMDCID
Value: 3
.pubmatic.com/ Name: KRTBCOOKIE_279
Value: 22890-f33b7325-67c1-11ea-bc1c-377b8582f2b2

11 Console Messages

Source Level URL
Text
console-api log URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/(Line 49)
Message:
io_blnDynamicLoad = false
console-api log URL: https://www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/cfremote-min.js?12362(Line 14)
Message:
cx-segments cookie not available
console-api warning URL: https://www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/general-min.js?12362(Line 141)
Message:
undefined ad was reloaded!
console-api log URL: https://www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/general-min.js?12362(Line 211)
Message:
chckBlck:false
console-api log URL: https://www.pcgameshardware.de/bcommon/js/b2_pcgameshardware/cfremote-min.js?12362(Line 15)
Message:
cx-segments from cx-request:
console-api log URL: https://player.pcgameshardware.de/dist/video.full.min.js?v=d2d8535c8ac6d2e13637065718340766(Line 1)
Message:
VIDEOJS: Play middleware has been registered with videojs
console-api warning URL: https://player.pcgameshardware.de/dist/video.full.min.js?v=d2d8535c8ac6d2e13637065718340766(Line 1)
Message:
VIDEOJS: WARN: videojs.plugin() is deprecated; use videojs.registerPlugin() instead
console-api warning URL: https://player.pcgameshardware.de/dist/video.full.min.js?v=d2d8535c8ac6d2e13637065718340766(Line 1)
Message:
VIDEOJS: WARN: videojs.plugin() is deprecated; use videojs.registerPlugin() instead
console-api warning URL: https://player.pcgameshardware.de/dist/video.full.min.js?v=d2d8535c8ac6d2e13637065718340766(Line 1)
Message:
VIDEOJS: WARN: videojs.plugin() is deprecated; use videojs.registerPlugin() instead
console-api log URL: https://www.pcgameshardware.de/iPhone-Serie-Smartphone-216880/News/11-Pro-und-Max-Details-Akku-Kapazitaet-RAM-1332425/(Line 778)
Message:
Tracking CMS-Teaser 208
console-api log (Line 122)
Message:
inline_ad: No video available; loading inline-ad by Teads

Security Headers

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

Header Value
Strict-Transport-Security max-age=15552000; preload

Indicators

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

a.teads.tv
acdn.adnxs.com
ad.yieldlab.net
ad4m.at
ad4mat.net
ads.pubmatic.com
adservice.google.be
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
api.cxense.com
api.yieldlove-ad-serving.net
arabshops.xyz
as-sec.casalemedia.com
bbcdn-bbnaut.ibillboard.com
bidder.criteo.com
c.amazon-adsystem.com
cdn-a.yieldlove.com
cdn.adrtx.net
cdn.districtm.io
cdn.emetriq.de
cdn.m6r.eu
cdn.onthe.io
cdn.stroeerdigitalgroup.de
cdn.stroeerdigitalmedia.de
cdn.taboola.com
cm.g.doubleclick.net
confiant-integrations.global.ssl.fastly.net
d.agkn.com
de-gmtdmp.mookie1.com
de.ioam.de
dmp.theadex.com
dmx.districtm.io
eu-u.openx.net
eus.rubiconproject.com
extreme.pcgameshardware.de
fastlane.rubiconproject.com
gaa.adscale.de
googleads.g.doubleclick.net
hbopenbid.pubmatic.com
hgc-cf-cache-1.svonm.com
ib.adnxs.com
icdn.computec.de
ih.adscale.de
imasdk.googleapis.com
irqs.ioam.de
js.adscale.de
js.agkn.com
lb35.s400.meetrics.net
media.oadts.com
nugmw.userreport.com
pagead2.googlesyndication.com
player.pcgameshardware.de
prg.smartadserver.com
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
s3.amazonaws.com
s385.mxcdn.net
s400.mxcdn.net
sak.userreport.com
sb.scorecardresearch.com
scdn.cxense.com
scomcluster.cxense.com
script.ioam.de
securepubads.g.doubleclick.net
si.nuggad.net
ssl.1.damoh.pcgameshardware.de
ssl.2.damoh.pcgameshardware.de
static.criteo.net
stats.computecmedia.de
stats.g.doubleclick.net
sync.teads.tv
t.teads.tv
tpc.googlesyndication.com
track.adform.net
tracking.m6r.eu
tt.onthe.io
ups.xplosion.de
vg01.met.vgwort.de
video-adserver.ibillboard.com
widget.perfectmarket.com
www.google-analytics.com
www.googletagservices.com
www.pcgameshardware.de
yieldlove-d.openx.net
dmx.districtm.io
104.16.68.69
116.203.211.59
13.224.194.65
13.224.194.82
136.243.5.14
143.204.201.153
143.204.202.12
144.76.12.56
146.148.127.183
147.75.85.120
151.101.113.181
151.101.13.108
151.101.13.194
151.101.14.2
161.156.66.178
178.250.0.165
178.63.12.208
18.185.150.7
18.185.214.82
18.194.21.214
185.22.221.117
185.33.223.80
185.64.189.112
185.86.139.58
193.46.63.75
194.213.222.30
216.58.206.2
23.11.238.95
23.210.248.12
23.37.53.21
23.37.55.184
23.60.16.116
23.61.243.29
2600:9000:214f:3000:1f:a1b:34c0:93a1
2600:9000:214f:c200:15:efbc:e300:93a1
2600:9000:21f3:7c00:19:fc2c:a140:93a1
2600:9000:21f3:ec00:12:6213:9cc0:93a1
2600:9000:2204:d200:1c:8c89:a300:93a1
2606:4700:10::6814:d2f
2606:4700:3034::681b:87e7
2a00:1450:4001:80b::200a
2a00:1450:4001:814::2002
2a00:1450:4001:814::200e
2a00:1450:4001:818::2002
2a00:1450:4001:81c::2001
2a00:1450:4001:81e::2002
2a00:1450:400c:c0c::9d
2a02:2638::3
2a02:26f0:10:28e::5f76
2a02:26f0:6c00:180::268b
34.252.24.237
34.253.51.81
34.95.120.147
35.186.238.175
35.190.94.1
37.157.6.246
52.216.178.5
52.28.163.206
54.171.36.151
62.146.104.136
62.168.44.125
69.173.144.140
72.247.225.182
88.198.59.89
89.163.159.108
91.215.103.64
91.215.103.65
92.122.252.114
92.122.254.129
92.122.254.186
95.100.64.146
95.216.24.148
00e55928cc2411c7cd9b0bf3995a8d03c14b72d554e2243ea9cd2a2123c03fb4
0145284af291e8a8f9c04efb1b9b8d0bbdb422dd325a6fd6563faf5e33665e02
03ca4c0ca6ea501c4138d0e85e7d32b1d8878462b24317a1a020b040009fc81b
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844
0894860c3c10ee1e859b6b4a7c27da607e9fae0a2efb7e98dd511efe77a27102
09381e339f76cfa3c58589485e77387d5f049ae28890da3d65af3c671fd6ee81
097ebd02792cbac7d27830cd9af71b8257add220e67c7281d705dcd30b8e71d3
0c09c070833c786cb25be38bc30992b30bad578f817dbc9e34beacd8b8ea44c5
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499
0f10363f958690706082b7ab77d381af142c1ce290cf3a896960ff86487bc6c6
113b50da257d5606e80b319cf32c84f2aa9aa10deeb8e2e4d9eae38669712af3
11f657ce5b3863f922a6aeb2e3b941ef6e62e0ed7520a2c4219845dc6e9d7ce6
11f68cee4a89f44fc4b20df5e06b98e37f37e5a4ebbfa43efe03599dbca67082
1261681dc554639577db178c8786ae40a6c72732d892308c7eabbe798872a0fc
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8
180d0b4abb228f7a8a1c979259041539d5af9db809a6fc02338feb2ceee96634
2003b66dc1b88a44328998588c72828a68e3161fef2bd811277b0f1978227224
2183bad6dcd8943484d95863256716aaabc71e3da28f52be9d07f4b9c4f0fc62
23cfba2cd4d82f5a2ee8ebb52ad2d86ffa5b992b3156e67c65286aff7b26e3c1
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
2733fb957d8514f74ed5c70171329edfb5243b062b668ffef13d52dbc68e45de
27c48230a4bfe9e520f92aa4d1dcf961431280c5d30a6ef7dab31af50aa0859d
2b582dd879de6ce77ba9b99253545aeed20bb14a913ec571a94c28cc656fc88d
2bce7831bf8bbc8f8768b7f73e529f4957146e9ab42d442070aa5333df1d2f8f
2c27360a7e59d60c8758374b4fb3eb1d348ae8258957d85cb19eee45641523e5
2eedf4d523d65318a57e8119d8be12c2640fec354e2961d28f42de154023cc41
2ef5c60729ea36c1673f47c1234ea6b9209211d729f1b3dc551c90fd4252d34b
2facbbc2ee5282ff79b27064db583dba5ab6fc3d98d0c04544b618be3ca364fe
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7
32a3c6c7d7c5fbbeb9871f6b57cae30c72a287a07eea30d102797dbb72542446
336e47855a2634b17ab1e87428f96b51e21a434dca8c8327b47dc0fd2e0d3b51
34d4e6eadae686e27a2d4ef5f1b4e9a43a3682ae26f2cdd5622716541cfdf697
364f899b805c5a35f212e72e9f974a5d2d6c92a5afd25e64110eabf9f7dba6a7
38cdd1d888b19fb9f901184bb9ae0976f81bbfb846eebb76e824d26a56508504
39a86f48eccafc70cd5f72113fa46299fcf2d56af9faeb456ab2809576dbf830
3d5505cfa69191d6fe9bbdb496302c779ac495706f27d85e580b8ccca2ad9662
3f278cac0893870edce9c0f4895150615ff63209b21e2e557721e6b6dcacd677
40745144ae5b38c14311b9bbf54e81dcea13a65c431579155f70ef4f41bcff13
4220d6aee16a6d6ec76f75fb0396a7684e6282cb0a0325a6b5a41c034fc87121
432e8930dae35dd8549c0ffa3a92a0caa1c47785194bcc45b5f65c2249b7e20c
43af7f7c9db712933120add636bbfa56a8ce4fe9c069b3a598d85b93136ca474
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
448d79555f251e9bb3bcee9b24e9aa35e5f690832cebd97447fc9044e66d667b
48f9c4165e95dfbd77f9e00f3560714e57fb55d6e13b2b3eb963b12a62480653
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
4f275e3771732bbad37fec49cc3b910b50d4e2eb019a5b25e6e9e0d45783704a
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945
502d097eaad24c84c53d916f8ae0a6d28c9ff448294b60d2bc00a2b26546f1b3
5318e6f99439de8be22212f030c069a25e38feb81952f4fed93121eed1aef3b4
53c130ed85131f65ae707463cf9972773a921830efaf6225608b107e198ed6d7
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
56b412f0c66920c48c0fc59a2cec3173ccd18b4d1b06747355454dba0ffdae46
5768e8c817b17a47f348cae0181f7fe4cf43f55f58acfb6df553c69c99cd6264
581045be2723e906e1e3f19426a11fa869704b8bc6470b5d690d1ba183dc7418
58b29ffd944cf81b5c16f7fbbfa6931292eae2152038644a80218e5af68fc566
5a81cd792636b7944f81da6c0eabc7a2c4d16895730b6f56c5de4d231affcad6
5c4bf2650f33f2d1060d95e525425062889336b4d672bdf2bed2b7ba68f70fcc
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
5ec634d70d5b1e33f924c225ea2a7ab4c9451b1ca4665d7c84e79b4613f6e4c1
5eedb50a3ac1e86b8c5c6f9be4e34de08759be124bf8d4237452ad16ab1c299c
606dd07fdfe7b4f1440a8be46195687a04a21435a9691a7ba496759139f4ce78
639feb879746e27c7d840e578e49c0da546a3ad6c16851b8d1bfe085d8f50a37
66bdd962ad3c4a394964e44600d43808fc3377e3323e00c86213c2564aae5651
66c1574ab1ccc629d6a086611d3676570ac92c044f97433ced8c1937d1f60b92
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
69867d996e05e1aa4c941e9ffa394ac9ccc7faf50c92761942ed4f9b7bd9dab1
69eaf34725f538776cc9e6c582db28b64bff8f43dd1538650151257a6c977b69
6b4d0c29444c24800b5b71791e9648490288e23163cb48b64b03ec6c6fd5ab24
6cc7730ff989be099113fa39ff83dd0aef977ea4abca49c306a3be9cda1c0cde
6df02b01a6794a5335aa3088b15e073a5f55fe7c6d583a8a0eb56839fc035050
6f4c43ca3e0b1fd9376c0f9178cf9489517f12618a3f8df29d352a32b3105324
7202db234777e26c6bf39dd6b4aaadefc016020c30c7668db098ca4c7a370fdb
75bb1e4d98779af420192e8416abdcae904b84dbdeb1280f44c9e067575f2d1a
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
7a94735f3a0e915a85bd8e216702c3146e1ffd2f6395276c8e5baee1249baaf1
7b11b952f13dbd2e8c6e8af03b4f5b45beb54a3a4f42d3c2030c9e8fd17b0328
7c349d15a749e092fcffd6bcc4943d5fdebdf5dae48818fb3c5fdc171363c58c
7dde4e862b9ec4153c85160c5e809d37d8da5e5c4141a2e438b3b28aa00e66f2
7e5ab895bb5694aa8324f1553297cf4d4e079acd65ec72c38cccf9f19c45a64e
7f1182ed0bcc2206a25585a3d1b49a695b65b5aeb80027d9ebba970c40f9740c
81c3f88a8b295295195a4eb5286402a7e7e294a6524854d762f9610cb75e4360
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
836fd3e4ba533c754e5b0ff9864a98a790d2e045862ed7a1d5e97001356aa0e8
843170e06a22bc019928db6559cffe4b5820dc57c43ef9b9e1458fa754dbbc8b
89a39fe87404de18d2607d59ba5cded97619e30186571849f6cad08357ed7753
8badcd604652360c68c0677ba0772d2973f2cfe293b5679fec3d1d63018d396e
8ee04e0441c9e51785d17ac835a93cf4d30d90826f87350b42ba233496a26f55
90544f91855b26f04d78e50d32a7093766645479ff524fd28231aa6cee610aa7
909009056877bdbc198a45c7adec7d4b0615aa97d0a4d61ac493472dd0b4a97f
95089852f486979770ba35460afa6ef9392b6fc143a31c804fb703075d465661
96336d97988b013c2558b7026cdeccc739ead83822d59f1c1d2acf038e5b6e2f
9b165d67b7e20528115805f0ebfd9f07fe06cfd37402ef2d3d0f8b05d4bca3ec
9d36ae6f3144477bff24bf3ab8dc4ccc249a75f61cbffe0bb963dca9a8574ae7
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a256529bd5b1b8846f8d2536ce7581fb6cea4479992f222d01535903dff48d79
a3050846a05163a504898c44991f9e3a84b37c79d69024cb05974b3f56d2bf06
a47f17d6ebbf4621d8fe87ab790d8d8fb5c3086629194d9ff2d64faaa6e46ab6
a702593ee43003e6aad230188b8724f37cce08eecc412e71d6dff596fbe16462
aaba6871f3726b9b780ae513b7d5fd323267dddf5ae0262f01b9376523f2b9cc
ab932140887619c7a62746e754bdf982840ed9adfcf54e72ef5f91224894071f
abd9155ac0fe0e62fdb9e2c1c333357cd33107972a57eff5224b0f3d0d2df316
ac2a58f9d55c4642121cfb6f7e213cbc882bbdd75ef171ca8a07ed982ef693ce
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae0ac548b351118d3035acaa48ed2397e244bc56d317b3bd3e9315bbfca70ab2
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
aeb56ce2d669c7b17da5da917da0f52586eee444da9fd8601ecd4781819ac5f8
af9926df4e72f4a6aa7973a30656ec660fdf15a6f3b1004c62a7122f66757607
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926
b2d230535a19145ec91163e3b639055373f97dfdecb0deb906df36640ef8cab9
b568c9877ce52d0ae234a0e6c9dbdb4cf3d415c16b2ab387b0cbaeca91b5c0a3
b6fc53b0ab2238d5a9e51f8e1e9806dd831308c1e712a7436aa2d96b372cd2bc
ba851b8684e487da91cfe727f0a9ed919db4e8958ee66e9d50723ed89a9fa560
bada96c6ab215d21af3ce49ecc88b6f84650a3b768f8f6e6be93a759fbbe8b84
bb14b95ff85acf21cbb8809d435950bb8580deb6f3a8f0b83360adcbc7866e17
bd78ffb515d3ae83fe62aab4955639a42447ead2e3efbb765fc2724e57ce59ed
bf1616bb71ecd23e8b4165960645fc704c08e37f097ad8f85b7a086d1dcf27de
c09bad8a8a725aa2c53c0cff2002b9a67e71698f30a377a0a2dfc8d1d54ef06b
c163ef1dca570a8e257a43d5bf848bee6876ec870822246f2f3f65fb62b3496b
c4f36585bc4292f006b8f5445f7f002e3205e5e33f6e92d166131f58366f9b2d
c66d3c57676253019cfd4315afeead909efc06b27b54a85a6debce549fb1f53e
c678042969d9f9d2bcbe0632519ccb358d097471ee3f9c85f142b8d6b685a2ae
c7efacbd816654df8df87cc1a5e97ad7a6b8750a2fe125c9fad492ea5c91109b
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb
c97815ad3bf836134238414d63b74f94b80dcf4c82f0f3b33c80bf82e0cb566b
cad7f640b619c4106c582a266103856ff6d2cccbcbccbe6b47cdc034d3967309
cd35bc55a5ecd62262573cf9ccc375655037af31050180f4bf0cebbf029cb24b
ce10c90083eaa6eb101084f0955b0a03410b15094d0c2fbaa0c476d0ec98e9c5
ce34186278780a02d3f47df85eda9599e99e8c8ba37a27df3b83b4f259a655ec
ce9a15b7e9192ae68522debd6b860b5278fbca7c6528ad9be09e1cbaa4724597
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
cfc35813922283b122afa06e56a0ad6219e1f000513b3d65fee1d43977dd2bad
d121b006fa8860b89d47fd1e8480b3462367cb179c6fc027b395fd1d175232d5
d170e295eea0907915ceb097e46c1e18d8ddb5e495bf7b0a4288c664c0bef6dd
d39185735f23604dc068be3e0672d570685eac008d5daa49f686028f5a1228dc
d3cf2709e10ef178a4a4a0ae0ff2c7ce6179ce99c28e6b2ed5a8f696cdac44c7
d598544c0552db299731c3a25bb84fb1226b7594dfd17d2de0a1578593f699c3
d69499e802bf2565858402f476ed890de02c5962671315fbd010cf5dad70a0ff
d6dfe2c80ead3b3641bc066ec75ef7b27527d5ab44b0603e4c669ec62696fa04
d9da9ed2eb7155b34e207489b97d7b3c8a3a99f564178ee8f2af3e84d4be7643
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e4bb456d09aad2e36bafd434bded4edac5aa7a15ff9101c31d67855a3fb53eed
e7eae6fcdd3e32fc17a22ed0e05481003e797b671a414c0953031ed84e7104a2
eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
eb488650c338b2fbea85567a2b52a3ec17d643b25a030f48d3913814aaa7c1aa
ec154b3d01478b3b071142b233395a62a179fbb3fe8e0678bda50dc41fbafe8f
ef0eeb62ddcb7860f2d4b731062f35a70fe508a039c06af5ebd3c5ed4479fa5b
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f11bf8423c0aaca5b0762276eecc75f2cae5987c4008145ddcce92c9bde03982
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f34922bc830fe07b84412052407d933809cf522f9ba778b2511fe7575a0e3486
f41460caba986527812bbc0aca59a5991e94c63ad31c613f8a60658bbd0ce727
f42c1660abb2f7cab90dbb53e00646b993e52af97b452f929d2828735e3fd55b
f54aa2c65627448abac09eb4845cc746f9a21a83a69d930b28b750df2dca73b6
f86e7d6581062850dac1f0eb3ad6555555590dc0f22fed734fa49758c6e127eb
fa8374431ef56512ba068fed04a9ec2d944a74d5903519d98ff31993ea5e9ef5
fd512671e0ccc61ac39750171265320df3afcb783b233ac90ed40061e73bd848
fda97ec20907646eef81309463a8f352dd07cb189eabb717c66fc1757c8c6f3f
ff84301b99c39ed925a311967a1e6c05ff50b711cddd68c8fbb5c8eb4d3bbd0c
ffdc18ac8f47bcd50dd9c33532c334e7073717a62b367d95b9cb1561048547dc