URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Submission Tags: phishing malicious Search All
Submission: On September 02 via api from US

Summary

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

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
13 178.19.72.10 29551 (HGCOMP-ASN)
1 151.101.14.217 54113 (FASTLY)
1 91.215.100.39 43407 (INFONLINE-AS)
1 46.253.113.178 29551 (HGCOMP-ASN)
9 178.19.70.100 29551 (HGCOMP-ASN)
2 2a00:1450:400... 15169 (GOOGLE)
1 188.40.16.106 24940 (HETZNER-AS)
1 2 161.156.66.178 36351 (SOFTLAYER)
1 2 2a03:2880:f12... 32934 (FACEBOOK)
1 2a03:2880:f0f... 32934 (FACEBOOK)
1 2600:9000:205... 16509 (AMAZON-02)
13 2a00:1450:400... 15169 (GOOGLE)
3 99.86.1.198 16509 (AMAZON-02)
4 107.178.241.34 15169 (GOOGLE)
1 193.46.63.75 43407 (INFONLINE-AS)
2 3 91.215.103.65 43407 (INFONLINE-AS)
6 109.71.25.30 29551 (HGCOMP-ASN)
2 2a00:1450:400... 15169 (GOOGLE)
5 2a00:1450:400... 15169 (GOOGLE)
1 178.19.72.20 29551 (HGCOMP-ASN)
2 4 104.109.82.87 20940 (AKAMAI-ASN1)
1 2.18.233.67 16625 (AKAMAI-AS)
1 2 80.82.201.88 48173 (UNBELIEVA...)
1 2600:9000:205... 16509 (AMAZON-02)
6 72.251.249.13 29791 (VOXEL-DOT...)
2 2606:4700:20:... 13335 (CLOUDFLAR...)
1 2a00:1450:400... 15169 (GOOGLE)
1 2 52.94.216.48 16509 (AMAZON-02)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2001:4de0:ac1... 20446 (HIGHWINDS3)
1 2 184.30.220.71 20940 (AKAMAI-ASN1)
2 52.219.72.187 16509 (AMAZON-02)
3 13.35.253.56 16509 (AMAZON-02)
4 2.18.234.72 16625 (AKAMAI-AS)
1 216.52.2.19 29791 (VOXEL-DOT...)
1 52.31.106.135 16509 (AMAZON-02)
1 18.196.83.183 16509 (AMAZON-02)
1 2600:9000:205... 16509 (AMAZON-02)
123 40
Apex Domain
Subdomains
Transfer
27 giga.de
www.giga.de
static.giga.de
crops.giga.de
videos.giga.de
ssl.2.damoh.giga.de Failed
505 KB
13 google-analytics.com
www.google-analytics.com
45 KB
7 lijit.com
ap.lijit.com
gslbeacon.lijit.com
vap2ams1.lijit.com Failed
ce.lijit.com Failed
31 KB
6 adscale.de
native.adscale.de
js.adscale.de
ih.adscale.de
7 KB
6 nativendo.de
d.nativendo.de
c.nativendo.de
t.nativendo.de
21 KB
5 amazon-adsystem.com
c.amazon-adsystem.com
aax-eu.amazon-adsystem.com
25 KB
5 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
14 KB
4 m6r.eu
tracking.m6r.eu
1 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
61 KB
3 doubleclick.net
googleads.g.doubleclick.net
securepubads.g.doubleclick.net Failed
3 s-onetag.com
get.s-onetag.com
beacon.s-onetag.com
onetag-geo.s-onetag.com
23 KB
2 amazonaws.com
s3.eu-central-1.amazonaws.com
1 KB
2 googleapis.com
imasdk.googleapis.com
ajax.googleapis.com
116 KB
2 nuggad.net
si.nuggad.net
adscale.nuggad.net
926 B
2 googletagservices.com
www.googletagservices.com
40 KB
2 google.com
adservice.google.com
apis.google.com
18 KB
2 facebook.com
www.facebook.com
625 B
2 vgwort.de
ssl-econa.met.vgwort.de
733 B
2 googlesyndication.com
pagead2.googlesyndication.com
116 KB
2 stroeermediabrands.de
js.stroeermediabrands.de
gocp.stroeermediabrands.de
72 KB
1 sharethis.com
pd.sharethis.com
137 B
1 ml314.com
ml314.com
12 KB
1 giga-video.de
files.giga-video.de
30 KB
1 bootstrapcdn.com
maxcdn.bootstrapcdn.com
10 KB
1 mxcdn.net
s400.mxcdn.net
48 KB
1 giga-abs.de
go.giga-abs.de
1 KB
1 google.de
adservice.google.de
476 B
1 atdmt.com
cx.atdmt.com
408 B
1 speedcurve.com
cdn.speedcurve.com
7 KB
0 meetrics.net Failed
lb70.s400.meetrics.net Failed
0 weborama.com Failed
dx.bigsea.weborama.com Failed
0 adsymptotic.com Failed
p.adsymptotic.com Failed
0 company-target.com Failed
segments.company-target.com Failed
0 crwdcntrl.net Failed
bcp.crwdcntrl.net Failed
0 eyeota.net Failed
ps.eyeota.net Failed
0 tynt.com Failed
cdn.tynt.com Failed
0 taboola.com Failed
cdn.taboola.com Failed
0 dkuim.de Failed
dkuim.de Failed
0 dunkirkinception.com Failed
www.dunkirkinception.com Failed
0 yieldlove.com Failed
cdn-a.yieldlove.com Failed
123 40
Domain Requested by
13 www.google-analytics.com www.giga.de
www.google-analytics.com
13 www.giga.de www.giga.de
7 static.giga.de www.giga.de
6 ap.lijit.com get.s-onetag.com
ap.lijit.com
www.giga.de
6 videos.giga.de www.giga.de
videos.giga.de
text
4 tracking.m6r.eu 2 redirects www.giga.de
3 ih.adscale.de js.adscale.de
www.giga.de
3 hgc-cf-cache-1.svonm.com videos.giga.de
text
3 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 de.ioam.de 2 redirects www.giga.de
3 c.amazon-adsystem.com www.giga.de
c.amazon-adsystem.com
2 t.nativendo.de c.nativendo.de
2 s3.eu-central-1.amazonaws.com videos.giga.de
text
2 native.adscale.de 1 redirects www.giga.de
2 aax-eu.amazon-adsystem.com 1 redirects c.amazon-adsystem.com
2 c.nativendo.de d.nativendo.de
c.nativendo.de
2 www.googletagservices.com js.stroeermediabrands.de
pagead2.googlesyndication.com
2 d.nativendo.de www.giga.de
c.nativendo.de
2 www.facebook.com 1 redirects www.giga.de
2 ssl-econa.met.vgwort.de 1 redirects www.giga.de
2 pagead2.googlesyndication.com www.giga.de
pagead2.googlesyndication.com
1 onetag-geo.s-onetag.com beacon.s-onetag.com
1 pd.sharethis.com www.giga.de
1 ml314.com www.giga.de
ml314.com
1 gslbeacon.lijit.com ap.lijit.com
1 adscale.nuggad.net 1 redirects
1 js.adscale.de c.nativendo.de
1 files.giga-video.de www.giga.de
1 maxcdn.bootstrapcdn.com www.giga.de
1 ajax.googleapis.com www.giga.de
1 apis.google.com www.giga.de
1 imasdk.googleapis.com videos.giga.de
1 beacon.s-onetag.com get.s-onetag.com
1 si.nuggad.net js.stroeermediabrands.de
1 s400.mxcdn.net js.stroeermediabrands.de
1 go.giga-abs.de www.giga.de
1 adservice.google.com pagead2.googlesyndication.com
1 adservice.google.de pagead2.googlesyndication.com
1 irqs.ioam.de script.ioam.de
1 get.s-onetag.com www.giga.de
1 cx.atdmt.com www.giga.de
1 gocp.stroeermediabrands.de www.giga.de
1 crops.giga.de www.giga.de
1 js.stroeermediabrands.de www.giga.de
1 script.ioam.de www.giga.de
1 cdn.speedcurve.com www.giga.de
0 ssl.2.damoh.giga.de Failed text
0 lb70.s400.meetrics.net Failed www.giga.de
0 dx.bigsea.weborama.com Failed www.giga.de
0 p.adsymptotic.com Failed www.giga.de
0 segments.company-target.com Failed www.giga.de
0 bcp.crwdcntrl.net Failed www.giga.de
0 ce.lijit.com Failed www.giga.de
0 ps.eyeota.net Failed www.giga.de
0 cdn.tynt.com Failed www.giga.de
0 vap2ams1.lijit.com Failed www.giga.de
0 cdn.taboola.com Failed www.giga.de
0 dkuim.de Failed www.giga.de
0 securepubads.g.doubleclick.net Failed www.googletagservices.com
0 www.dunkirkinception.com Failed www.giga.de
0 cdn-a.yieldlove.com Failed js.stroeermediabrands.de
123 61
Subject Issuer Validity Valid
*.giga.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-02
2 years crt.sh
a3.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-08-19 -
2019-10-13
2 months crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.stroeermediabrands.de
RapidSSL RSA CA 2018
2018-09-06 -
2020-12-05
2 years crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-08-13 -
2019-11-11
3 months crt.sh
*.met.vgwort.de
Thawte RSA CA 2018
2018-05-22 -
2020-03-25
2 years crt.sh
*.facebook.com
DigiCert SHA2 High Assurance Server CA
2019-08-24 -
2019-10-19
2 months crt.sh
*.atlassolutions.com
DigiCert SHA2 High Assurance Server CA
2019-07-11 -
2019-10-09
3 months crt.sh
*.s-onetag.com
Amazon
2019-06-25 -
2020-07-25
a year crt.sh
*.google-analytics.com
GTS CA 1O1
2019-08-13 -
2019-11-11
3 months crt.sh
c.amazon-adsystem.com
Amazon
2018-12-18 -
2019-11-21
a year crt.sh
*.nativendo.de
Thawte TLS RSA CA G1
2019-04-30 -
2021-05-29
2 years crt.sh
*.google.com
GTS CA 1O1
2019-08-13 -
2019-11-11
3 months crt.sh
*.giga-abs.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-09-04
2 years crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
a year crt.sh
*.mxcdn.net
DigiCert SHA2 Secure Server CA
2018-09-27 -
2019-11-26
a year crt.sh
*.nuggad.net
Gandi Standard SSL CA 2
2018-01-12 -
2020-01-16
2 years crt.sh
*.lijit.com
Go Daddy Secure Certificate Authority - G2
2019-03-11 -
2020-05-10
a year crt.sh
ssl379338.cloudflaressl.com
COMODO ECC Domain Validation Secure Server CA 2
2019-05-06 -
2019-11-12
6 months crt.sh
*.googleapis.com
GTS CA 1O1
2019-08-13 -
2019-11-11
3 months crt.sh
aax-eu.amazon-adsystem.com
Amazon
2018-12-12 -
2019-12-10
a year crt.sh
*.apis.google.com
GTS CA 1O1
2019-08-13 -
2019-11-11
3 months crt.sh
*.bootstrapcdn.com
COMODO RSA Domain Validation Secure Server CA
2018-10-03 -
2019-10-12
a year crt.sh
*.adscale.de
DigiCert SHA2 Secure Server CA
2019-02-19 -
2020-05-20
a year crt.sh
*.giga-video.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-01-01
a year crt.sh
*.s3.eu-central-1.amazonaws.com
DigiCert Baltimore CA-2 G2
2018-11-08 -
2019-11-06
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
*.ml314.com
Amazon
2019-03-16 -
2020-04-16
a year crt.sh
*.sharethis.com
Go Daddy Secure Certificate Authority - G2
2017-09-26 -
2020-09-29
3 years crt.sh

This page contains 11 frames:

Primary Page: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Frame ID: 384DB74DECB45BAD89915650BBE7F86A
Requests: 82 HTTP requests in this frame

Frame: https://videos.giga.de/embed/176875?autoplay=0
Frame ID: 3442C2EA58F8060C0D9E5FCDAE7F41A9
Requests: 16 HTTP requests in this frame

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

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

Frame: https://ap.lijit.com/www/delivery/fpi.js?z=600632&width=320&height=50&iv=sf
Frame ID: 2A91C9793D2926A4E2AABCB8388472BF
Requests: 18 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1567409736&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&adsid=NT&dt=1567409736643&bpp=16&bdt=15534&fdt=211&idt=212&shv=r20190826&cbv=r20190131&saldr=aa&abxe=1&correlator=5753146474377&frm=20&pv=2&ga_vid=1531852183.1567409737&ga_sid=1567409737&ga_hid=92470518&ga_fc=0&iag=0&icsg=35187637370080&dssz=53&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335&oid=3&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&osw_key=2707494302&ifi=1&uci=a!1&fsb=1&xpc=0inmWRmk83&p=https%3A//www.giga.de&dtd=237
Frame ID: 1734505C0751A74C682B4071FE57356F
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1567409736&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1567409736764&bpp=8&bdt=15655&fdt=140&idt=140&shv=r20190826&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=5753146474377&frm=20&pv=1&ga_vid=1531852183.1567409737&ga_sid=1567409737&ga_hid=92470518&ga_fc=0&iag=0&icsg=2392550363165600&dssz=57&mdo=0&mso=0&u_tz=120&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=0&ady=0&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335&oid=3&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&osw_key=4077977667&ifi=1&uci=a!1&fsb=1&dtd=144
Frame ID: 1F6B0E4E7B3E3FD73E9047DF10CCCE16
Requests: 1 HTTP requests in this frame

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

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

Frame: https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/5b551105b6844b7d94f9655674d82cf5/ts/1567409738900/v/2/hid/406/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=4&d12=2&d11=0&d4=4&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Frame ID: 9A8A731A9597D464253C06E069B8EB77
Requests: 1 HTTP requests in this frame

Frame: https://gslbeacon.lijit.com/beacon?viewId=m_600632_122ea9eea38649f098c99de19ac4e723&rand=4482&informer=13166301&type=fpads&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&v=1.2
Frame ID: 8BFAB19ADDBA3E9D4E07C31C9A1ACDE5
Requests: 1 HTTP requests in this frame

Screenshot


Detected technologies

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

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

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

Page Statistics

123
Requests

81 %
HTTPS

36 %
IPv6

40
Domains

61
Subdomains

40
IPs

5
Countries

1202 kB
Transfer

3669 kB
Size

0
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 19
  • https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1 HTTP 302
  • https://ssl-econa.met.vgwort.de/blank.gif
Request Chain 21
  • https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent HTTP 302
  • https://cx.atdmt.com/?c=1758474719950343775&f=AYyf0CoxPZC-zepJw2jhole7Gv-c09yQ-XF8xGPpE3Bm7Rc1KB94vfUd3gmagmo6kPeC5s1qcUP1-nDgsTO3iDLl&id=1773162896260346&l=3&v=0
Request Chain 30
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=GB%2FLondon%2C%20City%20of&cb=000d&i2=000d4fccbcd1360db5d6cc648&ep=1592114340&vr=415&id=sxnjyl&i3=000d4fccbcd1360db5d6cc648%3A1596180936608%3A1567409736608%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1567409736608&n1=3&dntt=0&lt=1567409736611&ev=&cs=pqko8e&mo=0 HTTP 302
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=GB%2FLondon%2C+City+of&cb=000d&i2=000d4fccbcd1360db5d6cc648&ep=1592114340&vr=415&id=sxnjyl&i3=000d4fccbcd1360db5d6cc648%3A1596180936608%3A1567409736608%3A.giga.de%3A1%3Agiga%3Asoftware_content%3Anoevent%3A1567409736608&n1=3&dntt=0&lt=1567409736611&ev=&cs=pqko8e&mo=0&sr=71 HTTP 302
  • https://de.ioam.de/blank.gif
Request Chain 39
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software HTTP 302
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Request Chain 44
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 60
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox HTTP 302
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Request Chain 80
  • https://native.adscale.de/native HTTP 307
  • https://native.adscale.de/native?uu=5b551105b6844b7d94f9655674d82cf5
Request Chain 92
  • https://adscale.nuggad.net/bk?nuggn=1660240041&nuggsid=1029839715&nuggrid=http%3A%2F%2Fwww.giga.de&nuggl=https%3A%2F%2Fih.adscale.de%2Fnuggad%3F%2Fnu%2F0%2Fpre%2F0%2Fsid%2FYmJiY2Mw%2Fuu%2F5b551105b6844b7d94f9655674d82cf5%2Fts%2F1567409738900%2Fv%2F2%2Fhid%2F406%2Fssl%2F1%2Fws%2Fhttps%253A%252F%252Fwww.giga.de%252Fwebapps%252Fpaypal%252Ftipps%252Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%252F%2Fnvars%2FNUGGVARS HTTP 302
  • https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/5b551105b6844b7d94f9655674d82cf5/ts/1567409738900/v/2/hid/406/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=4&d12=2&d11=0&d4=4&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4

123 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
121 KB
43 KB
Document
General
Full URL
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
dd91c7ef6e655b11d7531f6a5e60b65e00004642b3de4c027152cdc5f2fea900

Request headers

:method
GET
:authority
www.giga.de
:scheme
https
:path
/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
navigate
sec-fetch-user
?1
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
none
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
navigate
Sec-Fetch-User
?1

Response headers

status
200
server
nginx
content-type
text/html; charset=UTF-8
vary
Accept-Encoding
date
Mon, 02 Sep 2019 07:35:21 GMT
x-page-speed
1.13.35.2-0
cache-control
max-age=0, no-cache
content-encoding
gzip
source-sans-pro-v11-latin-700.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
15 KB
15 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-700.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 02 Sep 2019 07:35:21 GMT
last-modified
Fri, 30 Aug 2019 15:54:39 GMT
server
nginx
accept-language
bytes
etag
"5d6946bf-3c78"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15480
expires
Tue, 01 Sep 2020 07:35:21 GMT
source-sans-pro-v11-latin-600.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
15 KB
16 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-600.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 02 Sep 2019 07:35:21 GMT
last-modified
Fri, 30 Aug 2019 15:54:39 GMT
server
nginx
accept-language
bytes
etag
"5d6946bf-3da8"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15784
expires
Tue, 01 Sep 2020 07:35:21 GMT
source-sans-pro-v11-latin-regular.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
16 KB
16 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-regular.woff2
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 02 Sep 2019 07:35:21 GMT
last-modified
Fri, 30 Aug 2019 15:54:39 GMT
server
nginx
accept-language
bytes
etag
"5d6946bf-3e24"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
15908
expires
Tue, 01 Sep 2020 07:35:21 GMT
lux.js
cdn.speedcurve.com/js/
19 KB
7 KB
Script
General
Full URL
https://cdn.speedcurve.com/js/lux.js?id=131387135
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.217 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
Apache /
Resource Hash
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

strict-transport-security
max-age=15768000
content-encoding
gzip
age
41417
x-cache
HIT
status
200
content-length
6462
x-served-by
cache-fra19157-FRA
access-control-allow-origin
*
last-modified
Sun, 01 Sep 2019 20:05:19 GMT
server
Apache
x-timer
S1567409737.621511,VS0,VE0
date
Mon, 02 Sep 2019 07:35:36 GMT
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
via
1.1 varnish
expires
Mon, 02 Sep 2019 20:05:19 GMT
cache-control
max-age=86400
accept-ranges
bytes
timing-allow-origin
*
x-cache-hits
2111
pre-59170da966.js
www.giga.de/static-local/dist/assets/js/
59 KB
19 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/pre-59170da966.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
b6b279f748f4b7117df70a60bc27463ca80e5fd711905011b33374a1486127d3

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 30 Aug 2019 11:22:15 GMT
content-encoding
gzip
x-original-content-length
60530
server
nginx
status
200
etag
W/"5d690671-ec72"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
19310
expires
Sat, 29 Aug 2020 11:22:15 GMT
main-desktop-1e5b226906.css
www.giga.de/static-local/dist/assets/css/
353 KB
49 KB
Stylesheet
General
Full URL
https://www.giga.de/static-local/dist/assets/css/main-desktop-1e5b226906.css
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
f0b10626c2294f4f12f5b76222ceca984f9ac881fc871de81331cc73d81a7a86

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 29 Aug 2019 11:37:57 GMT
content-encoding
gzip
x-original-content-length
361819
server
nginx
status
200
etag
W/"5d67b89b-5855b"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/css
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
49605
expires
Fri, 28 Aug 2020 11:37:57 GMT
iam.js
script.ioam.de/
34 KB
11 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.10 000d
Resource Hash
244a3d4cf47102101d747a3b3829bff737cbeda8a904eba6ec50d62f8b9b5ec4

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 GMT
Content-Encoding
gzip
Last-Modified
Mon, 02 Sep 2019 07:35:36 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 000d
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, 02 Sep 2019 09:35:36 GMT
metaTag.min.b6cc6e3855a78319c5153b2d7d5116b5.js
js.stroeermediabrands.de/
256 KB
62 KB
Script
General
Full URL
https://js.stroeermediabrands.de/metaTag.min.b6cc6e3855a78319c5153b2d7d5116b5.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
46.253.113.178 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
31e175ee7e5e7ede77df71cf406ab46af0fed80b9c85ca5a0d27ad899159678a

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:28 GMT
content-encoding
gzip
last-modified
Thu, 29 Aug 2019 09:29:02 GMT
server
nginx/1.14.1
vary
Accept-Encoding
content-type
application/javascript
status
200
cache-control
max-age=31536000, public immutable max-age=31536000
expires
Tue, 01 Sep 2020 07:35:28 GMT
giga.svg
www.giga.de/static-local/dist/assets/images/logos/
11 KB
4 KB
Image
General
Full URL
https://www.giga.de/static-local/dist/assets/images/logos/giga.svg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
dd28ac8237e60211a798ccc9ecacec2accc1fd02ee06f6264a3624606cd38831

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:29 GMT
content-encoding
gzip
last-modified
Fri, 30 Aug 2019 15:54:39 GMT
server
nginx
status
200
etag
W/"5d6946bf-2ad8"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
image/svg+xml
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
expires
Tue, 01 Sep 2020 07:35:29 GMT
2501-rcm40x40.jpg
static.giga.de/wp-content/uploads/2015/05/
796 B
1 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/05/2501-rcm40x40.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 20 Aug 2019 14:38:47 GMT
x-content-type-options
nosniff
age
1097802
filer-source
ca7b44b53d5a66e850355c11821198c504e518f8f12b295bd9c54d22bb538e08
x-cache
HIT
status
200
accept-language
bytes
content-length
796
x-xss-protection
1; mode=block
last-modified
Tue, 20 Aug 2019 14:38:47 GMT
server
nginx/1.10.3
filer-attr
W1s0MCw0MF0sInNodXR0bGUtdjEiLFsiRlJBLTEiXSxbIkZSQi0xIl1d
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Thu, 19 Sep 2019 14:38:47 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
94 KB
35 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
953ce6754421c9f924dff139a6540edfb50ff2bc3163443df8b7c95ee7663710
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:29 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,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
34987
x-xss-protection
0
server
cafe
etag
3402199221386500085
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Mon, 02 Sep 2019 07:35:29 GMT
paypal-login-deutsch-rcm960x0.jpg
static.giga.de/wp-content/uploads/2015/07/
18 KB
19 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/07/paypal-login-deutsch-rcm960x0.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
f94e032d892cd03ec8d2e87a139d5598ff586ffd4ddccd14d0cef518730c0821
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 08 Aug 2019 12:21:22 GMT
x-content-type-options
nosniff
age
2142848
filer-source
3dc62a8e18f9b6ceb94ecf895297d72ce0545c5156c00f0fa8e434dc55d3102e
x-cache
HIT
status
200
accept-language
bytes
content-length
18921
x-xss-protection
1; mode=block
last-modified
Wed, 10 Jul 2019 17:56:51 GMT
server
nginx/1.10.3
filer-attr
W1s4OTAsNDg1XSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Fri, 09 Aug 2019 17:56:51 GMT
2845a21346beaba2f3d1db455b_YyAxODk1eDYzNysxMisxNzACcmUgNjI1IDIxMAMwZDI1MTZhMmRiNQ==.jpg
crops.giga.de/0a/ad/ab/
16 KB
17 KB
Image
General
Full URL
https://crops.giga.de/0a/ad/ab/2845a21346beaba2f3d1db455b_YyAxODk1eDYzNysxMisxNzACcmUgNjI1IDIxMAMwZDI1MTZhMmRiNQ==.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
a0611e486e87faf678d732cede5f2b94c26550f87a9e8baf6393ac3e8f96268b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 26 Aug 2019 05:47:53 GMT
x-content-type-options
nosniff
age
611259
filer-source
833cb36a650161e736193aec5c3891398d2fa56a03e872ecb4014e0c343af106
x-cache
HIT
status
200
accept-language
bytes
content-length
16480
x-xss-protection
1; mode=block
last-modified
Mon, 26 Aug 2019 05:47:53 GMT
server
nginx/1.10.3
filer-attr
W1s2MjUsMjEwXSwic3RpLXYzIixbIkZSQS0xIl0sWyJGUkItMSJdXQ==
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Wed, 25 Sep 2019 05:47:53 GMT
PayPal-Login-Page-rcm464x0.jpg
static.giga.de/wp-content/uploads/2015/07/
21 KB
21 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2015/07/PayPal-Login-Page-rcm464x0.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
2f58ccf14355919dfa5815bebd82d775161bdf2707480201bd8b2334778c0412
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 26 Aug 2019 13:58:48 GMT
x-content-type-options
nosniff
age
581804
filer-source
7154c03f1279d42875baf477c69c8abd717043148b5dba0c147151812277507b
x-cache
HIT
status
200
accept-language
bytes
content-length
21316
x-xss-protection
1; mode=block
last-modified
Thu, 08 Aug 2019 11:07:47 GMT
server
nginx/1.10.3
filer-attr
W1s0MTUsNTczXSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sat, 07 Sep 2019 11:07:47 GMT
fotobearbeitung-raw-macbook-q_giga_set-rcm200x113.jpg
static.giga.de/wp-content/uploads/2019/08/
9 KB
10 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2019/08/fotobearbeitung-raw-macbook-q_giga_set-rcm200x113.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
5fad70ffdf4b71962dfba1a6a2a47fa4bbe2501a19f916e71f20850336d99d7b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sat, 31 Aug 2019 10:03:28 GMT
x-content-type-options
nosniff
age
163923
filer-source
4b105cd1ea6bc1e7cc4a54736f6ad37917132707ad3a3bc51f8110f83c8ed9d7
x-cache
HIT
status
200
accept-language
bytes
content-length
9630
x-xss-protection
1; mode=block
last-modified
Sat, 31 Aug 2019 10:03:28 GMT
server
nginx/1.10.3
filer-attr
W1syMDAsMTEzXSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 30 Sep 2019 10:03:28 GMT
excel-combobox-beispiel-rcm200x113.jpg
static.giga.de/wp-content/uploads/2019/08/
4 KB
5 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2019/08/excel-combobox-beispiel-rcm200x113.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
1c4dab01b38d1d6bc2e6397078efb6c5b01536e0fec18f58091ff7abceca47ce
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Thu, 29 Aug 2019 15:17:18 GMT
x-content-type-options
nosniff
age
317893
filer-source
cd257c97cd110050dbc6cdcbca9184e93fbac9bee109d70524718db1eea7a7f0
x-cache
HIT
status
200
accept-language
bytes
content-length
4273
x-xss-protection
1; mode=block
last-modified
Thu, 29 Aug 2019 15:17:18 GMT
server
nginx/1.10.3
filer-attr
W1syMDAsMTEzXSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sat, 28 Sep 2019 15:17:18 GMT
ms-office-365-6-rcm200x113.jpg
static.giga.de/wp-content/uploads/2019/07/
6 KB
6 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2019/07/ms-office-365-6-rcm200x113.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
8b9a6de2a0eff9f5a406d140b5cb08df5eb78d96feb5050645521b05400fc283
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 28 Aug 2019 14:01:03 GMT
x-content-type-options
nosniff
age
408869
filer-source
9780728d35d931ce17176b80b862cb09506121642de5cc0026f036e0aced1699
x-cache
HIT
status
200
accept-language
bytes
content-length
5784
x-xss-protection
1; mode=block
last-modified
Thu, 15 Aug 2019 03:14:22 GMT
server
nginx/1.10.3
filer-attr
W1syMDAsMTEzXSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sat, 14 Sep 2019 03:14:22 GMT
Siri-Geld-verschicken-PayPal-rcm235x129.jpg
static.giga.de/wp-content/uploads/2016/11/
6 KB
6 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2016/11/Siri-Geld-verschicken-PayPal-rcm235x129.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Fri, 30 Aug 2019 05:29:49 GMT
x-content-type-options
nosniff
age
266742
filer-source
8fa6d82067b578ca8e6bb273bed34f9d123e3ee778a1db1a4f9ea350b5447154
x-cache
HIT
status
200
accept-language
bytes
content-length
5657
x-xss-protection
1; mode=block
last-modified
Thu, 08 Aug 2019 11:07:47 GMT
server
nginx/1.10.3
filer-attr
W1syMzUsMTI5XSwic2h1dHRsZS12MSIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sat, 07 Sep 2019 11:07:47 GMT
trackcp.js
gocp.stroeermediabrands.de/
27 KB
10 KB
Script
General
Full URL
https://gocp.stroeermediabrands.de/trackcp.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.16.106 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.106.16.40.188.clients.your-server.de
Software
/
Resource Hash
ed12abebf74d61e8a6846dd87861bbe0c58355d207ef453eabd28a82e0519496

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:32 GMT
Content-Encoding
gzip
Last-Modified
Mon, 26 Aug 2019 12:30:08 GMT
ETag
"5d63d0d0-6cb8"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=86400, max-age=31536000, public
X-Machine
hn86 gocp env
Accept-Ranges
bytes
Expires
Tue, 03 Sep 2019 07:35:32 GMT
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
  • https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1
  • https://ssl-econa.met.vgwort.de/blank.gif
43 B
310 B
Image
General
Full URL
https://ssl-econa.met.vgwort.de/blank.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
161.156.66.178 , United States, ASN36351 (SOFTLAYER - SoftLayer Technologies Inc., US),
Reverse DNS
b2.42.9ca1.ip4.static.sl-reverse.com
Software
s2.50.19 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:32 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
s2.50.19
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

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

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:32 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
status
200
cache-control
no-cache, must-revalidate, max-age=0
content-length
44
expires
Mon, 02 Sep 2019 07:35:32 GMT
/
cx.atdmt.com/
Redirect Chain
  • https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
  • https://cx.atdmt.com/?c=1758474719950343775&f=AYyf0CoxPZC-zepJw2jhole7Gv-c09yQ-XF8xGPpE3Bm7Rc1KB94vfUd3gmagmo6kPeC5s1qcUP1-nDgsTO3iDLl&id=1773162896260346&l=3&v=0
42 B
408 B
Image
General
Full URL
https://cx.atdmt.com/?c=1758474719950343775&f=AYyf0CoxPZC-zepJw2jhole7Gv-c09yQ-XF8xGPpE3Bm7Rc1KB94vfUd3gmagmo6kPeC5s1qcUP1-nDgsTO3iDLl&id=1773162896260346&l=3&v=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f0ff:2:face:b00c:0:8c , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
/
Resource Hash
6d8ba81d1b60a18707722a1f2b62dad48a6acced95a1933f49a68b5016620b93

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:32 GMT
content-type
image/gif
content-length
42
p3p
CP="NOI DSP COR CUR ADM DEV TAIo PSAo PSDo OUR BUS UNI PUR COM NAV INT DEM STA PRE OTC"

Redirect headers

pragma
no-cache
date
Mon, 02 Sep 2019 07:35:32 GMT
server
proxygen-bolt
status
302
content-type
text/plain
location
https://cx.atdmt.com/?c=1758474719950343775&f=AYyf0CoxPZC-zepJw2jhole7Gv-c09yQ-XF8xGPpE3Bm7Rc1KB94vfUd3gmagmo6kPeC5s1qcUP1-nDgsTO3iDLl&id=1773162896260346&l=3&v=0
cache-control
no-cache, no-store, must-revalidate
content-length
0
expires
0
tag.min.js
get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/
70 KB
16 KB
Script
General
Full URL
https://get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/tag.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2057:be00:1f:287:d20a:ce1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
fa761fced560b3ed22391d3824f89b997b1e9d6adb5c55cfd25de054523d81e9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
6Fl_loZmkItS00Puo0OWcD7da2halF1e
content-encoding
gzip
last-modified
Tue, 25 Jun 2019 11:23:41 GMT
server
AmazonS3
age
2104
date
Mon, 02 Sep 2019 07:03:34 GMT
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
text/javascript
status
200
cache-control
max-age=3600
x-amz-cf-pop
FRA6-C1
x-amz-cf-id
WzsyAJPI9Uu1XAl5SEi4Ntx3VfsCrX6ZFhOAp9EP34qJPeghixgB_Q==
via
1.1 3095e870e1a1a1b03178e40ab1872de5.cloudfront.net (CloudFront)
analytics.js
www.google-analytics.com/
43 KB
18 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-59170da966.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 19 Aug 2019 17:22:41 GMT
server
Golfe2
age
3118
date
Mon, 02 Sep 2019 06:43:34 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,39"
content-length
17803
expires
Mon, 02 Sep 2019 08:43:34 GMT
apstag.js
c.amazon-adsystem.com/aax2/
74 KB
21 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/apstag.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-59170da966.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
99.86.1.198 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-99-86-1-198.fra6.r.cloudfront.net
Software
Server /
Resource Hash
2d125794eb0e7f8125184a7538c893ca0591c28cc18eac4273b05482025ffcae

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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
Sun, 01 Sep 2019 19:22:20 GMT
content-encoding
gzip
server
Server
age
43992
etag
ff41c1402da52abc01c9279d88534aa1
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
x-amz-cf-pop
FRA6-C1
accept-ranges
bytes
timing-allow-origin
*
x-amz-cf-id
-TdCSuY3fXPrVPgjBM_nXeHb5dYoIKWmAnhPuhf6oJ2xVmOxPpVuxg==
via
1.1 163be08bc1bc44818353c4fd88655bee.cloudfront.net (CloudFront)
js
www.google-analytics.com/gtm/
79 KB
26 KB
Script
General
Full URL
https://www.google-analytics.com/gtm/js?id=GTM-KRW4T6J&t=gt1&cid=765572545.1567409733&aip=true
Requested by
Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
ccb23473b8af00a446f5e47731b5b2d29d64ad83ab6c94e5320d81017ad4cf57
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:32 GMT
content-encoding
br
server
Google Tag Manager
access-control-allow-headers
Cache-Control
status
200
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
http://www.googletagmanager.com
cache-control
private, max-age=900
access-control-allow-credentials
true
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
26115
x-xss-protection
0
expires
Mon, 02 Sep 2019 07:35:32 GMT
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
3 KB
XHR
General
Full URL
https://c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
99.86.1.198 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-99-86-1-198.fra6.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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
Sun, 01 Sep 2019 19:22:36 GMT
content-encoding
gzip
vary
Origin
age
43990
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
*
last-modified
Fri, 24 Aug 2018 07:13:51 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
via
1.1 82e9051d8d41080bd3028731e0e8677f.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA6-C1
x-amz-cf-id
PmfQgmMSmTDSvX1QI02n4jSoApkzLA-IYcnlirMTN33LoDNaXQHO2g==
collect
www.google-analytics.com/r/
35 B
199 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=92470518&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&_u=6GBAAEADQ~&jid=256856206&gjid=1614599918&cid=765572545.1567409733&tid=UA-204785-4&_gid=1390192888.1567409733&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&z=1150072315
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:32 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT
init
d.nativendo.de/cds/delivery/
991 B
918 B
Script
General
Full URL
https://d.nativendo.de/cds/delivery/init
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
8f4b1fe543b807aaf259c71db310cbf08ce3df590fbdc9f5b991585faa59c964

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 GMT
content-encoding
gzip
last-modified
Mon, 02 Sep 2019 07:35:36 GMT
server
Apache
vary
Accept-Encoding
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
516
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
identitystatus
irqs.ioam.de/
25 B
203 B
XHR
General
Full URL
https://irqs.ioam.de/identitystatus?offerIdentifier=giga&siteIdentifier=software_content&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.20011001083573055
Requested by
Host: script.ioam.de
URL: https://script.ioam.de/iam.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
193.46.63.75 Alfter, Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
irqs.ioam.de
Software
nginx /
Resource Hash
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 GMT
server
nginx
status
200
vary
Origin
content-type
application/vnd.api+json
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
strict-transport-security
max-age=15768000
blank.gif
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=GB%2FLondon%2C%20City%20of&cb=000d&i2=000d4fccbcd1360db5d6cc648&ep=15...
  • https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=GB%2FLondon%2C+City+of&cb=000d&i2=000d4fccbcd1360db5d6cc648&ep=159211...
  • https://de.ioam.de/blank.gif
43 B
651 B
Image
General
Full URL
https://de.ioam.de/blank.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
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 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx
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
*
Cache-Control
max-age=86400
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
image/gif
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Content-Length
43
Expires
Tue, 03 Sep 2019 07:35:36 GMT

Redirect headers

Date
Mon, 02 Sep 2019 07:35:36 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.05.0 0020
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, 02 Sep 2019 07:35:36 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/blank.gif
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Sun, 02 Sep 2018 07:35:36 GMT
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
9 KB
9 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/fontello/fontello.woff2?45176191
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
40f93961d6ae3bccb56837e2e05cae9533c0b07a4a69b2fc776e5f66833fe418

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/static-local/dist/assets/css/main-desktop-1e5b226906.css
Origin
https://www.giga.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 02 Sep 2019 07:35:36 GMT
last-modified
Fri, 30 Aug 2019 15:54:39 GMT
server
nginx
accept-language
bytes
etag
"5d6946bf-23bc"
status
200
access-control-allow-methods
GET
content-type
application/octet-stream
access-control-allow-origin
*
cache-control
max-age=31536000, s-maxage=10
content-length
9148
expires
Tue, 01 Sep 2020 07:35:36 GMT
176875
videos.giga.de/embed/ Frame 3442
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/176875?autoplay=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
35637b2df493cc121a7ffc815aa9fadf81ae3f0199e524af5ebe73c7f254e3b7

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/176875?autoplay=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-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
same-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
cookie
_ga=GA1.2.765572545.1567409733; _gid=GA1.2.1390192888.1567409733; _gat_gt1=1; ioam2018=000d4fccbcd1360db5d6cc648:1596180936608:1567409736608:.giga.de:2:giga:software_content:noevent:1567409736608:qj422h
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
server
nginx/1.14.1
date
Mon, 02 Sep 2019 07:35:36 GMT
content-type
text/html;charset=UTF-8
link
<https://videos.giga.de/embed/176875>; rel="canonical"
content-encoding
gzip
bg-teaser.png
www.giga.de/wp-content/themes/project/assets/img/teaser/
647 B
865 B
Image
General
Full URL
https://www.giga.de/wp-content/themes/project/assets/img/teaser/bg-teaser.png
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
265de6b562fdaf225b6713104b74342ffe97177ac67505d9e799e3acfa56352b

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/static-local/dist/assets/css/main-desktop-1e5b226906.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 27 Mar 2019 21:57:05 GMT
server
nginx
accept-language
bytes
etag
"5c9a42da-287"
status
200
access-control-allow-methods
GET
content-type
image/png
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
647
expires
Thu, 26 Mar 2020 21:57:05 GMT
integrator.js
adservice.google.de/adsid/
109 B
476 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.giga.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
104
x-xss-protection
0
integrator.js
adservice.google.com/adsid/
109 B
476 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.giga.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81b::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
104
x-xss-protection
0
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190826/r20190131/
221 KB
82 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190826/r20190131/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef184624ec8084ef9f3e3a3159b37e847417d50de3aae2561d7335a5766d04d4
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 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,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
83411
x-xss-protection
0
server
cafe
etag
18308782597284574375
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Mon, 02 Sep 2019 07:35:36 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20190826/r20190131/ Frame 2A1E
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20190826/r20190131/zrt_lookup.html
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/html/r20190826/r20190131/zrt_lookup.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

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
Mon, 26 Aug 2019 23:52:32 GMT
expires
Mon, 09 Sep 2019 23:52:32 GMT
content-type
text/html; charset=UTF-8
etag
4817175036427020965
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
7274
x-xss-protection
0
cache-control
public, max-age=1209600
age
546184
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43,39",quic=":443"; ma=2592000; v="46,43,39"
z.js
go.giga-abs.de/
1 KB
1 KB
Script
General
Full URL
https://go.giga-abs.de/z.js?0.40610119852212345
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.0
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.20 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
X/1.0 /
Resource Hash
d9ad3ca4b381bb164bb8176520d39a05becb7464f2c37920feb16994ddd3dc9f
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 GMT
X-Content-Type-Options
nosniff
Last-Modified
Mon, 02 Sep 2019 07:35:36 GMT
Server
X/1.0
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Content-Length
1040
Expires
Tue, 03 Sep 2019 07:35:28 GMT
Cookie set iframe
tracking.m6r.eu/pixel/ Frame 79A9
Redirect Chain
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
0
0
Document
General
Full URL
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash

Request headers

Host
tracking.m6r.eu
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
test=true
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
nginx
Content-Type
text/html; charset=utf-8
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Content-Encoding
gzip
Date
Mon, 02 Sep 2019 07:35:36 GMT
Content-Length
1576
Connection
keep-alive
Vary
Accept-Encoding
Set-Cookie
id=8272295eeb1b05c4d3f97d512eabed2c; Max-Age=7776000; Domain=m6r.eu; Path=/; Expires=Sun, 01 Dec 2019 07:35:36 GMT

Redirect headers

Server
nginx
Content-Type
text/html; charset=utf-8
Content-Length
302
Location
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
Date
Mon, 02 Sep 2019 07:35:36 GMT
Connection
keep-alive
Set-Cookie
test=true; Max-Age=3600; Domain=m6r.eu; Path=/; Expires=Mon, 02 Sep 2019 08:35:36 GMT
gpt.js
www.googletagservices.com/tag/js/
39 KB
12 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.b6cc6e3855a78319c5153b2d7d5116b5.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
94ac201f145004772aeeceb50ca6df57778c8f0974e977ace348a5abd98d539d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"267 / 451 of 1000 / last-modified: 1567192177"
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="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
12497
x-xss-protection
0
expires
Mon, 02 Sep 2019 07:35:36 GMT
bid
c.amazon-adsystem.com/e/dtb/
122 B
504 B
XHR
General
Full URL
https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=1135785797511567409732766&cb=8376687364641567409736751&ws=1600x1200&v=7.35.01&t=1000&slots=%5B%7B%22sd%22%3A%22banner-1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%22sky-2%22%2C%22s%22%3A%5B%22160x600%22%2C%22300x600%22%5D%2C%22sn%22%3A%22sky%22%7D%2C%7B%22sd%22%3A%22rectangle-4%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
99.86.1.198 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-99-86-1-198.fra6.r.cloudfront.net
Software
Server /
Resource Hash
96c1a6c6c786bb22587abb1998d9aca075d75dcdde4aa6633a9997245bdb64b7

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA6-C1
status
200
vary
Accept-Encoding,User-Agent
x-cache
Miss from cloudfront
content-type
text/javascript;charset=UTF-8
access-control-allow-origin
https://www.giga.de
access-control-allow-credentials
true
timing-allow-origin
*
content-length
131
via
1.1 163be08bc1bc44818353c4fd88655bee.cloudfront.net (CloudFront)
x-amz-cf-id
XeaX6DJvuv6TIgfjGhuh3KoWaSmj4RI7Hp0QYi224G2g_rfK4KOyuw==
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
0
0

mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
124 KB
48 KB
Script
General
Full URL
https://s400.mxcdn.net/bb-mx/serve/mtrcs_679600.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.b6cc6e3855a78319c5153b2d7d5116b5.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.67 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-67.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:43 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Cache-Control
public, max-age=7200
Connection
keep-alive
Content-Type
text/javascript
Content-Length
49094
Expires
Mon, 02 Sep 2019 09:35:43 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
97 B
597 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
6c48963faea211afc0d69c597ad524ec3570ed946c61f94cbebd12fde80213de

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:37 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
106

Redirect headers

Date
Mon, 02 Sep 2019 07:35:36 GMT
Server
nginx
Access-Control-Allow-Origin
https://www.giga.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
rc
si.nuggad.net/
0
0
Script
General
Full URL
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.b6cc6e3855a78319c5153b2d7d5116b5.js
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_CBC
Server
80.82.201.88 Berlin, Germany, ASN48173 (UNBELIEVABLE-AS, DE),
Reverse DNS
pbtgx-nuggad.unbelievable-machine.net
Software
Apache /
Resource Hash

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:39 GMT
Server
Apache
Connection
close
Accept-Ranges
bytes
Content-Type
text/html
collect
www.google-analytics.com/r/
35 B
101 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=92470518&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEADQ~&jid=1815373230&gjid=985334205&cid=765572545.1567409733&tid=UA-204785-4&_gid=1390192888.1567409733&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd21=auto&cm17=1&cd18=4282584&z=1986573594
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT
ad-loading.gif
www.dunkirkinception.com/detect/
0
0

post-4c71d5d921.js
www.giga.de/static-local/dist/assets/js/bundle/
7 KB
3 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/bundle/post-4c71d5d921.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-59170da966.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
0baa1b7da945fc3334d5683c8502c3da91529a8a35afaf0e591be34633adf609

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 20 Aug 2019 13:14:33 GMT
content-encoding
gzip
x-original-content-length
7084
server
nginx
status
200
etag
W/"5d5bf1bf-1bac"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
2684
expires
Wed, 19 Aug 2020 13:14:33 GMT
giga-6b59f15322.js
www.giga.de/static-local/dist/assets/js/bundle/
31 KB
12 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/bundle/giga-6b59f15322.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-59170da966.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
f6c88d72ddbc86769c79cd60c2fbffac3679934dca3c2173dc8f919bcbbbfd64

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Tue, 09 Jul 2019 13:24:03 GMT
content-encoding
gzip
x-original-content-length
31346
server
nginx
status
200
etag
W/"5d2494e5-7a72"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
11745
expires
Wed, 08 Jul 2020 13:24:03 GMT
beacon.min.js
beacon.s-onetag.com/
18 KB
6 KB
Script
General
Full URL
https://beacon.s-onetag.com/beacon.min.js
Requested by
Host: get.s-onetag.com
URL: https://get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/tag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2057:c00:5:9a4c:9b00:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
662fa6bcdf71d8f92e29010d3e2e270e0071e5d19b1d14ce205654a78aa0a7a9

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
dQ2IPgbwW_sArXQW0CBb3eN5W57SqoQ0
content-encoding
gzip
last-modified
Thu, 04 Apr 2019 09:35:05 GMT
server
AmazonS3
age
2432
date
Mon, 02 Sep 2019 06:55:05 GMT
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=3600
x-amz-cf-pop
FRA6-C1
x-amz-cf-id
uOgs3WEJEC-EQjJdkXaWw_4pb3KB9GOmE20hOaITg4zyhf4jxOiDsQ==
via
1.1 b8e900270aa30d899882e71796feca9c.cloudfront.net (CloudFront)
fpi.js
ap.lijit.com/www/delivery/ Frame 2A91
5 KB
3 KB
Script
General
Full URL
https://ap.lijit.com/www/delivery/fpi.js?z=600632&width=320&height=50&iv=sf
Requested by
Host: get.s-onetag.com
URL: https://get.s-onetag.com/1400a607-dbd1-49d7-9171-69ce05c71f5e/tag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.13 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx /
Resource Hash
1539636041ff6ac5a6b2745ff90041198af7b68d46b4aaf5a4541a17f797106a

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:43 GMT
Content-Encoding
gzip
Server
nginx
ETag
W/"5d018e0f-1534"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
private, no-cache, no-store, must-revalidate, max-age=0
Transfer-Encoding
chunked
X-Sovrn-Pod
ap2ams1
Expires
Thu, 01 Jan 1970 00:00:01 GMT
article-rating-7143c629e5.js
www.giga.de/static-local/dist/assets/js/components/
306 B
534 B
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/components/article-rating-7143c629e5.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-59170da966.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 27 Mar 2019 21:57:05 GMT
content-encoding
gzip
x-original-content-length
306
server
nginx
accept-language
bytes
status
200
etag
"5c9a4313-132"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
234
expires
Thu, 26 Mar 2020 21:57:05 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 1734
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1567409736&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&adsid=NT&dt=1567409736643&bpp=16&bdt=15534&fdt=211&idt=212&shv=r20190826&cbv=r20190131&saldr=aa&abxe=1&correlator=5753146474377&frm=20&pv=2&ga_vid=1531852183.1567409737&ga_sid=1567409737&ga_hid=92470518&ga_fc=0&iag=0&icsg=35187637370080&dssz=53&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335&oid=3&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&osw_key=2707494302&ifi=1&uci=a!1&fsb=1&xpc=0inmWRmk83&p=https%3A//www.giga.de&dtd=237
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190826/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1567409736&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&adsid=NT&dt=1567409736643&bpp=16&bdt=15534&fdt=211&idt=212&shv=r20190826&cbv=r20190131&saldr=aa&abxe=1&correlator=5753146474377&frm=20&pv=2&ga_vid=1531852183.1567409737&ga_sid=1567409737&ga_hid=92470518&ga_fc=0&iag=0&icsg=35187637370080&dssz=53&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335&oid=3&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&osw_key=2707494302&ifi=1&uci=a!1&fsb=1&xpc=0inmWRmk83&p=https%3A//www.giga.de&dtd=237
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

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, 02 Sep 2019 07:35:37 GMT
server
cafe
content-length
20331
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Mon, 02-Sep-2019 07:50:36 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43,39",quic=":443"; ma=2592000; v="46,43,39"
expires
Mon, 02 Sep 2019 07:35:37 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
75 KB
28 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/r20190826/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
0d52524070b2e4a2456997d37766b9462267226491f74f2b270157a419f86738
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1566990918459966"
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,39",quic=":443"; ma=2592000; v="46,43,39"
content-length
28401
x-xss-protection
0
expires
Mon, 02 Sep 2019 07:35:36 GMT
loader.js
c.nativendo.de/cdn/asset/js/
52 KB
17 KB
Script
General
Full URL
https://c.nativendo.de/cdn/asset/js/loader.js?v=1150
Requested by
Host: d.nativendo.de
URL: https://d.nativendo.de/cds/delivery/init
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:ac0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
694ac85b33d3a898437ea951f6c551029a24887e6fac5585b8a703eb4432b084

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 GMT
via
1.1 google
cf-cache-status
HIT
age
320792
cf-polished
origSize=53075
status
200
content-encoding
br
alt-svc
clear
cf-bgj
minify
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=31536000
cf-ray
50fdcee7da798c8c-VIE
expires
Tue, 01 Sep 2020 07:35:36 GMT
pubads_impl_2019082901.js
securepubads.g.doubleclick.net/gpt/
0
0

ads
googleads.g.doubleclick.net/pagead/ Frame 1F6B
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1567409736&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1567409736764&bpp=8&bdt=15655&fdt=140&idt=140&shv=r20190826&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=5753146474377&frm=20&pv=1&ga_vid=1531852183.1567409737&ga_sid=1567409737&ga_hid=92470518&ga_fc=0&iag=0&icsg=2392550363165600&dssz=57&mdo=0&mso=0&u_tz=120&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=0&ady=0&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335&oid=3&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&osw_key=4077977667&ifi=1&uci=a!1&fsb=1&dtd=144
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190826/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81d::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1567409736&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1567409736764&bpp=8&bdt=15655&fdt=140&idt=140&shv=r20190826&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=5753146474377&frm=20&pv=1&ga_vid=1531852183.1567409737&ga_sid=1567409737&ga_hid=92470518&ga_fc=0&iag=0&icsg=2392550363165600&dssz=57&mdo=0&mso=0&u_tz=120&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=0&ady=0&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335&oid=3&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&osw_key=4077977667&ifi=1&uci=a!1&fsb=1&dtd=144
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
date
Mon, 02 Sep 2019 07:35:36 GMT
server
cafe
content-length
0
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Mon, 02-Sep-2019 07:50:36 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43,39",quic=":443"; ma=2592000; v="46,43,39"
expires
Mon, 02 Sep 2019 07:35:36 GMT
cache-control
private
videojs-02e1d46d.min.js
videos.giga.de/dist/js/embed/bundle/ Frame 3442
618 KB
206 KB
Script
General
Full URL
https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
5aeb54f6727af87431148b611f64c2d9608b22f49b71cd313f5e023b0f6ee642

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 02 Sep 2019 07:35:36 GMT
content-encoding
gzip
last-modified
Tue, 27 Aug 2019 09:58:54 GMT
server
nginx/1.14.1
etag
W/"5d64fede-9a957"
content-type
application/javascript
status
200
cache-control
max-age=315360000
expires
Thu, 31 Dec 2037 23:55:55 GMT
ima3.js
imasdk.googleapis.com/js/sdkloader/ Frame 3442
255 KB
86 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81f::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
fa97084fbdeb9baa97595c2384e52cae2b6d4470fdc5855c9422555da29db2d8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 02 Sep 2019 07:35:36 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,39"
content-length
88150
x-xss-protection
0
expires
Mon, 02 Sep 2019 07:35:36 GMT
Cookie set iu3
aax-eu.amazon-adsystem.com/s/ Frame 248B
Redirect Chain
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
0
0
Document
General
Full URL
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.94.216.48 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash

Request headers

Host
aax-eu.amazon-adsystem.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
ad-id=Aw1tMRfHzUinl6c0RRCKbKU|t
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

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

Redirect headers

Server
Server
Date
Mon, 02 Sep 2019 07:35:41 GMT
Content-Length
0
Connection
keep-alive
Cache-Control
max-age=0, no-cache, no-store, private, must-revalidate, s-maxage=0
Pragma
no-cache
Expires
Thu, 01 Jan 1970 00:00:00 GMT
p3p
policyref="https://www.amazon.com/w3c/p3p.xml", CP="PSAo PSDo OUR SAM OTR DSP COR"
Location
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
Set-Cookie
ad-id=Aw1tMRfHzUinl6c0RRCKbKU|t; Domain=.amazon-adsystem.com; Expires=Wed, 01-Apr-2020 07:35:41 GMT; Path=/; HttpOnly
Vary
User-Agent
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame 3442
53 KB
15 KB
Stylesheet
General
Full URL
https://videos.giga.de/dist/css/videojs-f50f7a8d.css
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 02 Sep 2019 07:35:36 GMT
content-encoding
gzip
last-modified
Tue, 27 Aug 2019 09:58:54 GMT
server
nginx/1.14.1
etag
W/"5d64fede-d280"
content-type
text/css
status
200
cache-control
max-age=315360000
expires
Thu, 31 Dec 2037 23:55:55 GMT
play_button.svg
videos.giga.de/image/ Frame 3442
1015 B
1 KB
Image
General
Full URL
https://videos.giga.de/image/play_button.svg
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/176875?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 02 Sep 2019 07:35:36 GMT
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
"5d1db79a-3f7"
content-type
image/svg+xml
status
200
cache-control
max-age=7776000
accept-ranges
bytes
content-length
1015
expires
Sun, 01 Dec 2019 07:35:36 GMT
dkuim.js
dkuim.de/api/js/2/
0
0

platform.js
apis.google.com/js/
43 KB
17 KB
Script
General
Full URL
https://apis.google.com/js/platform.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-59170da966.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:821::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
ESF /
Resource Hash
1a560979c35508f894818e1f68012f0a56d6a6001c5dfb73ffeda325fcbafbeb
Security Headers
Name Value
Strict-Transport-Security max-age=31536000
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-security-policy-report-only
script-src 'report-sample' 'nonce-DJMBfByRwOJnxdNvE4XUEQ' 'unsafe-inline' 'strict-dynamic' https: http: 'unsafe-eval';object-src 'none';base-uri 'self';report-uri /_/cspreport
p3p
CP="This is not a P3P policy! See g.co/p3phelp for more info."
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
x-xss-protection
0
x-ua-compatible
IE=edge, chrome=1
server
ESF
x-frame-options
SAMEORIGIN
etag
"ce8f41226b511978bd0b369f1ffcc6fc"
strict-transport-security
max-age=31536000
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
private, max-age=1800, stale-while-revalidate=1800
timing-allow-origin
*
expires
Mon, 02 Sep 2019 07:35:36 GMT
loader.js
cdn.taboola.com/libtrc/stroeer-smb-giga/
0
0

collect
www.google-analytics.com/
35 B
99 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=92470518&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&ec=Affiliate&ea=embed&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=765572545.1567409733&tid=UA-204785-4&_gid=1390192888.1567409733&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm75=1&z=2073213922
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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
Thu, 22 Aug 2019 11:44:46 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
935450
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=92470518&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&ec=Affiliate&ea=embed&el=Paypal-Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=765572545.1567409733&tid=UA-204785-4&_gid=1390192888.1567409733&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cm75=1&z=523749331
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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
Thu, 22 Aug 2019 11:44:46 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
935450
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=92470518&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&ec=Affiliate&ea=embed&el=Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=765572545.1567409733&tid=UA-204785-4&_gid=1390192888.1567409733&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cm75=1&z=240680659
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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
Thu, 22 Aug 2019 11:44:46 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
935450
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=92470518&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&ec=Affiliate&ea=embed&el=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEADQ~&jid=&gjid=&cid=765572545.1567409733&tid=UA-204785-4&_gid=1390192888.1567409733&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Image&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cm75=1&z=1291701654
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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
Thu, 22 Aug 2019 11:44:46 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
935450
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=92470518&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Android)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=765572545.1567409733&tid=UA-204785-4&_gid=1390192888.1567409733&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cm75=1&z=1893471934
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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
Thu, 22 Aug 2019 11:44:46 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
935450
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=92470518&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(iOS)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=765572545.1567409733&tid=UA-204785-4&_gid=1390192888.1567409733&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cm75=1&z=1095383247
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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
Thu, 22 Aug 2019 11:44:46 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
935450
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=92470518&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Windows%20Phone)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=765572545.1567409733&tid=UA-204785-4&_gid=1390192888.1567409733&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cm75=1&z=650270919
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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
Thu, 22 Aug 2019 11:44:46 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
935450
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
smb-article-rating-f9506c2d61.min.js
www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/
18 KB
6 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/smb-article-rating-f9506c2d61.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-59170da966.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 20 May 2019 10:19:29 GMT
content-encoding
gzip
x-original-content-length
17937
server
nginx
status
200
etag
W/"5ce27eb5-4611"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
access-control-allow-origin
*
cache-control
max-age=31536000
content-length
6108
expires
Tue, 19 May 2020 10:19:29 GMT
o.gif
go.giga-abs.de/
0
0

jquery.min.js
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
85 KB
30 KB
Script
General
Full URL
https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-59170da966.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 28 Aug 2019 22:54:03 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
376893
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
30306
x-xss-protection
0
last-modified
Fri, 24 Mar 2017 20:55:54 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
public, max-age=31536000, stale-while-revalidate=2592000
accept-ranges
bytes
timing-allow-origin
*
expires
Thu, 27 Aug 2020 22:54:03 GMT
collect
www.google-analytics.com/
35 B
93 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=92470518&t=event&ni=1&_s=10&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&ec=Affiliate&ea=visible&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=765572545.1567409733&tid=UA-204785-4&_gid=1390192888.1567409733&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm76=1&z=1722552043
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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
Thu, 22 Aug 2019 11:44:46 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
935450
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
nativendo.css
c.nativendo.de/cdn/asset/css/
5 KB
1 KB
Stylesheet
General
Full URL
https://c.nativendo.de/cdn/asset/css/nativendo.css?v=1150
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1150
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:ac0d , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:36 GMT
via
1.1 google
cf-cache-status
HIT
age
320792
cf-polished
origSize=5959
status
200
content-encoding
br
alt-svc
clear
cf-bgj
minify
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
text/css;charset=UTF-8
cache-control
public, max-age=31536000
cf-ray
50fdcee83acf8c8c-VIE
expires
Tue, 01 Sep 2020 07:35:36 GMT
bootstrap.min.js
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
36 KB
10 KB
Script
General
Full URL
https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-59170da966.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2001:4de0:ac19::1:b:1b , Netherlands, ASN20446 (HIGHWINDS3 - Highwinds Network Group, Inc., US),
Reverse DNS
Software
/
Resource Hash
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:37 GMT
content-encoding
gzip
last-modified
Wed, 12 Dec 2018 18:33:51 GMT
status
200
etag
"1544639631"
vary
Accept-Encoding
x-cache
HIT
content-type
text/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=31536000
x-hello-human
Say hello back! @getBootstrapCDN on Twitter
accept-ranges
bytes
timing-allow-origin
*
content-length
9832
/
d.nativendo.de/cds/delivery/get/
6 KB
2 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/get/?url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1150
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e0f610ff1a3d52e74a61372c942498977c33131a0f2e3f4eb3916eec567eacbd

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:37 GMT
content-encoding
gzip
last-modified
Mon, 02 Sep 2019 07:35:37 GMT
server
Apache
vary
Accept-Encoding
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
1108
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
native
native.adscale.de/
Redirect Chain
  • https://native.adscale.de/native
  • https://native.adscale.de/native?uu=5b551105b6844b7d94f9655674d82cf5
157 B
595 B
XHR
General
Full URL
https://native.adscale.de/native?uu=5b551105b6844b7d94f9655674d82cf5
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
184.30.220.71 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a184-30-220-71.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
d42e239e3d9534104885e7d6484151b6d9d47dfe2280593dbc2a2fb0a3b39147

Request headers

Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:37 GMT
P3P
CP=NOI PSA OUR
Content-Type
application/json
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Robots-Tag
none
Content-Length
157

Redirect headers

Date
Mon, 02 Sep 2019 07:35:37 GMT
Access-Control-Allow-Origin
https://www.giga.de
P3P
CP=NOI PSA OUR
Location
//native.adscale.de/native?uu=5b551105b6844b7d94f9655674d82cf5
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Robots-Tag
none
Content-Length
0
collect
www.google-analytics.com/
35 B
99 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=92470518&t=event&ni=1&_s=11&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=176875%20--%20so-funktioniert-paypal-hd.mp4%5Bvideojs%2F7.6.0%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=765572545.1567409733&tid=UA-204785-4&_gid=1390192888.1567409733&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.0&cd44=1&cm1=1&z=920548098
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81a::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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
Thu, 22 Aug 2019 11:44:46 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
935451
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43,39"
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/ Frame 3442
30 KB
30 KB
Image
General
Full URL
https://files.giga-video.de/75/ed/96/145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Sat, 31 Aug 2019 08:04:31 GMT
x-content-type-options
nosniff
age
171067
filer-source
ce88ec61ef2b0ae3c6dce1f364e04b3dccdbf411589c67a9af3271f22f2780da
x-cache
HIT
status
200
accept-language
bytes
content-length
30682
x-xss-protection
1; mode=block
last-modified
Sat, 24 Aug 2019 05:59:04 GMT
server
nginx/1.10.3
filer-attr
W1s2NTAsMzY2XSwic3RpLXYzIixbIkZSQS0xIl0sWyJGUkItMSJdXQ==
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Mon, 23 Sep 2019 05:59:04 GMT
ad7920e5-58bf-4910-af0d-82f3d53e78b4
https://videos.giga.de/ Frame 3442
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/ad7920e5-58bf-4910-af0d-82f3d53e78b4
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
BLOB
Security
, ,
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d

Request headers

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

Response headers

Content-Length
31
Content-Type
application/javascript
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 3442
53 B
642 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.72.187 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 02 Sep 2019 07:35:45 GMT
Last-Modified
Mon, 02 Sep 2019 04:46:02 GMT
Server
AmazonS3
x-amz-request-id
9509986B204F04CF
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
s+AXTQcwX5ylXs118lkLbhayw/gDZxvNLRjon9vCy5RwsRxPA1R2S80OPrbN3o8xkRBFSU1FNwY=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 3442
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 02 Sep 2019 07:35:37 GMT
content-encoding
gzip
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
W/"5d1db79a-109"
status
200
access-control-allow-methods
GET
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=900
access-control-allow-headers
accept, content-type
expires
Mon, 02 Sep 2019 07:50:37 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 3442
650 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.35.253.56 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-35-253-56.fra6.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
1710178d2edd4ba651096bc60a9b71a7bbb240ab6c449bb8f3909a68828ad92f

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 02 Sep 2019 07:35:45 GMT
Via
1.1 9810d82af8847b51b9c3048141069a65.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA6-C1
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
650
Last-Modified
Thu, 22 Aug 2019 19:35:49 GMT
Server
AmazonS3
ETag
"5fc4deddff2532151bd956c4931604f7"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
p855Pzy4fDR4DssXvG9F-Pigxd7Ts9qksroFUWiLA1bGQUuKqEo30w==
Expires
0
bf045113-4574-4112-9ca8-0e11949aba15
t.nativendo.de/cds/tracking/event/
0
172 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/bf045113-4574-4112-9ca8-0e11949aba15?aid=182yo&t=data%2Finventory&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1567409737
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1150
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:37 GMT
via
1.1 google
last-modified
Mon, 02 Sep 2019 07:35:37 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
userconnect.js
js.adscale.de/
13 KB
5 KB
Script
General
Full URL
https://js.adscale.de/userconnect.js
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1150
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
r4vkecKNvkz9W5LkG2YUzv.o1RihRnQg
Content-Encoding
gzip
Last-Modified
Wed, 07 Aug 2019 04:31:51 GMT
Server
AmazonS3
x-amz-request-id
1811F191980532F8
ETag
"5378ec64224df70177fba5bf02e1eb95"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Mon, 02 Sep 2019 07:35:37 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4106
x-amz-id-2
YWWCfmlro/dqNp81rXI57qG79Tn6gsr4k7Cc44pfBsh2RXQncUDp2V5hlwDmR9pDDgZKVJu02To=
bf045113-4574-4112-9ca8-0e11949aba15
t.nativendo.de/cds/tracking/event/
0
170 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/bf045113-4574-4112-9ca8-0e11949aba15?aid=182yo&floor=YmYwNDUxMTMtNDU3NC00MZM4jWp-KjFyDwn6aw&cpm=&dsp=1&t[0]=rtb%2Fauction&t[1]=rtb%2Frequest&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1567409738
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1150
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:37 GMT
via
1.1 google
last-modified
Mon, 02 Sep 2019 07:35:37 GMT
server
Apache
p3p
CP="This is not a p3p policy."
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-type
text/javascript; charset=utf8
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
userconnect
ih.adscale.de/
546 B
927 B
Script
General
Full URL
https://ih.adscale.de/userconnect?ssl=1&sid=192243&cbfn=stroeerCoreConnect&ts=1567409737722&umd=false
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
adfa6f7fe5d1ca5b093d2a0738e19be3ca750f0a7d49dbda508aa1e8ecd51842

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:38 GMT
Server
Apache-Coyote/1.1
Content-Type
application/javascript
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
546
Expires
Mon, 02 Sep 2019 07:35:38 GMT
Cookie set map
ih.adscale.de/ Frame CE2C
0
0
Document
General
Full URL
https://ih.adscale.de/map?format=display&ssl=1
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
ih.adscale.de
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
uu=5b9b80613a5a40c7838887f6e34e3961; ng=2#713932860#26123495#41728; tu=4#1924680097#48~8272295eeb1b05c4d3f97d512eabed2c~435391~0~0
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Mon, 02 Sep 2019 07:35:39 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Mon, 02 Sep 2019 07:35:39 GMT
Content-Length
674
Connection
keep-alive
Set-Cookie
tu=4#3198956983#48~8272295eeb1b05c4d3f97d512eabed2c~435391~0~0#101~~435391~435391~1#38~~435391~435391~1#39~~435391~435391~1#40~~435391~435391~1#72~~435391~435391~1#42~~435391~435391~1#75~~435391~435391~1#63~~435391~435391~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None
nuggad
ih.adscale.de/ Frame 9A8A
Redirect Chain
  • https://adscale.nuggad.net/bk?nuggn=1660240041&nuggsid=1029839715&nuggrid=http%3A%2F%2Fwww.giga.de&nuggl=https%3A%2F%2Fih.adscale.de%2Fnuggad%3F%2Fnu%2F0%2Fpre%2F0%2Fsid%2FYmJiY2Mw%2Fuu%2F5b551105b...
  • https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/5b551105b6844b7d94f9655674d82cf5/ts/1567409738900/v/2/hid/406/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-s...
49 B
486 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/5b551105b6844b7d94f9655674d82cf5/ts/1567409738900/v/2/hid/406/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=4&d12=2&d11=0&d4=4&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:42 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
49
Expires
Mon, 02 Sep 2019 07:35:42 GMT

Redirect headers

Date
Mon, 02 Sep 2019 07:35:42 GMT
Server
Apache
Status
302 Found
P3P
CP="NOI DSP COR NID ADMa OTPa OUR NOR"
Location
https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/5b551105b6844b7d94f9655674d82cf5/ts/1567409738900/v/2/hid/406/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=4&d12=2&d11=0&d4=4&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Cache-Control
no-store,no-cache
Transfer-Encoding
chunked
Connection
close
Keep-Alive
timeout=3, max=500
Expires
Wed, 18 Feb 2009 11:53:30 GMT
sync
ap.lijit.com/ Frame 2A91
49 KB
16 KB
Script
General
Full URL
https://ap.lijit.com/sync
Requested by
Host: ap.lijit.com
URL: https://ap.lijit.com/www/delivery/fpi.js?z=600632&width=320&height=50&iv=sf
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.13 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx /
Resource Hash
914ce0bdc766d33c9529e819034ed85923ea0ad35c2b7a7df247795340df0ecc

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:44 GMT
Content-Encoding
gzip
Last-Modified
Wed, 12 Jun 2019 23:43:12 GMT
Server
nginx
ETag
W/"5d018e10-c373"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=86400, must-revalidate
Transfer-Encoding
chunked
X-Sovrn-Pod
ap2ams1
Expires
Tue, 03 Sep 2019 07:35:44 GMT
adcfg
ap.lijit.com/ Frame 2A91
158 B
566 B
Script
General
Full URL
https://ap.lijit.com/adcfg?zoneid=600632&tid=cd84095eda9f458f8d0385eb36606e60b14841a7&mode=1&dmn=www.giga.de
Requested by
Host: ap.lijit.com
URL: https://ap.lijit.com/sync
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.13 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx /
Resource Hash
b239d0824b8b7e496715c699a749b5932581a10e853fbabab377de729255915e

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:44 GMT
Content-Encoding
gzip
Server
nginx
Transfer-Encoding
chunked
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, DELETE, PUT
Content-Type
application/x-javascript
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
X-Sovrn-Pod
ap2ams1
Access-Control-Allow-Headers
X-Requested-With, Content-Type
addelivery
ap.lijit.com/ Frame 2A91
4 KB
2 KB
Script
General
Full URL
https://ap.lijit.com/addelivery?zoneid=600632&tid=m_600632_122ea9eea38649f098c99de19ac4e723&cb=93449824&mode=1&flv=0.0.0&ifr=true&od=www.giga.de&time=07%3A35%3A44&fd=1&be=sf&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&orig_loc=http%3A%2F%2Fhttps%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&abf=true&dpz=false&cv=7a34ad2&dop=0&ndw=1&spif=true&btid=m_600632_122ea9eea38649f098c99de19ac4e723&iv=sf
Requested by
Host: ap.lijit.com
URL: https://ap.lijit.com/sync
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.13 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx /
Resource Hash
f11000893fc389cd3a3a271c39e67cdfeb5252db5368a610a0eec6105f010e62

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:44 GMT
Content-Encoding
gzip
Server
nginx
Transfer-Encoding
chunked
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, DELETE, PUT
Content-Type
application/x-javascript
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
X-Sovrn-Pod
ap2ams1
Access-Control-Allow-Headers
X-Requested-With, Content-Type
sovrn_standalone_beacon.js
ap.lijit.com/www/sovrn_beacon_standalone/ Frame 2A91
4 KB
2 KB
Script
General
Full URL
https://ap.lijit.com/www/sovrn_beacon_standalone/sovrn_standalone_beacon.js?iid=13413818
Requested by
Host: ap.lijit.com
URL: https://ap.lijit.com/sync
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.13 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx /
Resource Hash
5f7c7709d592c7e19dc12152d7adce8a117f08af40a2facd69c19b495c9a1047

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:44 GMT
Content-Encoding
gzip
Last-Modified
Tue, 08 Jan 2019 18:24:08 GMT
Server
nginx
ETag
W/"5c34eac8-fb6"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Type
text/javascript
Cache-Control
max-age=604800, must-revalidate
Transfer-Encoding
chunked
X-Sovrn-Pod
ap2ams1
X-Robots-Tag
noindex
Access-Control-Allow-Headers
DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type
Access-Control-Allow-Credentials
true
Expires
Mon, 09 Sep 2019 07:35:44 GMT
beacon
gslbeacon.lijit.com/ Frame 8BFA
0
0
Document
General
Full URL
https://gslbeacon.lijit.com/beacon?viewId=m_600632_122ea9eea38649f098c99de19ac4e723&rand=4482&informer=13166301&type=fpads&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&v=1.2
Requested by
Host: ap.lijit.com
URL: https://ap.lijit.com/sync
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
216.52.2.19 , United States, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx / raptor
Resource Hash

Request headers

Host
gslbeacon.lijit.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Accept-Encoding
gzip, deflate, br
Cookie
ljt_reader=84e778c11533d0b734f292a1
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/

Response headers

Server
nginx
Date
Mon, 02 Sep 2019 07:35:47 GMT
Content-Type
text/html;charset=utf-8
X-Application-Context
application:prod:9080
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0, s-maxage=0
Pragma
no-cache
Expires
Fri, 20 Mar 2009 00:00:00 GMT
P3P
CP="CUR ADM OUR NOR STA NID"
X-Powered-By
raptor
X-Sovrn-Pod
ap4ams1
containertag
ap.lijit.com/ Frame 2A91
55 KB
7 KB
Script
General
Full URL
https://ap.lijit.com/containertag?containerId=18&zoneId=600632&v=2
Requested by
Host: ap.lijit.com
URL: https://ap.lijit.com/sync
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.251.249.13 Amsterdam, Netherlands, ASN29791 (VOXEL-DOT-NET - Internap Corporation, US),
Reverse DNS
Software
nginx / raptor
Resource Hash
0b9a08c335995135d79f8d1ff8e4e8770695b383123c3d55da3101486523eaad

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:44 GMT
Content-Encoding
gzip
Server
nginx
X-Powered-By
raptor
Vary
Accept-Encoding
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0, s-maxage=0
Transfer-Encoding
chunked
X-Sovrn-Pod
ap2ams1
Content-Type
text/html;charset=utf-8
X-Application-Context
application:prod:9080
Expires
Fri, 20 Mar 2009 00:00:00 GMT
impression
vap2ams1.lijit.com/addelivery/ Frame 2A91
0
0

fp
vap2ams1.lijit.com/data/ Frame 2A91
0
0

tag.aspx
ml314.com/ Frame 2A91
26 KB
12 KB
Script
General
Full URL
https://ml314.com/tag.aspx?28
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.31.106.135 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-31-106-135.eu-west-1.compute.amazonaws.com
Software
Microsoft-IIS/10.0 / ASP.NET
Resource Hash
7d655e8cd62ba58d86b3bc9c8e1e04a76506a4dfc852c3b3813deb0aef284548

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:47 GMT
Content-Encoding
gzip
Last-Modified
Mon, 02 Sep 2019 04:43:20 GMT
Server
Microsoft-IIS/10.0
X-AspNet-Version
4.0.30319
X-Powered-By
ASP.NET
Vary
Accept-Encoding
Content-Type
application/javascript; charset=utf-8
Cache-Control
public, max-age=76052
Connection
keep-alive
Content-Length
11933
Expires
Tue, 03 Sep 2019 04:43:20 GMT
ids.js
cdn.tynt.com/
0
0

sovrn
pd.sharethis.com/pd/ Frame 2A91
0
137 B
Script
General
Full URL
https://pd.sharethis.com/pd/sovrn
Requested by
Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.196.83.183 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-196-83-183.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Sec-Fetch-Mode
no-cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:35:48 GMT
Connection
keep-alive
Content-Length
0
Content-Type
application/javascript
pixel
ps.eyeota.net/ Frame 2A91
0
0

merge
ce.lijit.com/ Frame 2A91
0
0

pv=y
bcp.crwdcntrl.net/5/c=5436/tp=SVRN/tpid=84e778c11533d0b734f292a1/ Frame 2A91
0
0

log
segments.company-target.com/ Frame 2A91
0
0

/
p.adsymptotic.com/d/px/ Frame 2A91
0
0

collect
dx.bigsea.weborama.com/ Frame 2A91
0
0

ct
ap.lijit.com/data/ Frame 2A91
0
0

submit
lb70.s400.meetrics.net/bb-mx/
0
0

data
lb70.s400.meetrics.net/
0
0

hd-main.js
hgc-cf-cache-1.svonm.com/ Frame 3442
200 KB
58 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=rUpVvvPnvN
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-02e1d46d.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.35.253.56 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-35-253-56.fra6.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
6f84c66aac41915f2aee979a975e75ab954663a9ece27924bfab7c8aa4f2fdb5

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 02 Sep 2019 07:35:22 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
66
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Thu, 29 Aug 2019 11:41:37 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 9810d82af8847b51b9c3048141069a65.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Pop
FRA6-C1
X-Amz-Cf-Id
FOhpEMfKiy0Anu4EE3b6BJkLyeX-XLjthXW6GFUCocgOIjdmDjxt9A==
truncated
/ Frame 3442
200 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
6f84c66aac41915f2aee979a975e75ab954663a9ece27924bfab7c8aa4f2fdb5

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
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 3442
53 B
642 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=4361449824
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9ib29waGFleGVpRmlOZ2k9T2Jvb3BoYWV4ZWlGaU5naXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3kuTGV8fCh5LkxlPTApO3kuTGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5MZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5UYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5kZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuWmUoYyk7YS5odChsKTthLmd0KG0pO2EuVnMoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkRiLmxlbmd0aCl7dmFyIGE9bC5EYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5udCh7IltMT0FEU0NSSVBUXSI6ZS5lYSgxMCksIltVVElMU10iOmUuZWEoMTApLCJbQ0FMTEJBQ0tdIjplLmVhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5YZy5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtxKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuWGcoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY3A9dGhpcy5hWzZdO3RoaXMuTHI9dGhpcy5hWzFdO3RoaXMuUWk9dGhpcy5hWzEwXTt0aGlzLkJ0PXRoaXMuYVs5XTt0aGlzLkNqPXRoaXMuYVs1XTt0aGlzLmdyPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuWGo9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmNwOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Mcjp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWk6dGhpcy5BdChhKX0sQXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJ0OnRoaXMuQmooYSl9LEJqOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuQ2o6dGhpcy5mcihhKX0sZnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaWE9Yy5Yanx8aWEsbGM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bGMuYnAoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW49ITE7dGhpcy5QYT0ic2V0dXAiO3RoaXMuSGM9W107dGhpcy5lZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkRzLmJpbmQodGhpcykpO3RoaXMuZmI9e307dGhpcy5GZz17fX1jLmprPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmZiKXRoaXMuZmIuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMuZmJbYl0rCiJfIik7cmV0dXJuIGF9LGdiOmZ1bmN0aW9uKGEpe3RoaXMuZmJbYV18fCh0aGlzLmZiW2FdPTApO3RoaXMuZmJbYV0rPTE7NTx0aGlzLmZiW2FdJiYhdGhpcy5GZ1thXSYmKHRoaXMuRmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5JdCgpLCEwKSl9LGVlOmZ1bmN0aW9uKCl7dGhpcy5hYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGZuOmZ1bmN0aW9uKGEpe3RoaXMuYWEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmCmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxrYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sRHM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuQ3MoYS5kYXRhKX0sQ3M6ZnVuY3Rpb24oYSl7aWYodGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYWEmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lciYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxYZDpmdW5jdGlvbihhLGIpe3RoaXMuYWEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxlZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnlwKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5XZyhhLAoiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LHlwOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LGRuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMuamEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09CmIpe2lmKGUubXAoYSkpcmV0dXJuOyhiPXRoaXMuZWcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmFhLnVybHNbYV09Yjt0aGlzLmFhLnVybHNbYl09YTt0aGlzLmFhLmhvbWFkVXJsc1thXT1iO3RoaXMuYWEub3JpZ2luYWxVcmxzW2JdPWF9fSxtcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5hYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxtZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLm9yaWdpbmFsVXJscyYmdGhpcy5hYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYWEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxBcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxvZTpmdW5jdGlvbihhKXtpZighYXx8CiJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sQWg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sT2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sd2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYKKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LHhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMud2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGUoYSl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOgoxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxxZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLApuLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEs9MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxwLG0sdSx4LHE7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7cD1hLmxlbmd0aDt2YXIgdD1bXTtmb3IoZj0wO2Y8cC0zO2YrPTQpbj1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx0LnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih0LnB1c2goZik7MTQhPXQubGVuZ3RoJQoxNjspdC5wdXNoKDApO3QucHVzaChwPj4+MjkpO3QucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx0Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXRbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO249ZTtwPWc7bT1rO3U9Szt4PWw7Zm9yKGY9MDsxOT49ZjtmKyspcT1kKG4sNSkrKHAmbXx+cCZ1KSt4K2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHg9dSx1PW0sbT1kKHAsMzApLHA9bixuPXE7Zm9yKGY9MjA7Mzk+PWY7ZisrKXE9ZChuLDUpKyhwXm1edSkreCtjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx4PXUsdT1tLG09ZChwLDMwKSxwPW4sbj1xO2ZvcihmPTQwOzU5Pj1mO2YrKylxPWQobiw1KSsocCZtfHAmdXxtJnUpK3grY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUseD11LHU9bSxtPWQocCwzMCkscD1uLG49cTtmb3IoZj02MDs3OT49ZjtmKyspcT1kKG4sNSkrKHBebV4KdSkreCtjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx4PXUsdT1tLG09ZChwLDMwKSxwPW4sbj1xO2U9ZStuJjQyOTQ5NjcyOTU7Zz1nK3AmNDI5NDk2NzI5NTtrPWsrbSY0Mjk0OTY3Mjk1O0s9Syt1JjQyOTQ5NjcyOTU7bD1sK3gmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihLKStiKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLG4sYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxuPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8bj4+NixnPW4mNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKG4pJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0seHE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxxYzpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLG49ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTGI/ITA6CiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhLGw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LHRwOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5xYygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOgpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxoYjpmdW5jdGlvbigpe3ZhciBhPXtNaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxlajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxYcDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx5bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sClBuOmZ1bmN0aW9uKCl7cmV0dXJuIGEuTWkoKXx8YS5laigpfHxhLlhwKCl8fGEubGwoKXx8YS55bSgpfX07cmV0dXJuIGEuUG4oKX0samE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxuPWEubGVuZ3RoO2Y8bjsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxRYjpmdW5jdGlvbihhKXthPXRoaXMuamEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSx5YTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LElwOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LApiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLmphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sd286ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxuPTA7bjxiLmxlbmd0aDtuKyspZFtiW25dXT0hMDtmb3Iobj0wO248YS5sZW5ndGg7bisrKWRbYVtuXV18fGYucHVzaChhW25dKTtyZXR1cm4gZn0sRXQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxxZzpmdW5jdGlvbihhKXthPQpNYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLk9oKGIpKyI6Iit0aGlzLk9oKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sWWU6ZnVuY3Rpb24oYSl7dGhpcy5QYT1hfSxvZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLlBhO3RoaXMuUGYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LHNjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5vZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSwKYixkLGYsbixjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5TYShiLGQpKTtiJiYoQj1rLlNhKGEsYikpO2YmJihCPWsuU2EoQixmKSk7biYmKEI9ay5TYShCLG4pKTtjJiYoQj1rLlNhKEIsYykpO2cmJihCPWsuU2EoQixjKSk7ZS5zYyhCKX0sRnM6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlJiYxMDIzIT1hLmNvZGUmJjEwMTghPWEuY29kZSl7dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuSXAoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0KMjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn19LFBmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRnMoYSk7aWYoYilpZighbHx8IWwuWCl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuQmQoKTtsLndhKGEsITApO2E9bC53YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLklhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwKIWwuWCl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9YStiO3RoaXMuSmN8fCh0aGlzLkpjPXt9KTt0aGlzLkpjW2ZdfHwodGhpcy5KY1tmXT0wKTt0aGlzLkpjW2ZdKys7MTA8dGhpcy5KY1tmXXx8KGY9bC5CZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC53YShmLCEwKSxmPWwud2EoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPQohMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSkpfX0sRWU6ZnVuY3Rpb24oKXtsJiZsLlg/bC5pc0VuYWJsZWQmJmwuYm8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWUoKX0uYmluZCh0aGlzKSw1MDApfSxtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHBlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIn0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFRmOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi56ZShhKXx8dGhpcy5BcShhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LldlJiZ3aW5kb3cuc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LldlWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LldlWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLm1nKGEpKXJldHVybiB0aGlzLm1nKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9OwpuLmhvbWFkX3VybF9zdWZmaXg9YTtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYSk7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlRhKGEsYi5HYSxuLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5zZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5kbihjLGEpO3JldHVybiBjfSwKVGE6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZSxnKXt2YXIgaz1jfHxsO2M9ITA7ZyYmKGM9ITEpO2lmKGsmJmsuWClpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe24obSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKW4oKTtlbHNle2sud2EoYSxjKTtjPWsud2EoYSxjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWMuZGF0YVtxXT1kW3FdO3JldHVybiBrLklhKGMsZixuLCIiLCIiLGUpfX1lbHNlIG4oKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYShhLGIsZCxmLG4sayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LFdnOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7CmQ9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocSl7YyYmYygpfXJldHVybiBsfSxicjpmdW5jdGlvbihhLGIsZCl7dGhpcy5XZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5IYylmb3IodmFyIGMgaW4gdGhpcy5IYylhPWEuc3BsaXQoYykuam9pbih0aGlzLkhjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucmIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxYZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLlRhKGEsZi5HYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuYnIoZi5zZCgpLnJlcGxhY2UoIltoYXNoXSIsCmEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkhjPWF9LGV2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5UYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsCm1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxRbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sdnE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlNhPQpmdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IudnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IudXI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVnU9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5Ubz17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmF2PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTmY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuR2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTsKYi5LZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuWG09e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuSWY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5DdT17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudHI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVW89e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLld1PQp7Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5iZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLm9vPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLmRkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5NZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuWm09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlJjPQp7Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuVWQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuV2Q9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLlltPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5WaD17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLkFyPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudmQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IubGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuVXU9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuenU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi52cj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5pa3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbOV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5Jaj10aGlzLmFbOV07CnRoaXMubW49dGhpcy5hWzRdO3RoaXMuVmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOF19Yy5Uaz1iO2IucHJvdG90eXBlPXtSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU286dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhpOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kdTp0aGlzLkhqKGEpfSxIajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSWo6dGhpcy5sbihhKX0sbG46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1uOnRoaXMuVWwoYSl9LFVsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5WbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVGt8fGthLG1jPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1tYy5Sbyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtrPWI7Yi5wcm90b3R5cGU9e3FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxzYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5tZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm1kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0seGM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5xZSh0aGlzLnNiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhjKCkrIjIifSxMZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnFlKHRoaXMuQ3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5tZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ra3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DbT10aGlzLmFbNF07dGhpcy5waj10aGlzLmFbNF07dGhpcy5UcD10aGlzLmFbN107dGhpcy5IcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5Taz1iO2IucHJvdG90eXBlPXtCbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ206dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5wajp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHA6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLlNrfHxsYSxuYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1uYy5CbSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubTt0aGlzLm09ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm09aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuaGo9Yn0pKGMpO3ZhciBMPWMuaGp8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubW09dGhpcy5hWzNdO3RoaXMuZ2s9dGhpcy5hWzhdO3RoaXMuZXM9dGhpcy5hWzJdO3RoaXMuVGw9dGhpcy5hWzldO3RoaXMuRG89dGhpcy5hWzldO3RoaXMuc3U9dGhpcy5hWzJdOwp0aGlzLkprPXRoaXMuYVs2XTt0aGlzLmtuPXRoaXMuYVs4XTt0aGlzLmdtPXRoaXMuYVsxXTt0aGlzLllyPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuSnI9YjtiLnByb3RvdHlwZT17bG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nazp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZXM6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5UbDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRG86dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnN1OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua246dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5nbTp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYT1jLkpyfHxtYSxvYz1uZXcgbWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1vYy5sbSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLnhsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuSmE9e307dGhpcy5LPW51bGw7dGhpcy5DYz0xMDA7dGhpcy5DYj0wO3RoaXMuUWE9MTUwO3RoaXMuRmI9MDt0aGlzLml0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5DYjw9dGhpcy5RYT8odGhpcy5DYisrLHRoaXMuRmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5DYykpOjA+dGhpcy5RYSYmKHRoaXMuRmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCnRoaXMuQ2MpKX0sWHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYj50aGlzLlFhPyEwOiExfSxWZTpmdW5jdGlvbigpe3RoaXMuQ2I9MH0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGl0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxBcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LFA6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLk8oKSwhMCk7dGhpcy5KYVtiLnNiKCldPWI7TSYmTS5UZyYmTS5IdChiKX0sQXY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5vZSh0aGlzLkphKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkphW2Iuc2IoKV0/ITA6ITF9LHdxOmZ1bmN0aW9uKGIpe2I9Yi5GYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkphKWlmKGIuaWQ9PXRoaXMuSmFbYV0uRmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sT3Y6ZnVuY3Rpb24oYil7dGhpcy5KYVtiLmlkXT0KbnVsbH19KX0pKGMpO3ZhciB0PWMueGx8fHQ7KGZ1bmN0aW9uKGMpe2Muemw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5DYz0xMDt0aGlzLkNiPTA7dGhpcy5RYT01MDt0aGlzLlY9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy53Yj0iIjt0aGlzLmdnPSExO3RoaXMuUygpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuRmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sS2E6ZnVuY3Rpb24oKXt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxCdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LGx0OmZ1bmN0aW9uKGIpe3RoaXMuSGU9CmJ9LHp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGV9LEdlOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5DYjw9dGhpcy5RYSYmKHRoaXMuQ2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSx0aGlzLkNjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LAp0ZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxzYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LFF2OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlJwKCl8fHRoaXMuJG0oKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sQ3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sJG06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sUnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09CnR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxSYTpmdW5jdGlvbigpe3JldHVybiExfSxKdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxuYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LERjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmCmIubXV0ZWQ/Yi5tdXRlZDohMX0sQmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdmg6ZnVuY3Rpb24oYil7dGhpcy53Yj1ifSx5djpmdW5jdGlvbigpe3JldHVybiB0aGlzLndifSxyaDpmdW5jdGlvbigpe3RoaXMud2I9bnVsbH0sRXY6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLndiJiYoYj0hMCk7cmV0dXJuIGJ9LEx2OmZ1bmN0aW9uKCl7dGhpcy5nZ3x8KHRoaXMuZ2c9ITApfSxsZTpmdW5jdGlvbigpe3JldHVybiExfSx2djpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHI9Yy56bHx8cjsoZnVuY3Rpb24oYyl7Yy5laT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLkNmPSIxIjt0aGlzLkRmPSIyIjt0aGlzLlVtPSIzIjt0aGlzLk1jPTA7dGhpcy4kZz0zMDt0aGlzLkpiPVtdO3RoaXMuWmE9W107CnRoaXMuZWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuUWY9dGhpcy5SaD0hMTt0aGlzLnN0YXR1cz10aGlzLk1jO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy5aZShiKTt0aGlzLmp0KGEpfSxnOmZ1bmN0aW9uKCl7fSxxYTpmdW5jdGlvbigpe3RoaXMuUmh8fCh0aGlzLlJoPSEwLGUuRWUoKSl9LEtlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5PKCk7UyYmUy5TYiYmIW5hJiYobmE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sSTpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtyZXR1cm4gdGhpcy5yYSgpPyExOih0aGlzLm90KCksdGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCksdGhpcy5LaCgpLHRoaXMuUWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLnJhKCl8fCh0aGlzLkpiLnB1c2goYiksCnRoaXMuWmEucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LEtoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5KYiYmMDx0aGlzLkpiLmxlbmd0aCYmKHRoaXMuSmI9ZS51bmlxdWUodGhpcy5KYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuSmIuam9pbigiLCIpKSk7aWYodGhpcy5aYSl7Zm9yKHZhciBoPTA7aDx0aGlzLlphLmxlbmd0aDtoKyspdGhpcy5lY1t0aGlzLlphW2hdLnJlYXNvbl09PXRoaXMuZWNbYl0mJmEucHVzaCh0aGlzLlphW2hdLmRldGFpbCksdGhpcy5lY1t0aGlzLlphW2hdLnJlYXNvbl08dGhpcy5lY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuWmFbaF0uZGV0YWlsKSxiPXRoaXMuWmFbaF0ucmVhc29uKTt0aGlzLmVjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sRHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZn0sCnc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNmfSxvdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGZ9LHB0OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5VbX0scGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1jfSxIZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5DZn0sbHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRGZ9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLk1jfSxaZTpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGp0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxBcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LGVyOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5laXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuWmo9dGhpcy5hWzJdO3RoaXMuWm89dGhpcy5hWzddO3RoaXMuTG89dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNV19Yy5obD1iO2IucHJvdG90eXBlPXtZajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWmo6dGhpcy5ZbyhhKX0sWW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpvOnRoaXMuS28oYSl9LEtvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Mbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9hPWMuaGx8fG9hLHBjPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBjLllqKDQpOyhmdW5jdGlvbihjKXtjLk1qPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7CnRoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBwYT1jLk1qfHxwYTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIubXY7YT9hLmxhP2EubGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYKKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnFhKCkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMubygiZnJhbWV3b3JrIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcWE9Yy5Oanx8cWE7KGZ1bmN0aW9uKGMpe2MuT2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBwYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IHFhKGIsdGhpcy5LKSkuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciByYT1jLk9qfHxyYTsobmV3IHJhKHEpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHM9dGhpcy5hWzddO3RoaXMua2k9dGhpcy5hWzFdO3RoaXMuTXQ9dGhpcy5hWzFdO3RoaXMueWo9dGhpcy5hWzFdO3RoaXMuRHE9dGhpcy5hWzldO3RoaXMuem89dGhpcy5hWzJdO3RoaXMubWo9dGhpcy5hWzJdO3RoaXMuRnI9dGhpcy5hWzRdO3RoaXMuSHM9dGhpcy5hWzVdOwp0aGlzLmo9dGhpcy5hWzddfWMuSm89YjtiLnByb3RvdHlwZT17a3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxzOnRoaXMuamkoYSl9LGppOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5raTp0aGlzLkx0KGEpfSxMdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTXQ6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlqOnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EcTp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem86dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1qOnRoaXMuRXIoYSl9LEVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gcjp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBzYT1jLkpvfHwKc2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMua3MoNCk7KGZ1bmN0aW9uKGMpe2Mudms9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5UYj0hMTt0aGlzLmxnKCk7dGhpcy5uZygpO3RoaXMubm89ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5UYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuVGI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuWShiKX0sbmc6ZnVuY3Rpb24oKXtpZighdGhpcy5UYil7dmFyIGI9dGhpcy5GYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fCh0aGlzLlRiPSEwKTt0aGlzLlooYSl9fSxLYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sCkdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLkhlJiYoMCx0aGlzLkhlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fAoicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmCihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMudmt8fHRhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NYzt0aGlzLmlzUGxheWluZz10aGlzLk9jPSExO3RoaXMuVmQ9MTt0aGlzLlBjPVtdO3RoaXMucGI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLk9jPSExO3RoaXMuVmQ9MTt0aGlzLlBjPVtdO3RoaXMucGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmCih0aGlzLlZkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5wYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMucGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMucGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnBiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5PYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuS2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLiRnJiYhdGhpcy5yYSgpJiYodGhpcy5wYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnJhKCkmJih0aGlzLnBhKCksdGhpcy5nZXRQbGF5ZXIoKS5ubz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkud2I7YSYmKGEueGQoKSxhLmZkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLk9jPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5LZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpOwppZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuJGcmJiF0aGlzLnJhKCkmJih0aGlzLnBiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5QYy5pbmRleE9mKGEpJiZ0aGlzLlBjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucWEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOgoodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuUGMubGVuZ3RoPj10aGlzLlZkJiZ0aGlzLnMoKSl9LGVyOmZ1bmN0aW9uKGIpe3RoaXMubSgiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMuaWU/dGhpcy5pZSsrOnRoaXMuaWU9MTp0aGlzLmhlP3RoaXMuaGUrKzp0aGlzLmhlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkFoKGEudmlkZW9UYWcpP2EuVGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5PY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuaGU+dGhpcy5pZSYmKGI9ITEpLHRoaXMuSShiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksNTApOihhLmxnKCksYS5uZygpLGEuVGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdWE9Yy51a3x8dWE7KGZ1bmN0aW9uKGMpe2Mud2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWUuamEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMud3AoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPQpbXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyB0YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy53cShoKXx8KHRoaXMuUChoKSxoPW5ldyB1YShoLHRoaXMuSyksaC5TKCksaC5nKCkpfX10aGlzLlIoKX19LHh2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHdwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5qYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5yYihiLmFuY2hvcil9fSl9KShjKTt2YXIgdmE9Yy53a3x8dmEsd2E9bmV3IHZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdqPQp0aGlzLmFbOF07dGhpcy5mdT10aGlzLmFbMTBdO3RoaXMuUnI9dGhpcy5hWzRdO3RoaXMueHM9dGhpcy5hWzhdO3RoaXMuRms9dGhpcy5hWzddO3RoaXMuU2k9dGhpcy5hWzddO3RoaXMubmw9dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzEwXTt0aGlzLmFrPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzFdfWMuc3M9YjtiLnByb3RvdHlwZT17Zmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdqOnRoaXMuZXUoYSl9LGV1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Gazp0aGlzLlJpKGEpfSxSaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuU2k6dGhpcy5tbChhKX0sbWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5ubDp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFrOnRoaXMuVm4oYSl9LFZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHhhPWMuc3N8fHhhLHJjPW5ldyB4YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJjLmZqKDQpOyhmdW5jdGlvbihjKXtjLnJtPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlkoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5uYSgpKTp0aGlzLm5hKCl9ZWxzZSB0aGlzLm5hKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlYmJnRoaXMuVigpfSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sUmE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MucW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYiwKYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuY2E9dGhpcy53Yz10aGlzLnhhPXRoaXMuV2M9ITE7dGhpcy5vaD1lLkJiKDEwKTt0aGlzLlFoPSEwO3RoaXMuamM9dGhpcy5JZz0hMTt0aGlzLnNyKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5kaCgpLHRoaXMuWm4oKSx0aGlzLmpiKCkpfSxzcjpmdW5jdGlvbihiKXtyZXR1cm4gZS55YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxNdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuc2IoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuVywiOyIsdHlwZW9mIGIuVywiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5XP2IuVy5zdGF0ZToKInVuZGVmaW5lZFgiLCI7IixiLlc/dHlwZW9mIGIuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuRGE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuRGE6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5EYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5EYT9iLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkRhP3R5cGVvZiBiLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5EYT9iLkouRGEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkRhP3R5cGVvZiBiLkouRGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlNkOiJ1bmRlZmluZWRYIiwKIjsiLGIuSj90eXBlb2YgYi5KLlNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuVGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuVGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5UZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLmxhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmxhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmxhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoubGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLllkOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWWQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLm9oKX0sdGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFBiOmZ1bmN0aW9uKCl7aWYoIXRoaXMubGEpe3ZhciBiPXRoaXMudGIoKTsKYiYmKGIuYWRzTG9hZGVyJiYodGhpcy5sYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5sYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5sYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5sYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5sYX0sd2c6ZnVuY3Rpb24oKXtpZighdGhpcy53Yyl7dmFyIGI9dGhpcy50YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLndjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy53Yz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLndjfSx1cTpmdW5jdGlvbigpe2lmKCF0aGlzLkhnKXt2YXIgYj10aGlzLnRiKCksYT10aGlzLnRxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5IZz0hMCl9cmV0dXJuIHRoaXMuSGd9LAp0cTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuV2MmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLldjPSEwKTtyZXR1cm4gdGhpcy5XY30samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlBiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuU3MoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMucmEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qYigpfS5iaW5kKHRoaXMpLDIwKX0sU3M6ZnVuY3Rpb24oKXt0aGlzLmpjPSEwO3ZhciBiPXRoaXMud2coKTtpZihifHx0aGlzLnJhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsCmZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLmhiKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMua2M9ITA7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5rYz0hMDtpZihlLnlhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMua2M9ITA7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMua2M9ITA7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMua2M9ITA7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmtjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuZmEoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpiKCl9LmJpbmQodGhpcyksMjApfSx3djpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuZGcmJmIuYWRzJiYodGhpcy5kZz1iLmFkcyk7cmV0dXJuIHRoaXMuZGd9LFpuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYSgpO3RoaXMuZmEoITApO3RoaXMubygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5YKWhvbWFkVXRpbHMuSGEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMud2coKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMudXEoKSl7dmFyIGE9dGhpcy50YigpLGg9dGhpcy5QYigpO2EmJmgmJih0aGlzLnRiKCksdGhpcy5QYigpLHRoaXMuamN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qYz90aGlzLncoKToodGhpcy5mYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMudGIoKX1lbHNlIHRoaXMuSWc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnRiKCksYj10aGlzLlBiKCk7YSYmIWI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwKMTAwKTp0aGlzLklnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5yYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGgoKX0uYmluZCh0aGlzKSw1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTticmVha319LCRuOmZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLm5jIT1iLmFkcy5zdGF0ZSYmKHRoaXMubmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMubmMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5uYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJG4oKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2F9LApBYTpmdW5jdGlvbigpezA8PWUuUWIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuVD8odGhpcy5jYT0hMCx0aGlzLnMoITApKToodGhpcy5jYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jYT8odGhpcy53KCksdGhpcy5xYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLnJhKCl8fChifHwodGhpcy5RaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkkodGhpcy5RaCxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZm86ZnVuY3Rpb24oKXt0aGlzLkZ2fHwoMTA8dGhpcy5IdT8odGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5IdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLldzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZvKCl9LmJpbmQodGhpcyksNTApKSl9LFdzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLkl1KXt0aGlzLkl1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSwKNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHphPWMucW18fHphOyhmdW5jdGlvbihjKXtjLnNtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLkJoKHdpbmRvdyk7CmZvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuQmgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuUigpfX0sQmg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5vZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB5YShiW2hdKSxhLm9hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUChhKSwobmV3IHphKGEsdGhpcy5LKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFI6ZnVuY3Rpb24oKXt0aGlzLkZiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuQ2MpfX0pfSkoYyk7dmFyIEFhPWMuc218fEFhLEJhPW5ldyBBYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGk9dGhpcy5hWzhdO3RoaXMuVHE9dGhpcy5hWzEwXTt0aGlzLldqPXRoaXMuYVsyXTt0aGlzLkhsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzFdfWMuZHY9YjtiLnByb3RvdHlwZT17d2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhpOnRoaXMuU3EoYSl9LFNxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5UcTp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuV2o6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQ2E9Yy5kdnx8Q2Esc2M9bmV3IENhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2Mud2koNCk7CihmdW5jdGlvbihjKXtjLnJsPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuTWU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLm5hKCk7cmV0dXJufXRoaXMuWShhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMubmEoKX0sQXM6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy53YixoPXRoaXMuc2IoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuU2ImJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fAoodGhpcy5NZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LFJhOmZ1bmN0aW9uKCl7dGhpcy5NZSsrO2lmKDEwPHRoaXMuTWUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJgp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTpiLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmlmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxLYTpmdW5jdGlvbigpe30sSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX19KX0pKGMpO3ZhciBEYT1jLnJsfHxEYTsoZnVuY3Rpb24oYyl7Yy5xbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLmtlKWlmKHRoaXMueGJ8fCh0aGlzLnhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJgp0aGlzLnhiKyssMTU8dGhpcy54Yil0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLmtlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmNhfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlQpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGEoKX0uYmluZCh0aGlzKSwxMCk7CmVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5UPXRoaXMuVHx8ITE7dGhpcy54YSgpO3ZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuYXA/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnBhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnBhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5wYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy5hcD0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihhKXtiLkFzKGEpfS5iaW5kKHRoaXMpKSk6Yi5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuSShiKX19KX0pKGMpO3ZhciBFYT1jLnFsfHxFYTsoZnVuY3Rpb24oYyl7Yy5zbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlFhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJgowPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IERhKGJbYV0pO2gub2F8fHRoaXMuTihoKXx8KHRoaXMuUChoKSwobmV3IEVhKGgsdGhpcy5LKSkuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBGYT0KYy5zbHx8RmEsR2E9bmV3IEZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRsPXRoaXMuYVsxXTt0aGlzLkFqPXRoaXMuYVsyXTt0aGlzLm1xPXRoaXMuYVs4XTt0aGlzLnhyPXRoaXMuYVsxXTt0aGlzLmJtPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzhdfWMuU3I9YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRsOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bajp0aGlzLmxxKGEpfSxscTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1xOnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHI6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9CmMuU3J8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLlpsKDQpOyhmdW5jdGlvbihjKXtjLnNrPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLnVnKGIsImVsZW1lbnRJRCIpO3RoaXMuamg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT0KdGhpcy5qaD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5qaD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5sZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmxkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZW86ZnVuY3Rpb24oKXtlLk9nKHRoaXMubGQpO2Uud2UodGhpcy5sZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5za3x8SWE7KGZ1bmN0aW9uKGMpe2Mucms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTsKdGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLnJrfHxKYTsoZnVuY3Rpb24oYyl7Yy50az10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlFhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS51ZyhiLCJlbGVtZW50SUQiKTtlLk9nKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkZiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkZiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLnRrfHxLYSxMYT1uZXcgS2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueWs9dGhpcy5hWzddO3RoaXMuTWw9dGhpcy5hWzldOwp0aGlzLlByPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMub2s9YjtiLnByb3RvdHlwZT17eGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NbDp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTWE9Yy5va3x8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMueGsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmxrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPQphfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LGFuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMubGt8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxoLGQsZil7dGhpcy5YYT1hO3RoaXMucGc9dGhpcy4kaD0hMTt0aGlzLmVoPWQ7dGhpcy5DaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5YYT1uZXcgeihhKSk7dmFyIGM9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5BZSh0aGlzLlhhLnVybCkmJgpsLktkKXt2YXIgZT1uZXcgeihhLnVybCk7ZS5rdCgiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoZSxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChoKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMubWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMucGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkNoPwp0aGlzLmxiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMubGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy4kaHx8KHRoaXMubGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5BZSh0aGlzLlhhLnVybCk/bC5LZD9sLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkFlKHRoaXMuWGEudXJsKSx0aGlzLmVoJiZ0aGlzLmVoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBOYT1jLm1rfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9CiExO3RoaXMubWM9IiI7dGhpcy5aZD10aGlzLmxjPXRoaXMucWI9bnVsbDt0aGlzLnhvPXRoaXMuRGI9dGhpcy5WZz0hMTt0aGlzLkdhPSIiO3RoaXMuUWc9ITE7dGhpcy5DYT10aGlzLnBkPSIiO3RoaXMuTWc9dGhpcy5YPXRoaXMuaXNFbmFibGVkPXRoaXMuVGU9ITE7dGhpcy56YT1bXTt0aGlzLkNnPXRoaXMuV2I9IiI7dGhpcy5nZT0hMTt0aGlzLmdmPTA7dGhpcy54Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLnZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5JYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5kYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy53Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuWWI9IiI7dGhpcy5FYj1bXTt0aGlzLlpiPVtdO3RoaXMuWGI9IiI7dGhpcy5oZj0wO3RoaXMudmlkZW9wbGF6YT0Ke307dGhpcy52Yz0hMTt0aGlzLmhvPXRoaXMuTGQ9bnVsbDt0aGlzLnloPXRoaXMuS2M9dGhpcy5pZz10aGlzLm1mPXRoaXMuS2Q9dGhpcy5hZT10aGlzLk5jPSExO3RoaXMuJGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucmQ9MDt0aGlzLkVnPSExO3RoaXMuRGc9MUUzO3RoaXMuWWM9ITE7dGhpcy5NYT0xRTM7dGhpcy5GZj0iIn1jLm5rPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkhhLGFkdGFncGFyYW1ldGVyOnRoaXMubWMsYWR0YWdtb2RpZmllcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5sYyxhZHRhZ3JlZ2V4OnRoaXMuWmQsYml0cmF0ZTp0aGlzLk1hLGpzcG9wdXBzOnRoaXMuVmcsc2lkZWxvYWRzOnRoaXMuRGIsZGlzYWJsZXRlc3RzOnRoaXMueG8saG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5RZyxnbG9iYWxDb25maWc6dGhpcy5wZCxjbGllbnRDb25maWc6dGhpcy5DYSwKaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5YLGlzQmxvY2tlZDp0aGlzLk1nLHNlcnZlcjp0aGlzLnphLHN2bUNvbmZpZzp0aGlzLldiLGhvbWFkQWRwYXRoOnRoaXMuQ2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5nZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5nZixIT01BRF9WRVJJRklFRDp0aGlzLnhmLEhPTUFEX0JMT0NLRUQ6dGhpcy52ZixIT01BRF9OT0JMT0NLRVI6dGhpcy5JYixIT01BRF9BREJMT0NLRVI6dGhpcy5kYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMud2YsdGVzdEhpZGU6dGhpcy5ZYix0ZXN0VGFnczp0aGlzLkViLHRlc3RUYWdzSlM6dGhpcy5aYix0ZXN0Q29va2llOnRoaXMuWGIsdGhyb3R0bGU6dGhpcy5oZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnZjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuaG8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5OYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuYWUsCnVzZVN0cmljdENoZWNrczp0aGlzLktkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLm1mLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuJGEsc2l0ZUNvbmZpZzp0aGlzLldhLHNlcnZlcklkOnRoaXMudWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLnJjLHZwYWlkOnRoaXMuS2Msc2tpcEFsbG93ZWQ6dGhpcy55aCx2bWFwczp0aGlzLldoLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5ZYyxhZEZhbGxiYWNrVVJMOnRoaXMuRmZ9fSxQcDpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2JdJiYxPT10aGlzLiRhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LFhlOmZ1bmN0aW9uKGEpe3RoaXMuJGFbYV09ITB9LHhwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sSWQ6ZnVuY3Rpb24oYSl7YT0KYXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkJiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuUW4oYSl9LHdhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5IYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2Y9dGhpcy56ZShhKTtjPXRoaXMuamEoYSk7Zj8odGhpcy55YygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9CmMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuQmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy5tY3x8dGhpcy5xYnx8dGhpcy5sY3x8dGhpcy5aZCkmJihnPXRoaXMub3IoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy56cChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihnKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy55YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHljOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnphJiZ0aGlzLnphLmxlbmd0aCYmMDx0aGlzLnphLmxlbmd0aCYmKGI9dGhpcy56YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxBZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLnplKGEpO3JldHVybiBifSx6cDpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sCmIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuc3Y7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphW3RoaXMudWhdfSxCZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxiPXRoaXMueGgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sYWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sbnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksCmY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMuYWgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLmFoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sb3I6ZnVuY3Rpb24oYSl7dGhpcy5tYyYmKGErPXRoaXMubWMpO2lmKHRoaXMucWIpZm9yKHZhciBiIGluIHRoaXMucWIpdGhpcy5xYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5xYltiXSkpO3RoaXMubGMmJihhPXRoaXMubnIoYSx0aGlzLmxjKSk7cmV0dXJuIGF9LApsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5RZz0hMDt0aGlzLnBkPWE7dGhpcy5DYT1iO3RoaXMuVGU9ZDt0aGlzLkxkPWY7dGhpcy5vYz1jO3RoaXMuV2E9ZXx8e307dGhpcy5hcigpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5DYSl0aGlzLlpxKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkNhKXRyeXt0aGlzLkNhPWIoKSx0aGlzLmJkKCl9Y2F0Y2goZyl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LGliOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxhcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5wZCt0aGlzLlRjKCJnbG9iYWwiKSksdGhpcy5OcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiYKdGhpcy5iZCgpfS5iaW5kKHRoaXMpLCEwKX0sWnE6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLkNhK3RoaXMuVGMoImNsaWVudCIpKTt0aGlzLklhKG5ldyB6KHRoaXMuQ2ErdGhpcy5UYygiY2xpZW50IikpLHRoaXMuYmQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGUoImNsaWVudCIpO3RoaXMuaWEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LFRjOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLkJiKCk7dGhpcy5XYSYmdGhpcy5XYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuV2EmJnRoaXMuV2Eubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxpYTpmdW5jdGlvbihhKXtpZighdGhpcy5hZSl7dGhpcy5hZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJgphW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsKIjRwbGF5ZXJzLmRlIj09ZS5RYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMub2M9ITEpO3RoaXMub2MmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5vYz90aGlzLm9jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlg9dGhpcy5NZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuaWIodGhpcy52ZikpO3RoaXMuR2IoKTtlLnNjKGsudnMpOyhiPWUuUWIodGhpcy5zZCgpKSl8fChiPWUuUWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE5wOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuJGIoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8CnRoaXMuV2J8fHRoaXMuR2F8fHRoaXMuYmQoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmliKHRoaXMuSWIpKSx0aGlzLkdiKCkpfX0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5DYX1lbHNlIGE9dGhpcy5DYTt0aGlzLmlzRW5hYmxlZD10aGlzLiRiKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLnphPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy56YS5sZW5ndGg7YisrKXRoaXMuemFbYl09dGhpcy56YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5XYj1hLmNvbmZpZ3x8IiI7dGhpcy5HYT1hLmFsaWFzfHxudWxsO3RoaXMuQ2c9YS5hZHBhdGh8fCIiO3RoaXMuZ2U9YS5kaXNhYmxlY29va2lldGVzdHx8CiExO3RoaXMudWg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuemEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5XYiYmdGhpcy5HYSYmdGhpcy56YS5sZW5ndGg/dGhpcy56YyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5YPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5pYih0aGlzLkliKSksdGhpcy5HYigpKX0semM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5CZCgpKSxkPXRoaXMuamEodGhpcy5XYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLldiK3RoaXMuVGMoImN1c3RvbWVyIikpO3RoaXMuSWEoYiwKdGhpcy5PdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY3VzdG9tZXIiKTthP3RoaXMuTmw/dGhpcy5pYSgibm9TVk1Db25maWciKToodGhpcy5ObD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuemMoITApfS5iaW5kKHRoaXMpLCEwKX19LE90OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy52YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMudmM9ITA7dGhpcy56YyghMCk7cmV0dXJufX10aGlzLktkPXRoaXMuJGIoYi5zdHJpY3QpO3RoaXMubWY9dGhpcy4kYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5pZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMucmM9dGhpcy4kYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuJGIoYi5lbmFibGVkKTsKdGhpcy5ZYj1iLnRlc3RoaWRlfHwiIjt0aGlzLkViPWIudGVzdGFkdGFnc3x8W107dGhpcy5aYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLm1jPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMucWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMubGM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLlpkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlZnPWIuanNwb3B1cHN8fCExO3RoaXMuRGI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuS2M9Yi52cGFpZHx8ITE7dGhpcy5XYS52cGFpZD10aGlzLktjO3RoaXMueWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5aYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuV2g9Yi52bWFwc3x8IiI7dGhpcy5ZYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuTWE9Yi5iaXRyYXRlfHwxRTM7dGhpcy5GZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5YYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZgpBcnJheT90aGlzLkhwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5nZSYmKHRoaXMuWGI9bnVsbCk7dGhpcy5oZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnZjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy52Yz0hMCx0aGlzLnpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmd1KCkmJih0aGlzLllifHx0aGlzLlpifHx0aGlzLkVifHx0aGlzLlhiKT90aGlzLlRlPyh0aGlzLkhhPXRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuaWIodGhpcy5JYikpLHRoaXMuY2UoKSx0aGlzLkdiKCkpOnRoaXMuVXQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WdCgpKX19LFV0OmZ1bmN0aW9uKCl7dGhpcy5UdCgpO3RoaXMuV3QoKX0sV3Q6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrCmErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuZWEoMTApLGc9ZS5lYSgxMCksSD1lLmVhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLAoiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUucWMoKTsKaWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5oYigpKXtpZih0aGlzLldhJiZ0aGlzLldhLnBsYXllciYmdGhpcy5XYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sVnQ6ZnVuY3Rpb24oKXt0aGlzLlg9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmliKHRoaXMuSWIpKTt0aGlzLkdiKCl9LEljOmZ1bmN0aW9uKGEpe3RoaXMuTmM9ITA7dGhpcy5YfHwodGhpcy5YPXRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmliKGEpKSx0aGlzLkdiKCksdGhpcy5jZSgpKX0sVHQ6ZnVuY3Rpb24oKXtpZih0aGlzLlliKXt2YXIgYT1lLnFjKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5VZygpKXRoaXMuSWModGhpcy5kYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7CmVsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlliKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuWWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuSWModGhpcy5kYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuR2goKX19ZWxzZSB0aGlzLkdoKCl9LEZoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGQ7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkJiKCkpOwp0aGlzLlp0KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5kZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuSWModGhpcy5kYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfXRoaXMuRWI9bnVsbCx0aGlzLmRmKCl9LFp0OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxHaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5CYigpKTt0aGlzLiR0KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5GaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuSWModGhpcy5kYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWmImJnRoaXMuWmIubGVuZ3RoKXt2YXIgZD10aGlzLlpiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuRmgoKX0sJHQ6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixkKXtkPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9CmM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxkZjpmdW5jdGlvbigpe3RoaXMuWGI/KHRoaXMuZ2YrKyx0aGlzLklhKG5ldyB6KHRoaXMuWGIpLHRoaXMuU3QuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5EaCgpfSxlZjpmdW5jdGlvbihhKXt0aGlzLkljKHRoaXMud2YsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxTdDpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5nZj90aGlzLmRmKCk6dGhpcy5lZigiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuRGgoKTp0aGlzLmVmKCJBQUEiKX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlg9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmliKHRoaXMuSWIpKTsKdGhpcy5HYigpO3RoaXMuY2UoKX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxHYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5oYigpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLk5jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS55YSgidC1vbmxpbmUuZGUiKXx8ZS55YSgiZ2lnYS5kZSIpfHxlLnlhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLlVnKCksITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5pYih0aGlzLnhmKSk7dGhpcy5MZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkxkJiZ0aGlzLkxkKCl9LGNvOmZ1bmN0aW9uKCl7aWYodGhpcy5tZiYmCnRoaXMuUHAoKSl7dmFyIGE9dGhpcy54cCgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sS2g6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsZCxmLGMsZyl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5EZyYmIXRoaXMuRWcmJih0aGlzLkVnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5EZywhMCkpO2E9bmV3IE5hKGEsYixkKTtmJiYoYS4kaD0hMCk7YyYmZS54cSgpJiYoYS5wZz0hMCk7ZyYmKGEuQ2g9ITApO3JldHVybiBhLmxvYWQoKX0sWWY6ZnVuY3Rpb24oKXtlLmhiKCl8fGUuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLnljKCl8fChhPXRoaXMuamEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT0KZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sUHQ6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuV2h9LGJvOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLkJ1LmJpbmQodGhpcyksdGhpcy5BdS5iaW5kKHRoaXMpKX0sQnU6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLlZvKCl9LEF1OmZ1bmN0aW9uKCl7fSxWbzpmdW5jdGlvbigpe2Uuc2Moay5Vbyk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sY2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5EYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkRiLmxlbmd0aDthKyspe3ZhciBiPQp0aGlzLkRiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLlRhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgUjt3aW5kb3dbZC54YygpXT10aGlzO2UuVGEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sZ3U6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5oZn0sSHA6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LEJiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41PgpNYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sJGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGUsZyxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGY9YS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGc9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGYpP2c9az02NDppc05hTihjKSYmKGs9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZywKZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHhoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGQ9IiIsYyxoO2ZvcihjPTc7MDw9YztjLS0paD1hPj4+NCpjJjE1LGQrPWgudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHIsdSx4LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx3LnB1c2goZSk7c3dpdGNoKHAlNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz0KYS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGMpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXdbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztwPWw7cj1tO3U9cTt4PXQ7Zm9yKGM9MDsxOT49YztjKyspdj1kKGUsNSkrKHAmcnx+cCZ1KSt4K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHg9dSx1PXIscj1kKHAsMzApLHA9ZSxlPXY7Zm9yKGM9MjA7Mzk+PWM7YysrKXY9ZChlLDUpKyhwXnJedSkreCtnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSwKeD11LHU9cixyPWQocCwzMCkscD1lLGU9djtmb3IoYz00MDs1OT49YztjKyspdj1kKGUsNSkrKHAmcnxwJnV8ciZ1KSt4K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHg9dSx1PXIscj1kKHAsMzApLHA9ZSxlPXY7Zm9yKGM9NjA7Nzk+PWM7YysrKXY9ZChlLDUpKyhwXnJedSkreCtnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx4PXUsdT1yLHI9ZChwLDMwKSxwPWUsZT12O2s9aytlJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rciY0Mjk0OTY3Mjk1O3E9cSt1JjQyOTQ5NjcyOTU7dD10K3gmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ua3x8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5SbD1iO2IucHJvdG90eXBlPQp7R286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5SbHx8UGEsdmM9bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuR28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsZCl7dGhpcy5iPWE7YS5mLk8/dGhpcy5VYT1hLmYuTygpOnRoaXMuVWE9IiI7YS5mLktnJiZhLmYuS2coe3BhdXNlOnRoaXMueGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5zaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5JZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZ1LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuYWI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5OYj10aGlzLlhjPSExO3RoaXMuT249MUUzO3RoaXMuZGE9Cm51bGw7dGhpcy5MPWI7dGhpcy52YT17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307ZS5nYigibmV3QmlnQWRJZCIpO3RoaXMuVG49ZS5lYSgxMCk7dGhpcy5hZj0wO3RoaXMuVmM9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5WYz1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmIuZikmJnRoaXMuYi5mLnUmJihhPXRoaXMuYi5mLnUoKSksdGhpcy5WYz1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5nbj1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmZoPXRoaXMuR2Q9ITE7dGhpcy5ZZz1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuU2M9ITE7dGhpcy5OaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlNiPQohMTt0aGlzLnBvPWUuZWEoMTApO3RoaXMuQWI9ZS5lYSgxMCk7dGhpcy55Yj1lLmVhKDEwKTt0aGlzLnpoPWUuZWEoMTApO3RoaXMuY29uZj17fTt0aGlzLnBjPXRoaXMuemI9ITE7dGhpcy5qZT1udWxsO3RoaXMuT2Q9dGhpcy5IYj10aGlzLnVlPXRoaXMuUGU9dGhpcy5mZT10aGlzLmdkPXRoaXMuY2Y9dGhpcy5rYj10aGlzLmNjPXRoaXMuaGg9dGhpcy50Yz10aGlzLmp1PXRoaXMub2I9ITE7dGhpcy5oYz1bXTt0aGlzLmFjPXt9O3RoaXMuamY9ITE7dGhpcy5VYj17fTt0aGlzLnJzPTIwMDt0aGlzLnNmPXRoaXMuWmg9dGhpcy4kZD10aGlzLlNlPSExfWMuaGs9YjtiLnByb3RvdHlwZT17ZnQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5VYV0mJnRoaXMuY29uZlt0aGlzLlVhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuVWFdW2FdKTtyZXR1cm4gYn0sTGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuUGEmJgplLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLkwuTmM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS52KGsuWm0sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sRGU6ZnVuY3Rpb24oYSxiLGQsYyl7dGhpcy5vYj1kO3ZhciBuPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihuPSEwKTtpZih0aGlzLkwuWCl0aGlzLmFmKyssZS5nYigibmV3U21hbGxBZElkIiksdGhpcy5MLmNvKCksYz1sLmdldENvbmZpZygpLHRoaXMuTC5IYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5MaCgpLG5ldyBUKHRoaXMsYSx0aGlzLllnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5NYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5LYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLApjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5MaCgpLG5ldyBUKHRoaXMsYSx0aGlzLllnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLktjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5NYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuTmEoKTtlbHNle3ZhciBnPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2cuRGUoYSxiLGQpfSw1MCl9fSxOZTpmdW5jdGlvbihhKXsic3BpZWdlbC5kZSIhPWUuUWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fHRoaXMuZmh8fCJzdm1wcmV2aWV3IiE9ZS5qYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3I/KHRoaXMuT2Q9CnRoaXMuSGI9dGhpcy50Yz0hMSx0aGlzLmM9YSx0aGlzLnN0KHRoaXMuYyksdGhpcy56ZyhhKSx0aGlzLmhjPXRoaXMucmcoYSksdGhpcy5hYz17fSx0aGlzLmpmPSExLHRoaXMuaW8oKSk6dGhpcy5mZCgpfSx6ZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5IZD10aGlzLktwKGEpKSx0aGlzLnpnKGEucGFyZW50KSl9LHJnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5yZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLnNwKGEpKSk7cmV0dXJuIGN9LHNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPQowO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpkfX0sS3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sZD1bXSxjPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWQucHVzaChhLmJiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LG1hOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZD0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoYj1hLmtkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuTGMuY29kZTpiPT1GLlFkLmNvZGU/ZS52KGsuVnUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTooZS5FZSgpLGI9PUYuQWYuY29kZSYmZS52KGsudHIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS52KGsuVG8sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7CmJyZWFrO2Nhc2Ugdy55Zi5jb2RlOmUudihrLkN1LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2Ugdy5CZi5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UudihrLld1LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3Jfd3JhcHBlcmxpbWl0IjticmVhaztjYXNlIHcuUmQuY29kZTplLnYoay5hdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuUGQuY29kZTplLnYoay51cix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnBjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwKIjEwNSIpLGQ9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09ZCYmYS5lcnJvciYmYS5lcnJvci51YSYmKGQrPSJfIithLmVycm9yLnVhKTtlLnRyYWNrKGQsIiIsITApO3RoaXMuT2IoYSk7dGhpcy5OYSgpfSxPYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuTGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5MYS5wb3AoKTt0aGlzLkNlKGQudXJsLGQudHlwZSxiKX1jYXRjaChjKXt9fSxzdDpmdW5jdGlvbihhKXt0aGlzLmZlPXRoaXMudWU9dGhpcy5QZT0hMTt0aGlzLnZhPXRoaXMuYi5HO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnZhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJgpkLmVudnZhcnMpdHJ5e2I9ZC5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuU2U9ITB9Y2F0Y2goYyl7fX1jYXRjaChlKXt9Yi5Odj0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuZ24mJnRoaXMucGxheWVyLmxlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5sZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTsKZm9yKGQ9MDtkPGEuTS5sZW5ndGg7ZCsrKWIuY2FuUGxheVR5cGUoYS5NW2RdLnR5cGUpJiZ0aGlzLmJuKGIsYS5NW2RdLnVybCsiIixhLk1bZF0udHlwZSk7dGhpcy5TZSYmYi5sb2FkKCk7aWYodGhpcy5IaChiKSl7dGhpcy5lbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLmRhPXRoaXMudmEuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuU2U/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLmxvKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMudmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLHRoaXMucXQoKSk6dGhpcy55ZSgpP3RoaXMud2goKTp0aGlzLmMub3JpZ2luLmpnKHcuUGQpfSxxdDpmdW5jdGlvbigpe3RoaXMua2I9dGhpcy5jYz0hMTt0aGlzLmIuZi5zYSYmdGhpcy5iLmYuc2EoKSYmKGUudihrLmNnLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5rYj0hMCk7ZS5lZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi50ZiYmZS5mbih0aGlzLmMub3JpZ2luLnRmKTtlLllhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi5paCgpO3RoaXMuYi5HYygpO2ZvcihhPQp0aGlzLmIuRzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLkdjKCk7dGhpcy5kYT10aGlzLnZhPXRoaXMuYi5HO3RoaXMub2YoInZwYWlkIik7aWYodGhpcy5rYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnliKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTtlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKTtlLnYoay52ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfXRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuRy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi5zYSYmdGhpcy5iLmYuc2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYy5NcCgpLGM9dGhpcy5jLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2Uua2EodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5rYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uua2EodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmthKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5rYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uua2EodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmthKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uua2EodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uua2EodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmthKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5UZigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuTCk7dGhpcy5ILnNyYz1hO2UuWGQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpeyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5SYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5oYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkp1KGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLkt1KCksdGhpcy5iLlJiKCEwKSwhdGhpcy5IYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5IYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5PZD0hMDtlLnYoay5WaCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS54ZSh0aGlzLkhiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuUmIoITApLHRoaXMuT3UoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYi5SYighMCksdGhpcy5TdSgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RdSgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SdSgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlR1KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB1KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhoKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLk1iKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmJnLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5ZYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpOwpiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuTnUoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLldkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuTHUoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlpoJiYodGhpcy5zZj0hMSx0aGlzLkZjKCkpLHRoaXMuTXUoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMueWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5rYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay52ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKToodGhpcy5rYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsubGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlhkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcykpO2UuWGQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuUmYoZnVuY3Rpb24oYSl7ZS5rYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxMdTpmdW5jdGlvbigpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLlVkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmNjPSEwfSxNdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlJjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5jYz0hMX0sT3U6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxOdTpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5NZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSwKS3U6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5ZYSgiaW1wcmVzc2lvbiIpO2UudihrLklmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFN1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLllhKCJzdGFydCIpO2UudihrLlJjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFF1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMudGM9ITA7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLkdmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFJ1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudihrLktmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFR1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTsKZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sUHU6ZnVuY3Rpb24oKXt0aGlzLk1kKCk7ZS5ZYSgiY29tcGxldGUiKX0sWGg6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5lZSgpO3RoaXMuSD0hMTt0aGlzLk5hKGEpfX0sSnU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZyxmPVtdOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZywoZj1iLm1hdGNoKGMpKT9mLmpvaW4mJihiPWYuam9pbigiLSIpKTpiPWIuc3Vic3RyaW5nKDAsMjApKTsKZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixiLCEwKTtlLllhKCJlcnIiLGIpO2UudihrLlV1LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5YaCghMCl9LGJuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuSGEmJmIuaXNFbmFibGVkJiYhYi55YygpKXt2YXIgZD1iLmphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5HdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LEhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxlbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuVWguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5NZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLk5kLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5VaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk1kLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTmQuYmluZCh0aGlzKSl9LApVaDpmdW5jdGlvbihhKXt0aGlzLk5ifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmJ8fHRoaXMucGYoYSl9LmJpbmQodGhpcyksdGhpcy5PbikpfSxwZjpmdW5jdGlvbihhKXtpZighdGhpcy5YYyYmdGhpcy5IaCh0aGlzLnZpZGVvKSYmIXRoaXMuemImJiF0aGlzLk5iKXt0aGlzLlhjPSEwO3RyeXtpZighZS5oYigpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy56Ynx8KHRoaXMuemI9ITAsdGhpcy5DZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLkwuaWd8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLk5hKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuRnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPQohMTt0aGlzLmIuR2MoKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuVWYoKTt0aGlzLmIuaWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuYmYoKX19LGJmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZ2QpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5QYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5xZD1bXTtmb3IodmFyIGI9dGhpcy5iLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMucWQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKYy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5RYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5RYygpfWVsc2UgdGhpcy5RYygpfSxRYzpmdW5jdGlvbihhKXtpZih0aGlzLnFkKWZvcih2YXIgYj0wO2I8dGhpcy5xZC5sZW5ndGg7YisrKXRoaXMucWRbYl0uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLmdkfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5OYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMuSWUoITApLHRoaXMuUWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMudWUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLlBlPSEwfS5iaW5kKHRoaXMpKTtkYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuVmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5WYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5WYi5iaW5kKHRoaXMpKSk6Cko9ZnVuY3Rpb24oKXt0aGlzLlNjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0uYmluZCh0aGlzKTt0aGlzLm5lKCkudmgodGhpcyl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5MLnJjJiYhdGhpcy56YiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuWG0sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLk5hKCl9LE5hOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmZlKWlmKHRoaXMuZmU9ITAsdGhpcy5PZHx8KGUudihrLkFyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLm5ifHx0aGlzLmMuZmMpe2UuZ2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuYWYrKzt0aGlzLk5iPXRoaXMuWGM9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy52YS5yZW1vdmVDaGlsZCh0aGlzLmRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5HZD0hMTt0cnl7dGhpcy5iLlBoKCl9Y2F0Y2goZyl7fXRoaXMuY2Y9ITA7dGhpcy5iLnJlKCk7dGhpcy5TYj0hMTt0aGlzLm5lKCkucmgoKTt0aGlzLmMubmImJnRoaXMuYy5vcmlnaW4uSmUoKTt0aGlzLmMuZmMmJihhP3RoaXMuYy5vcmlnaW4uYmgoKTp0aGlzLmZkKCkpfWVsc2UgdGhpcy5mZCgpfSxHdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMueWUoKT90aGlzLndoKCk6dGhpcy5OZChhKSl9LE5kOmZ1bmN0aW9uKGEpe3RoaXMuTmI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmCih0aGlzLnllKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBjfHx0aGlzLkwuWWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuTC5ZZigpKTt0aGlzLmMub3JpZ2luLmpnKHcuUGQpfSxxZjpmdW5jdGlvbigpe2lmKHRoaXMuanUpdGhpcy5OYSgpO2Vsc2V7dGhpcy5TYj0hMDt0aGlzLmIuZi5SYSYmIXRoaXMuY2YmJnRoaXMuYi5mLlJhKCkmJmUudihrLmRkLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLm91KGEpO2lmKCF0aGlzLkhiKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLkhiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5PZD0hMDtlLnYoay5WaCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS54ZSh0aGlzLkhiKX1jPSIiO3RoaXMuYy4kZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy56aCkpJiYoYz10aGlzLmMuJGUtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLk1mLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5jLm5iPyh0aGlzLk5iPXRoaXMuWGM9ITEsCnRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5kYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnZhLnJlbW92ZUNoaWxkKHRoaXMuZGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5HZD0hMSx0aGlzLmIuUGgoKSx0aGlzLmMub3JpZ2luLkplKCkpOnRoaXMuTmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLnFnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuU2M9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHdoOmZ1bmN0aW9uKCl7dGhpcy5wYz0hMDt0aGlzLnZhPXRoaXMuYi5HO3RoaXMudmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnZhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLAoiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5GcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nOwp0aGlzLmIuRj1hO3ZhciBiPXRoaXMuYi5GLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy52YS5hcHBlbmRDaGlsZChjKTt0aGlzLmIuR2MoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnZhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy52YS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuVGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuU2goKTt0aGlzLm9mKCk7dGhpcy5qZT1zZXRJbnRlcnZhbCh0aGlzLmFvLmJpbmQodGhpcyksCjEwMCk7cmV0dXJuIGF9LEZwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5jLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmMuTVtjXSxlO2U9Yi51cmw7dmFyIGc9dGhpcy5MO2cuSGEmJmcuaXNFbmFibGVkJiYhZy55YygpJiYoZT1nLmphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sYW86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMuYy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLmplKSx0aGlzLk1kKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucWYoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuamUpLAp0aGlzLk5kKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sTWg6ZnVuY3Rpb24oKXt0aGlzLmhofHwodGhpcy5oaD0hMCx0aGlzLnRjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sb3U6ZnVuY3Rpb24oYSl7ZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthPT10aGlzLk5ofHx0aGlzLnpifHwoMD09YSYmKHRoaXMub2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMub2IpLHRoaXMub2I9ITEpLHRoaXMuUGV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMudWU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuTWgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsCmZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpKSx0aGlzLnBjJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy56Ynx8ZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGUuaGIoKSYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudihrLklmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnBjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwucmMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLnRjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksCmUudihrLkdmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLnJjJiZlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5LZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLnJjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksdGhpcy5OaD1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy56Yil7dHJ5e2lmKHRoaXMuYWNbYV09KG5ldyBEYXRlKS5nZXRUaW1lKCksdGhpcy5hYy5pbXByZXNzaW9uJiZ0aGlzLmFjLmNvbXBsZXRlJiYhdGhpcy5qZil7dGhpcy5qZj0KITA7dmFyIGM9dGhpcy5hYy5jb21wbGV0ZS10aGlzLmFjLmltcHJlc3Npb24sZj0ic3RhdHNfaGRfdGltZWRpZmYiO3RoaXMuSCYmKGYrPSJ2cGFpZCIpOzVFMz5jJiYoMTA+YyYmKGM9MTApLDA+YyYmKGM9Im5lZ2F0aXZlIiksZS50cmFjayhmLGMsITApKX19Y2F0Y2goZyl7fWlmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1jPVtdO3RyeXtjPXRoaXMuTHAodGhpcy5jLkxhLGEpfWNhdGNoKGwpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBtPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy4kZD0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkhkLmltcHJlc3Npb25zJiZlLnZxKG0udXJsLHRoaXMuSGQuaW1wcmVzc2lvbnMpP3RoaXMuQ2UobS51cmwsbS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwplLnYoay5ZbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5DKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuQ2UobS51cmwsbS50eXBlKX1jYXRjaChxKXt9aWYoIWIpdHJ5e3RoaXMuYy5MYT10aGlzLnZvKHRoaXMuYy5MYSxhKX1jYXRjaChyKXt9fX0sQ2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwud2EoYSksYyYmYi5hbihjKSxmfHwoZj10aGlzLmhnKSxlfHwoZT10aGlzLmhnKSx0aGlzLmNuKGEpLHRoaXMuTC5JYShiLGZ1bmN0aW9uKCl7dGhpcy5xaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxjbjpmdW5jdGlvbihhKXt0aGlzLlViW2FdPSJvcGVuIn0scWg6ZnVuY3Rpb24oYSl7dGhpcy5VYlthXT0iY2xvc2VkIn0saW86ZnVuY3Rpb24oKXt0aGlzLlViPQp7fX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5VYil0aGlzLlViLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuVWJbYl0mJmErKztyZXR1cm4gYX0sTHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2bzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxGdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuVGguYmluZCh0aGlzKSl9LFRoOmZ1bmN0aW9uKCl7dGhpcy5jLk1iJiYoZS52KGsuYmcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksIXRoaXMudGMmJmUuaGIoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLAplLnRwKCksITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RoaXMuTC5ZYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5NYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuTWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxTaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5WYy5yZXBsYWNlKCJbdGltZV0iLGUucWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5aYyYmKGI9dGhpcy5MLlpjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnViLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmRhLmFwcGVuZENoaWxkKGEpfX0sdWI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5aYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuWmMpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvZjpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMucG87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuRmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy52YigpO3RoaXMudWIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuQWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5KaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLkloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSWguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy52YigpO3RoaXMudWIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLnliO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubHUuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rdS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudmIoKTt0aGlzLnViKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLnpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLiRlJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLmRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTt0aGlzLmRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudmIoKTt0aGlzLnViKCl9LmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5kYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT8KYi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMudGEmJih0aGlzLnRhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnRhPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLlJmKGZ1bmN0aW9uKGEpe3RoaXMudGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnNhJiZ0aGlzLmIuZi5zYSgpJiYoZS52KGsuY2csdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkllKCkpO3RoaXMudmIoKX19LHZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sRmM6ZnVuY3Rpb24oKXt0aGlzLnRhJiYiYmxvY2siPT10aGlzLnRhLnN0eWxlLmRpc3BsYXl8fHRoaXMuc2Z8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudGEmJih0aGlzLnRhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5VZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudGEmJih0aGlzLnRhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnZiKCksdGhpcy51YigpKSl9LEpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5jYz8oZS5rYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy50YSYmKHRoaXMudGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuY2M9ITEpOihlLmthKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMudGEmJih0aGlzLnRhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnZiKCksdGhpcy51YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMuY2M9ITApfSx4ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5VZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlJjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSwKdGhpcy5DKCkpKX0sa3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnliKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5sZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsudmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy55Yik7dGhpcy5rYj8oZS5rYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSwKdGhpcy5rYj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5rYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5rYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxJZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMueWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsudmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LHZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy55Yik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay5sZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sVmI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5WYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5WYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuVmIpO3RoaXMuZ2R8fHRoaXMuU2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmJmKCkpfSxmZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuamEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7ZS5xYygpO2lmKGF8fCF0aGlzLiRkJiYKYi5hZEZhbGxiYWNrVVJMKXRoaXMuZmg9dGhpcy5aaD10aGlzLnNmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwiIiwhMCksdGhpcy4kZD0hMCxhPWUuVGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuRGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtlbHNlIGlmKHRoaXMuZ2Q9ITAsdGhpcy5vYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5vYiksdGhpcy5vYj0hMSksKCJwcmVyb2xsIj09ZS5QYSYmdGhpcy5TY3x8InBvc3Ryb2xsIj09ZS5QYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpaWYoYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsLCJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuUGEpKSwic3RyaW5nIj09dHlwZW9mIGEmJmEpe2ZvcihiPXRoaXMuYi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmIuR2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKYy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuaGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5oZCgpO2Vsc2UgdGhpcy5oZCgpfSwKaGQ6ZnVuY3Rpb24oYSl7dGhpcy5HdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLHRoaXMucnMpOih0aGlzLmNmPSEwLHRoaXMuYi5yZSgpLHRoaXMuYi5ZcygpLHRoaXMuU2I9ITEsZS52KGsub28sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm5lKCkucmgoKSl9LG5lOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJgooYT0hMCl9cmV0dXJuIGF9LFVmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYSgibWluVmlzIik7YSYmKGUud2UodGhpcy52aWRlbyxhKT90aGlzLnNoKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk1iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLm5iLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuaGMmJjA8dGhpcy5oYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuaGMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuVG4rCiItIit0aGlzLmFmO3RoaXMuYyYmdGhpcy5jLnZnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy52ZygpKTtyZXR1cm4gYX0saGc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLmhrfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5McT10aGlzLmFbNl07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5XcD10aGlzLmFbM107dGhpcy5DbD10aGlzLmFbNV07dGhpcy5Mbj10aGlzLmFbNl07dGhpcy5Gbj10aGlzLmFbNl07dGhpcy5ZdT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs5XX1jLlpyPWI7Yi5wcm90b3R5cGU9e0txOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5McTp0aGlzLkVvKGEpfSxFbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRm86dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLldwOnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkNsOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZuOnRoaXMuWHUoYSl9LFh1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFJhPWMuWnJ8fFJhLHdjPW5ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLktxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuQmE9bnVsbDt0aGlzLlc9W107dGhpcy5VPW51bGw7dGhpcy5nYz10aGlzLmljPSExO3RoaXMudGY9IiI7dGhpcy5yZj0hMTtkJiZkLmVtcHR5P3RoaXMuZHIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MucG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUucWMoKSxiO2I9ZS5qYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC53YShsLklkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuaGIoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuZWcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPApkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuSWQoYSkpKyImdHlwZT1qcyIsYj1sLndhKGwuSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwud2EobC5JZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPQoidHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5jci5iaW5kKHRoaXMpLHRoaXMuJHEuYmluZCh0aGlzKSl9LHNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkJhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5QYSl0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuUGF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLlBhfHx0aGlzLnpxKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLlB0KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTsKMD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/Ci0xOjE6MH0pfSx6cTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sY3I6ZnVuY3Rpb24oYSl7dGhpcy5NcyhhKTt0cnl7dGhpcy5CYT1hLnJlc3BvbnNlWE1MLHRoaXMuQmF8fCh0aGlzLkJhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLk9hKHcuUmQpKX10aGlzLlc9dGhpcy5zZygpO3RoaXMuaWM9dGhpcy5mZigpO3RoaXMuZ2M9dGhpcy5FaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5CYygpOnRoaXMubWEodGhpcy5PYSh3LkxjLHtlcnJvcjp0aGlzLnJmP0YuUWQ6Ri56Zn0pKX0sZHI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuQmF8fCh0aGlzLkJhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMubWEodGhpcy5PYSh3LlJkKSl9dGhpcy5XPXRoaXMuc2coKTt0aGlzLmljPXRoaXMuZmYoKTt0aGlzLmdjPXRoaXMuRWgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuQmMoKTp0aGlzLm1hKHRoaXMuT2Eody5MYyx7ZXJyb3I6dGhpcy5yZj9GLlFkOkYuemZ9KSl9LCRxOmZ1bmN0aW9uKCl7dGhpcy5tYSh0aGlzLk9hKHcueWYse2RlcHRoOmF9KSl9LEJjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVy5zaGlmdCgpOwp0aGlzLkJxKCk/dGhpcy5hdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkFnKCksaCx7QWRTeXN0ZW06dGhpcy5ycCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLm1hKHRoaXMuT2Eody5CZikpOihhPTAsdGhpcy55dSgpJiZ0aGlzLk5lKHRoaXMuc28oKSkpfSxKZTpmdW5jdGlvbigpe3RoaXMuaWM/KHRoaXMuaWM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuQmMoKSk6dGhpcy5wYXJlbnQuSmUoKX0sYmg6ZnVuY3Rpb24oKXt0aGlzLmdjPyh0aGlzLmdjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLkJjKCkpOnRoaXMucGFyZW50LmJoKCl9LHl1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXQoKT90aGlzLlh0KCk/ITA6KC0xIT10aGlzLnVjKCk/dGhpcy5tYSh0aGlzLk9hKHcudWYpKTp0aGlzLm1hKHRoaXMuT2Eody5raikpLCExKToodGhpcy5tYSh0aGlzLk9hKHcuTGMsRi5BZikpLCExKX0sTmU6ZnVuY3Rpb24oYSl7YS5MYT0KYS5MYS5jb25jYXQodGhpcy5GZSgpKTthLm5iPWEubmI/YS5uYjp0aGlzLmljO2EuZmM9YS5mYz9hLmZjOnRoaXMuZ2M7dGhpcy5wYXJlbnQuTmUoYSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy51YygpO2EuTT10aGlzLnhnKCk7YS5NYj10aGlzLnVwKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy5xcCgpO2EuJGU9dGhpcy5KcChhLmR1cmF0aW9uKTtyZXR1cm4gYX0sbWE6ZnVuY3Rpb24oYil7dGhpcy5VJiYoYi5MYT1iLmVycm9yLmNvZGUhPXcudWYuY29kZT9iLkxhLmNvbmNhdCh0aGlzLnZwKCkpOmIuTGEuY29uY2F0KHRoaXMuRHAoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5PYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lk9iJiZ0aGlzLnBhcmVudC5PYihiKSxhPTAsdGhpcy5CYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm1hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQubWEmJgp0aGlzLnBhcmVudC5tYShiKSxhPTApfSxPYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5PYihhKX0samc6ZnVuY3Rpb24oYSxiKXt0aGlzLm1hKHRoaXMuT2EoYSxiKSl9LE9hOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sYXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxZdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGcoKS5sZW5ndGh9LFh0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy51YygpfSxmZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LEVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5mZigpJiYoYT0hMCk7cmV0dXJuIGF9LE1zOmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy50Zj0KYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLnJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5BZygpLmxlbmd0aH0sQWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxycDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lKHRoaXMuVSwiQWRTeXN0ZW0iKX0sRmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYKIXRoaXMuTmcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuYmIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxOZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLk5nKGEucGFyZW50Tm9kZSk6ITF9LERwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHZwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx1cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSx4ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxNYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksdHY6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuYmIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuTWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk1hKS1NYXRoLmFicyhkLWIuTWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuTWEpLU1hdGguYWJzKGQtCmIuTWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LHFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMub2QoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHVjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuYmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rCjYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5FdChkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LG1lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5iYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGJiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMub2QoYSk6IiJ9LG9kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFQ9Yy5wbXx8VDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VaT10aGlzLmFbNF07dGhpcy5TbT10aGlzLmFbMTBdO3RoaXMueG49dGhpcy5hWzJdO3RoaXMuT2k9dGhpcy5hWzhdO3RoaXMuYnQ9dGhpcy5hWzFdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOF19Yy54dD1iO2IucHJvdG90eXBlPXtUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5SbShhKX0sUm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TbTp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueG46dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9pOnRoaXMuYXQoYSl9LAphdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnQ6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkVqOnRoaXMuaG0oYSl9LGhtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMueHR8fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLlRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTGE9W107dGhpcy5NPVtdO3RoaXMuTWI9IiI7dGhpcy5BPXRoaXMuZmM9dGhpcy5uYj0hMTt0aGlzLnNlPXRoaXMub3JpZ2luPW51bGw7dGhpcy50ZT0iIn1jLndsPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PQp0aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LEJwOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5CYSl7dmFyIGE9CnRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuc2U9YVtjXSl9cmV0dXJuIHRoaXMuc2V9LHZnOmZ1bmN0aW9uKCl7aWYodGhpcy50ZSlyZXR1cm4gdGhpcy50ZTt2YXIgYT0iIjsoYT10aGlzLkJwKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy50ZT1hfSxNcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMud2x8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Waz10aGlzLmFbMTBdO3RoaXMucXI9dGhpcy5hWzRdO3RoaXMuV3I9dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzldO3RoaXMub3E9dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzZdO3RoaXMuRGk9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzFdO3RoaXMueHU9dGhpcy5hWzNdO3RoaXMuQm49dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMV19Yy5Qaj1iO2IucHJvdG90eXBlPXtVazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZrOnRoaXMucHIoYSl9LHByOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xcjp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV3I6dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdxOnRoaXMubnEoYSl9LG5xOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5vcTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUW86dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5EaTp0aGlzLkRtKGEpfSxEbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRW06dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnh1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Cbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUGp8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlVrKDQpO3ZhciB3PXtSZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix1YToiWE1MX1BBUlNFX0VSUk9SIn0sa2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHVhOiJEVVJBVElPTl9FUlJPUiJ9LApMYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsdWE6IkVNUFRZX1ZBU1QifSxCZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix1YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0seWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnVhOiJMT0FEX0VSUk9SIn0sUGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHVhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sanY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsdWE6Ik1FRElBRklMRV9FUlJPUiJ9LHVmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHVhOiJEVU1NWV9BRCJ9fSxGPXt6Zjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHVhOiJOT19BRFMifSxBZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsdWE6Ik5PX01FRElBRklMRVMifSxrdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsdWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxRZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix1YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs2XX1jLkVpPWI7Yi5wcm90b3R5cGU9e2ZzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLkVpfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5mcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiKXt0aGlzLmVycm9yPWE7dGhpcy5rZD1iO3RoaXMuTGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkxqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5Manx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG49dGhpcy5hWzddO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuem49dGhpcy5hWzRdO3RoaXMuZ3Y9dGhpcy5hWzddO3RoaXMudGk9dGhpcy5hWzVdO3RoaXMuaXY9dGhpcy5hWzddO3RoaXMubnU9dGhpcy5hWzddO3RoaXMucXE9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMTBdfWMuQnI9YjtiLnByb3RvdHlwZT17c246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bjp0aGlzLklzKGEpfSxJczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnM6dGhpcy55bihhKX0seW46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpuOgp0aGlzLmZ2KGEpfSxmdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ3Y6dGhpcy5zaShhKX0sc2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRpOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaXY6dGhpcy5tdShhKX0sbXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm51OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xcTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkJyfHxYYSxBYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1BYy5zbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHwKe307dGhpcy5mPWE7dGhpcy5hYj1hLnRnKCk7dGhpcy5HPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuRy5pZD1lLmVhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuU2Y9ITE7dGhpcy5MYj1bXX1jLm5qPWI7Yi5wcm90b3R5cGU9e3BwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMucHAoYSk7CmZvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5VcChhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxOdDpmdW5jdGlvbigpe3RoaXMuU2Y9ITB9LApQaDpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saWg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5kZCx0aGlzLmYudSgpKX0sWXM6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5lZCx0aGlzLmYudSgpKSl9LEdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz0KdGhpcy5hYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmFiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuYWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuYWIpO3RoaXMuZi5EYyYmdGhpcy5mLkRjKCk/dGhpcy5mLnRnKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5SYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sVXA6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHwKYiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxncDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFJiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ3AodGhpcy5hYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5yZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuRGMoKT8odGhpcy5HLnN0eWxlLmxlZnQ9CiIwcHgiLHRoaXMuRy5zdHlsZS50b3A9IjBweCIpOih0aGlzLkcuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkcuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkcuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkcuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5MYi5sZW5ndGg7YSsrKXRoaXMuTGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5BaCh0aGlzLkcpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJiLmJpbmQodGhpcyksMTApfSxSZjpmdW5jdGlvbihhKXt0aGlzLkxifHwodGhpcy5MYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuTGIucHVzaChhKX0scmU6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmCnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMubmp8fFlhLEM9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuZWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBKPSExLGRhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzEwXTsKdGhpcy5Oaz10aGlzLmFbMTBdO3RoaXMuVXI9dGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzEwXTt0aGlzLk9vPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLk1vPWI7Yi5wcm90b3R5cGU9eyRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hczp0aGlzLmJrKGEpfSxiazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2s6dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5rOnRoaXMuVHIoYSl9LFRyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vcjp0aGlzLk9tKGEpfSxPbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUG06dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk9vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgJGE9Yy5Nb3x8JGEsQmM9bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLiRyKDQpOyhmdW5jdGlvbihjKXtjLmpsPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlkoYSk7dGhpcy5EZChiKTt0aGlzLmZnKCl9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksCjEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkZhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGFiPWMuamx8fGFiOyhmdW5jdGlvbihjKXtjLmlsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lYSgpO3RoaXMuS2I9dGhpcy5LYnx8ITE7dGhpcy5KZj10aGlzLkxmPXRoaXMuSmc9dGhpcy5jYT10aGlzLmtmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuZXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmtmPSEwO3RoaXMuSmcmJnRoaXMuYWcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkud2I7YSYmYS5TYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmFkKCk7dGhpcy5KZz0hMDt0aGlzLmFnKCl9LmJpbmQodGhpcykpO3RoaXMuV2YoKX0sYWc6ZnVuY3Rpb24oKXtpZighdGhpcy5LYil7dGhpcy5hZCgpO2lmKCF0aGlzLmtmJiYhdGhpcy5hZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMua2YmJnRoaXMuSmYmJiF0aGlzLkxmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LAp5ZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxXZjpmdW5jdGlvbigpe2lmKHRoaXMuYWQoKSl7dmFyIGI9dGhpcy55ZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLkxmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuSmY9Yi5ydn10aGlzLnJhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZigpfS5iaW5kKHRoaXMpLDEwMCl9LHV2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkh2KCk6ITF9LHVjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/CmIudWMoKTotMX0sRXA6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sZXA6ZnVuY3Rpb24oYixhKXt0aGlzLktiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuS2J8fDMwMj09dGhpcy5LYj90aGlzLmNhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5LYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuY2E/KHRoaXMudygpLHRoaXMucWEoKSk6Yi52ZSgpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkVwKGIpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGEoKX0uYmluZCh0aGlzKSwyRTMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLmlsfHxiYjsoZnVuY3Rpb24oYyl7Yy5rbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LHlxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkFsLlZtLlRtP3dpbmRvdy5PTy5BbC5WbS5UbS5wdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55cSgpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5RYT0xNTAwO3ZhciBiPWVhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLm9lKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBhYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgYmIoYywKdGhpcy5LKSkuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBjYj1jLmtsfHxjYixkYj1uZXcgY2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbM119Yy5icT1iO2IucHJvdG90eXBlPXtmaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ2k6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBlYj1jLmJxfHxlYixDYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5maSg0KTsoZnVuY3Rpb24oYyl7Yy5jaj1yLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLm9hPSExO3RoaXMuQmcoKX0sQmc6ZnVuY3Rpb24oKXt2YXIgYj0KITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5ZKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLm1oKCl9LG1oOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5janx8ZmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sWGY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLAp0aGlzLnFhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucWEoKTp0aGlzLnMoKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuWGYoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YZihhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5ianx8Z2I7KGZ1bmN0aW9uKGMpe2MuZGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKcGg6ZnVuY3Rpb24oYil7Yj1uZXcgZmIoYik7Yi5vYT90aGlzLlIoKTp0aGlzLk4oYil8fChiLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmZwfHwodGhpcy5mcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMucGgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnBoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5kanx8aGIsVT1uZXcgaGIocSk7VS5nKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs1XTt0aGlzLldpPXRoaXMuYVs3XTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLm5zPXRoaXMuYVs4XTt0aGlzLmN2PXRoaXMuYVszXTt0aGlzLnVsPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMuT2w9YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnVvOnRoaXMuVmkoYSl9LFZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XaTp0aGlzLmhpKGEpfSxoaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmlpOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5uczp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY3Y6dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMuT2x8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnRvKDQpOyhmdW5jdGlvbihjKXtjLlhsPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuWShiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LERjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5YbHx8VjsoZnVuY3Rpb24oYyl7Yy5XbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt5LlVjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eS5VYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLklyKGEpfS5iaW5kKHRoaXMpKTsKeS5VYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt5LlVjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eS5PcCgpfSxJcjpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnFhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTsKdGhpcy5xYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuV2x8fFc7KGZ1bmN0aW9uKGMpe2MuWWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMud2QmJihiPWUud28oYix0aGlzLndkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz0KYlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMud2R8fCh0aGlzLndkPVtdKSx0aGlzLndkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxVYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5iYXx8KHRoaXMuYmE9e30pO3RoaXMuYmFbYl18fCh0aGlzLmJhW2JdPXt9KTt0aGlzLmJhW2JdW2FdfHwodGhpcy5iYVtiXVthXT1bXSk7dGhpcy5iYVtiXVthXS5wdXNoKGMpfSxidTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmJhfHx0aGlzLmJhJiYhdGhpcy5iYVthXSl0aGlzLkFjfHwodGhpcy5BYz1bXSksdGhpcy5BYy5wdXNoKGIpLHRoaXMuWHMoKSYmKHRoaXMuVmUoKSx0aGlzLmcoKSk7CmVsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYmFbYV1bY10mJjA8dGhpcy5iYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmJhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5iYVthXVtjXVtkXShiKX19LE9wOmZ1bmN0aW9uKCl7aWYodGhpcy5BYylmb3IodmFyIGI9MDtiPHRoaXMuQWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5BY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYmFbY11bZF0mJjA8dGhpcy5iYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmJhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5iYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmCiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmJ1KGIpfX0pfSkoYyk7dmFyIGpiPWMuWWx8fGpiLHk9bmV3IGpiKHEpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3A9dGhpcy5hWzZdO3RoaXMuSG49dGhpcy5hWzEwXTt0aGlzLmlyPXRoaXMuYVsxMF07dGhpcy5FdT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs2XX1jLldtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vcDp0aGlzLkduKGEpfSxHbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSG46dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7CnZhciBrYj1jLldtfHxrYixFYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5ucCg0KTsoZnVuY3Rpb24oYyl7Yy5aaT1yLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuWShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApSYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuWml8fGxiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHwKYS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMubygibm9BZCIsInBsYXllZCIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuSSghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLiRpfHxtYjsoZnVuY3Rpb24oYyl7Yy5haj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPQpiW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBsYihkKTt0aGlzLk4oZyl8fCh0aGlzLlAoZyksKG5ldyBtYihnLHRoaXMuSykpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlIoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGE9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYi5zYigpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLmFqfHxuYixvYj1uZXcgbmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2w9dGhpcy5hWzZdO3RoaXMuWG89dGhpcy5hWzZdO3RoaXMud2o9dGhpcy5hWzNdO3RoaXMucm89dGhpcy5hWzVdO3RoaXMuaj0KdGhpcy5hWzJdfWMub3M9YjtiLnByb3RvdHlwZT17Zmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmdsOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ybzp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2o6dGhpcy5xbyhhKX0scW86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5vc3x8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpOwp0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5ZKGIpO3RoaXMuWihhKTt0aGlzLlFzKHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LFFzOmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmdGhpcy5oYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LEtnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuYWx8fHFiOyhmdW5jdGlvbihjKXtjLiRrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5ZaD0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpOwpiLmF1dG9zdGFydCYmIXRoaXMuWWgmJih0aGlzLkkoKSx0aGlzLlloPSEwLHRoaXMucGEoKSk7YS5GYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgcmI9Yy4ka3x8cmI7KGZ1bmN0aW9uKGMpe2MuYmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5ibHx8c2IsWD1uZXcgc2IocSk7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs1XTt0aGlzLk9xPXRoaXMuYVsyXTt0aGlzLkltPXRoaXMuYVs4XTt0aGlzLk9zPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs4XTt0aGlzLkFrPXRoaXMuYVszXTt0aGlzLnV0PXRoaXMuYVs3XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxXX1jLnVqPWI7Yi5wcm90b3R5cGU9e0p0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LdDp0aGlzLk5xKGEpfSxOcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3E6dGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkltOnRoaXMuTnMoYSl9LE5zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pczp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWWk6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkFrOgp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudXQ6dGhpcy5ubihhKX0sbm46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBuOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHRiPWMudWp8fHRiLEdjPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLkp0KDQpOyhmdW5jdGlvbihjKXtjLndtPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7CnZhciB1Yj1jLndtfHx1YjsoZnVuY3Rpb24oYyl7Yy52bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxQYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sUHM6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLlZhfHwodGhpcy5WYT1bXSk7dGhpcy5WYS5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucWEoKTp0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5qYz0KITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmdldFBsYXllcigpO3RoaXMueGE/dGhpcy5Qcyh0aGlzLnhhKToodGhpcy54YT10aGlzLlBiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LHM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMueGEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5qYyl7dGhpcy5JKCk7cmV0dXJufWI9ITA7aWYodGhpcy5WYSYmdGhpcy5WYS5sZW5ndGgmJjE8dGhpcy5WYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLlZhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLlZhW2FdJiYzMDMhPXRoaXMuVmFbYV0mJjQwMyE9dGhpcy5WYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucWEoKTsKZWxzZXt0aGlzLkkoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB2Yj1jLnZtfHx2YjsoZnVuY3Rpb24oYyl7Yy54bT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLlFhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHViKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5QKGMpLChuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMueG18fHdiLHhiPW5ldyB3YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuTnI9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMucmo9dGhpcy5hWzZdO3RoaXMuYXE9dGhpcy5hWzVdO3RoaXMuWnA9dGhpcy5hWzNdO3RoaXMuSnE9dGhpcy5hWzNdO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuUXE9dGhpcy5hWzRdO3RoaXMuaXU9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbOV19Yy5Gaj1iO2IucHJvdG90eXBlPXtNcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnI6dGhpcy5wayhhKX0scGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFrOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yajp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYXE6dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5acDp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSnE6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5Vajp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXE6dGhpcy5odShhKX0saHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLml1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgeWI9Yy5Ganx8eWIsSGM9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXIoNCk7KGZ1bmN0aW9uKGMpe2MuSmw9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuT2U9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5CcygpfS5iaW5kKHRoaXMpLDUwMCl9LEJzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuViYmdGhpcy5WKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuT2UmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuT2UpOwp0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sRnQ6ZnVuY3Rpb24oKXt0aGlzLk9lPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5KbHx8emI7KGZ1bmN0aW9uKGMpe2MuSWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmJjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLmtyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5iY3x8KHRoaXMuYmM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksCnRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuYmN8fHRoaXMuYmMrKyx0aGlzLmJjPD10aGlzLmtyPyh0aGlzLmJjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5GdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIEFiPWMuSWx8fEFiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5LbHx8QmIsQ2I9bmV3IEJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdtPXRoaXMuYVs0XTt0aGlzLmRsPXRoaXMuYVs4XTt0aGlzLnd0PXRoaXMuYVszXTsKdGhpcy5lcT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLldxPWI7Yi5wcm90b3R5cGU9e0ZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HbTp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZGw6dGhpcy52dChhKX0sdnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnd0OnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMuV3F8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZtKDQpOyhmdW5jdGlvbihjKXtjLkVsPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sS2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5WKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksCjIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLkVsfHxFYjsoZnVuY3Rpb24oYyl7Yy5EbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnBhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubW8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOwowPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlJxKCk6dGhpcy4kZigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LG1vOmZ1bmN0aW9uKCl7dGhpcy5IZigpfHx0aGlzLnMoITApfSxScTpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTshYi5sYSYmYi5XJiZiLm52JiZiLnF2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sJGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09CmI/KHRoaXMudygpLHRoaXMucWEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSwxMDApfSxuZDpmdW5jdGlvbigpe2lmKCF0aGlzLmdoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5naD1iW2NdKTtyZXR1cm4gdGhpcy5naH0sSXY6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKTp0aGlzLkkoKTp0aGlzLkkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuRGx8fEZiOyhmdW5jdGlvbihjKXtjLkZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLkZsfHxHYixIYj1uZXcgR2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbM119Yy5obj1iO2IucHJvdG90eXBlPXtHcjpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkhyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgSWI9Yy5obnx8SWIsSmM9bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuR3IoNCk7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5ZKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5uYSgpfWVsc2UgdGhpcy5uYSgpfSwKR3Y6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLlFiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LFJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxEYzpmdW5jdGlvbigpe3JldHVybiEwfSwKRmE6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuUGt8fFk7KGZ1bmN0aW9uKGMpe2MuT2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5RZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlFlJiZiIT10aGlzLlFlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUueWEoInRlbGU1LmRlIikmJgoicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubygiYWRlcnJvciIsYS5LdiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubygiYWRlcnJvciIpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuT2t8fFo7KGZ1bmN0aW9uKGMpe2MuUWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPwohMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5vYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5vYT90aGlzLlZlKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBHLEpiPWMuUWt8fEpiLEtiPW5ldyBKYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY3M9dGhpcy5hWzldO3RoaXMuUWw9dGhpcy5hWzldOwp0aGlzLkppPXRoaXMuYVsxXTt0aGlzLmpzPXRoaXMuYVs0XTt0aGlzLmtxPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMudmw9YjtiLnByb3RvdHlwZT17YnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jczp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFsOnRoaXMuSWkoYSl9LElpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5KaTp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExiPWMudmx8fExiLEtjPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLmJzKDQpOyhmdW5jdGlvbihjKXtjLkttPQpyLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5ZKGEpfWVsc2UgdGhpcy5uYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcucGxheSgpfSxSYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuS218fE1iOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFJzOmZ1bmN0aW9uKGIpe2ImJgpiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiYKYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKSl9LCRjOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxFZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy4kYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnJhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRWYuYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuUnMod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5FZigpfX0pfSkoYyk7dmFyIE5iPWMuSm18fE5iOyhmdW5jdGlvbihjKXtjLkxtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5vYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuTG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMub2k9dGhpcy5hWzZdO3RoaXMuenI9dGhpcy5hWzddO3RoaXMudXM9dGhpcy5hWzEwXTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLnF1PQp0aGlzLmFbNF07dGhpcy5Tbj10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbNl07dGhpcy5qaj10aGlzLmFbNV07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLiRvPWI7Yi5wcm90b3R5cGU9e3VuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMub2k6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnpyOnRoaXMudHMoYSl9LHRzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51czp0aGlzLmRrKGEpfSxkazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZWs6dGhpcy5wdShhKX0scHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnF1OnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5qajp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBRYj1jLiRvfHxRYixMYz1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy51big0KTsoZnVuY3Rpb24oYyl7Yy5kbT1yLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLmtoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSwKYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLnJyPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5uYSgpfWVsc2UgdGhpcy5uYSgpfWVsc2UgdGhpcy5uYSgpfSxQdjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sUmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LE86ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5raCYmKHRoaXMua2g9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgTz1jLmRtfHxPOyhmdW5jdGlvbihjKXtjLmNtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHhhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMua2UpaWYodGhpcy54Ynx8KHRoaXMueGI9MCksdGhpcy54YisrLDE1PHRoaXMueGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMucHQoKTp0aGlzLnMoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmtlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5jYXx8KHRoaXMubygiYWRlcnJvciIsdGhpcy5UKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMueGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgUD1jLmNtfHxQOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKTt0aGlzLlFhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBQKGIsdGhpcy5LKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFAoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBQKGIsdGhpcy5LKSxiLmcoKSkpO3RoaXMuVmUoKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBSYj1jLmVtfHxSYixTYj1uZXcgUmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGo9dGhpcy5hWzRdO3RoaXMuVnE9dGhpcy5hWzhdO3RoaXMua289dGhpcy5hWzddO3RoaXMuRnE9dGhpcy5hWzhdO3RoaXMuQm89dGhpcy5hWzddO3RoaXMuZHU9dGhpcy5hWzFdO3RoaXMuWGs9dGhpcy5hWzhdO3RoaXMuQW09dGhpcy5hWzZdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMuR2o9YjtiLnByb3RvdHlwZT17c2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnRqOnRoaXMuVXEoYSl9LFVxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5WcTp0aGlzLmpvKGEpfSwKam86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtvOnRoaXMuRXEoYSl9LEVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5GcTp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQm86dGhpcy5jdShhKX0sY3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmR1OnRoaXMuV2soYSl9LFdrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Yazp0aGlzLnptKGEpfSx6bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQW06dGhpcy55cyhhKX0seXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgVGI9Yy5Hanx8VGIsTWM9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuc2ooNCk7KGZ1bmN0aW9uKGMpe2MuQ2s9CnIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuWShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5ZKGEucGFyZW50Tm9kZSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGFhPWMuQ2t8fGFhOyhmdW5jdGlvbihjKXtjLkJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkdnPTA7dGhpcy5UPXRoaXMuVHx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmNhPXRoaXMud2M9dGhpcy54YT0KdGhpcy5XYz0hMTt0aGlzLm9oPWUuQmIoMTApO3RoaXMuUGcoKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubGE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLmpiKCksITA7dGhpcy5HZysrO2lmKDEwPHRoaXMuR2cpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMucyghMCk6dGhpcy5zKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5QZy5iaW5kKHRoaXMpLDEwMCksITF9LGpiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5sYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnJhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamIoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2F9LEFhOmZ1bmN0aW9uKCl7dGhpcy5jYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNhPyh0aGlzLncoKSx0aGlzLnFhKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkkoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJhPWMuQmt8fGJhOyhmdW5jdGlvbihjKXtjLkRrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBhYSh3aW5kb3cucGxheWVyKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgVWI9Yy5Ea3x8VWIsVmI9bmV3IFViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5scD10aGlzLmFbNl07dGhpcy5Laj10aGlzLmFbMV07dGhpcy5ybj10aGlzLmFbNV07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVszXX1jLlFtPWI7Yi5wcm90b3R5cGU9e2twOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuS2o6dGhpcy5xbihhKX0scW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJuOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuUW18fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLmtwKDQpOyhmdW5jdGlvbihjKXtjLlJqPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5uYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLlJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Raj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5aZigpfSxaZjpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmYoITApfS5iaW5kKHRoaXMpLAoxMDApKX19KX0pKGMpO3ZhciBZYj1jLlFqfHxZYjsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuU2p8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Obj10aGlzLmFbNF07dGhpcy5xcz10aGlzLmFbOV07dGhpcy5Ecj0KdGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbMTBdfWMuTXE9YjtiLnByb3RvdHlwZT17TW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5uOnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5DcihhKX0sQ3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5NcXx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuTW4oNCk7KGZ1bmN0aW9uKGMpe2MuYmk9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5uYSgpKTp0aGlzLm5hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBiYz1jLmJpfHxiYzsoZnVuY3Rpb24oYyl7Yy5haT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmJlKCk7dGhpcy5WZigpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmNhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxWZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnFhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmYuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJlLmJpbmQodGhpcyksMTAwKX0sYmU6ZnVuY3Rpb24oKXtpZighdGhpcy5yYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5wYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLnMoKTp0aGlzLnMoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmUuYmluZCh0aGlzKSwxMDApfX0sczpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBhLmJpbmQodGhpcyksMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5haXx8Y2M7KGZ1bmN0aW9uKGMpe2MuY2k9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLm9hP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlNhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5SKCl9fSl9KShjKTt2YXIgZGM9Yy5jaXx8ZGMsZWM9bmV3IGRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnV1PXRoaXMuYVs1XTt0aGlzLllxPXRoaXMuYVszXTt0aGlzLkhrPXRoaXMuYVs4XTt0aGlzLnZpPXRoaXMuYVs0XTt0aGlzLm9tPXRoaXMuYVs4XTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmV0PXRoaXMuYVs0XTt0aGlzLkxrPXRoaXMuYVsxMF07dGhpcy5EdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLklvPWI7Yi5wcm90b3R5cGU9e3R1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51dTp0aGlzLlhxKGEpfSxYcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWXE6dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Iazp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmk6dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9tOnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ObTp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy5LayhhKX0sS2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxrOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIGZjPWMuSW98fGZjLFBjPW5ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnR1KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlJnPQp0aGlzLlRnPXRoaXMuU2c9ITE7dGhpcy55ZD1bXTt0aGlzLlVlPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhiP251bGw6SGIsanc6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2E/bnVsbDp3YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFg/bnVsbDpYfX1jLnlsPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuR3AoYSk6W10sYjt0aGlzLlRnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLlNnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnRoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5VZSl7aWYodGhpcy5SZylicmVhaztiPXRoaXMuVWVbY107dGhpcy5uZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLnRoKGIpKX19LApuZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LEdwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLlVlW2NdLHRoaXMubmYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sdGg6ZnVuY3Rpb24oYSl7dGhpcy5uZihhKSYmYS5nKCl9LEh0OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiByJiYhdGhpcy5TZylmb3IodGhpcy5SZz0hMCxhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXS5GYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnlkW2FdLkZiKX19fSkoYyk7dmFyIGdjPWMueWx8fGdjLE09bmV3IGdjO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmttPXRoaXMuYVs0XTt0aGlzLlprPXRoaXMuYVsyXTsKdGhpcy56aT10aGlzLmFbNl07dGhpcy5pcT10aGlzLmFbMl07dGhpcy5wbD10aGlzLmFbMl07dGhpcy5MaT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxXX1jLkZpPWI7Yi5wcm90b3R5cGU9e2ptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbTp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnppOnRoaXMuaHEoYSl9LGhxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pcTp0aGlzLm9sKGEpfSxvbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucGw6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5GaXx8aGMsUWM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmptKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLnNjKGsuenUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLnNjKGsudnIpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKRS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IFIsbT0hMTtJLnhjKCk7SS5MZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkueGMoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLkxnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS54YygpO3ZhciBTYz1SYyhmdW5jdGlvbigpe2Uub2cod2luZG93LEkucnEoKSx7aWQ6U2N9KX0sNTAwKSxqYT1lLmVhKDEwKTtmYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5yaT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsxXX1jLmpwPWI7Yi5wcm90b3R5cGU9e3BpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYz1jLmpwfHxpYyxUYz1uZXcgaWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5waSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubGg9dGhpcy5jb25mPXRoaXMuZWI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnVkPTA7dGhpcy5VYT0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLm5oPSExO3RoaXMuUmU9W107ZS5nYigibmV3QWRkZWxpdmVyeSIpfWMuZGk9YjtiLnByb3RvdHlwZT17bXQ6ZnVuY3Rpb24oYSl7dGhpcy5saD0KYX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlVhPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxodDpmdW5jdGlvbihhKXt0aGlzLmViPWF9LGd0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuVWFdJiZ0aGlzLmNvbmZbdGhpcy5VYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlVhXVthXSk7cmV0dXJuIGJ9LEVjOmZ1bmN0aW9uKGEsYil7ZS55YSgid2VsdC5kZSIpJiZlLlRhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsCiJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5lYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLnNxKCkpdGhpcy5lYi5sKHRoaXMuZWIucGQsdGhpcy5lYi5DYSx0aGlzLmViLlRlLGZ1bmN0aW9uKCl7dGhpcy5FYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuZWIub2MpO2Vsc2UgaWYodGhpcy5RcCgpKXRoaXMuY3QoZnVuY3Rpb24oKXt0aGlzLkVjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5kZCx0aGlzLnBsYXllci51KCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuTnQoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5nYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBRYShsLHRoaXMuZWIsZyk7bC5mdCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7CmE9YShtKX0oYT10aGlzLmpyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuQmUmJihjPXRoaXMucGxheWVyLkJlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkRlKGEsYyxmKTt0aGlzLnBsYXllci52aChsKX19LHNxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy51ZC5nZXRUaW1lKCksdGhpcy51ZD1hLDNFNTxiPyEwOiExO3RoaXMudWQ9YTtyZXR1cm4hMX0senQ6ZnVuY3Rpb24oKXtlLmdiKCJwcmVyb2xsIik7ZS5ZZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLmtnKGEpKT90aGlzLkVjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmVkLHRoaXMucGxheWVyLnUoKSkpfSx5dDpmdW5jdGlvbihhKXtpZighdGhpcy5saCl7ZS5ZZSgicG9zdHJvbGwiKTtlLmdiKCJwb3N0cm9sbCIpO3RoaXMubXQoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMua2coYykpP3RoaXMuRWMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIudSgpKSl9fSxrZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEoYil9cmV0dXJuIGF9LFVzOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucnQodGhpcy55dC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxGZDpmdW5jdGlvbihhKXtlLmdiKCJtaWRyb2xsIik7ZS5ZZSgibWlkcm9sbCIpO2lmKCF0aGlzLlpnKXt0aGlzLlpnPSEwO3ZhciBiPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLkVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpnPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnUoKSkpfX0sVHM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5sdCh0aGlzLkZkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkdlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLnp0KCk7dGhpcy5wbGF5ZXIuR2UmJnRoaXMuVHMoKTsKdGhpcy5VcygpfSxWczpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLnpkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ldihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LGN0OmZ1bmN0aW9uKGEpe3RoaXMubmg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5Fcy5iaW5kKHRoaXMpKX0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuUmUucHVzaChhKTsKMD49dGhpcy5BZCYmdGhpcy5uaCgpfSxqcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5SZS5sZW5ndGg7YysrKWI9dGhpcy5SZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy5kaXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kbj10aGlzLmFbM107dGhpcy5Ebj10aGlzLmFbM107dGhpcy5CaT10aGlzLmFbMV07dGhpcy5tcj10aGlzLmFbNl07dGhpcy51bT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVszXX1jLlJrPWI7Yi5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kbjp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRG46dGhpcy5BaShhKX0sQWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJpOnRoaXMubHIoYSl9LApscjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubXI6dGhpcy50bShhKX0sdG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgamM9Yy5Sa3x8amMsVWM9bmV3IGpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuSW4oNCl9KS5jYWxsKE9ib29waGFleGVpRmlOZ2ksT2Jvb3BoYWV4ZWlGaU5naSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.72.187 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3.eu-central-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 02 Sep 2019 07:35:46 GMT
Last-Modified
Mon, 02 Sep 2019 04:46:02 GMT
Server
AmazonS3
x-amz-request-id
13B88EDA0DDCB23A
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
FFvlhY5fBPvaX3pmfHnUBX0HUP9FALbGfb+puS6Rxwrtk5Bg68J0+PS6dRQKfdlhV8dVuef/COk=
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 3442
265 B
437 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=4231115921
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9ib29waGFleGVpRmlOZ2k9T2Jvb3BoYWV4ZWlGaU5naXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3kuTGV8fCh5LkxlPTApO3kuTGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5MZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5UYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5kZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuWmUoYyk7YS5odChsKTthLmd0KG0pO2EuVnMoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkRiLmxlbmd0aCl7dmFyIGE9bC5EYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5udCh7IltMT0FEU0NSSVBUXSI6ZS5lYSgxMCksIltVVElMU10iOmUuZWEoMTApLCJbQ0FMTEJBQ0tdIjplLmVhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5YZy5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtxKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuWGcoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY3A9dGhpcy5hWzZdO3RoaXMuTHI9dGhpcy5hWzFdO3RoaXMuUWk9dGhpcy5hWzEwXTt0aGlzLkJ0PXRoaXMuYVs5XTt0aGlzLkNqPXRoaXMuYVs1XTt0aGlzLmdyPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuWGo9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmNwOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Mcjp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWk6dGhpcy5BdChhKX0sQXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJ0OnRoaXMuQmooYSl9LEJqOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuQ2o6dGhpcy5mcihhKX0sZnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaWE9Yy5Yanx8aWEsbGM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bGMuYnAoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW49ITE7dGhpcy5QYT0ic2V0dXAiO3RoaXMuSGM9W107dGhpcy5lZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkRzLmJpbmQodGhpcykpO3RoaXMuZmI9e307dGhpcy5GZz17fX1jLmprPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmZiKXRoaXMuZmIuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMuZmJbYl0rCiJfIik7cmV0dXJuIGF9LGdiOmZ1bmN0aW9uKGEpe3RoaXMuZmJbYV18fCh0aGlzLmZiW2FdPTApO3RoaXMuZmJbYV0rPTE7NTx0aGlzLmZiW2FdJiYhdGhpcy5GZ1thXSYmKHRoaXMuRmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5JdCgpLCEwKSl9LGVlOmZ1bmN0aW9uKCl7dGhpcy5hYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGZuOmZ1bmN0aW9uKGEpe3RoaXMuYWEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmCmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxrYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sRHM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuQ3MoYS5kYXRhKX0sQ3M6ZnVuY3Rpb24oYSl7aWYodGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYWEmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lciYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxYZDpmdW5jdGlvbihhLGIpe3RoaXMuYWEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxlZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnlwKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5XZyhhLAoiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LHlwOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LGRuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMuamEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09CmIpe2lmKGUubXAoYSkpcmV0dXJuOyhiPXRoaXMuZWcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmFhLnVybHNbYV09Yjt0aGlzLmFhLnVybHNbYl09YTt0aGlzLmFhLmhvbWFkVXJsc1thXT1iO3RoaXMuYWEub3JpZ2luYWxVcmxzW2JdPWF9fSxtcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5hYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxtZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLm9yaWdpbmFsVXJscyYmdGhpcy5hYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYWEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxBcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxvZTpmdW5jdGlvbihhKXtpZighYXx8CiJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sQWg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sT2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sd2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYKKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LHhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMud2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGUoYSl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOgoxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxxZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLApuLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEs9MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxwLG0sdSx4LHE7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7cD1hLmxlbmd0aDt2YXIgdD1bXTtmb3IoZj0wO2Y8cC0zO2YrPTQpbj1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx0LnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih0LnB1c2goZik7MTQhPXQubGVuZ3RoJQoxNjspdC5wdXNoKDApO3QucHVzaChwPj4+MjkpO3QucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx0Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXRbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO249ZTtwPWc7bT1rO3U9Szt4PWw7Zm9yKGY9MDsxOT49ZjtmKyspcT1kKG4sNSkrKHAmbXx+cCZ1KSt4K2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHg9dSx1PW0sbT1kKHAsMzApLHA9bixuPXE7Zm9yKGY9MjA7Mzk+PWY7ZisrKXE9ZChuLDUpKyhwXm1edSkreCtjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx4PXUsdT1tLG09ZChwLDMwKSxwPW4sbj1xO2ZvcihmPTQwOzU5Pj1mO2YrKylxPWQobiw1KSsocCZtfHAmdXxtJnUpK3grY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUseD11LHU9bSxtPWQocCwzMCkscD1uLG49cTtmb3IoZj02MDs3OT49ZjtmKyspcT1kKG4sNSkrKHBebV4KdSkreCtjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx4PXUsdT1tLG09ZChwLDMwKSxwPW4sbj1xO2U9ZStuJjQyOTQ5NjcyOTU7Zz1nK3AmNDI5NDk2NzI5NTtrPWsrbSY0Mjk0OTY3Mjk1O0s9Syt1JjQyOTQ5NjcyOTU7bD1sK3gmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihLKStiKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLG4sYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxuPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8bj4+NixnPW4mNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKG4pJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0seHE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxxYzpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLG49ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTGI/ITA6CiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhLGw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LHRwOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5xYygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOgpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxoYjpmdW5jdGlvbigpe3ZhciBhPXtNaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxlajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxYcDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx5bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sClBuOmZ1bmN0aW9uKCl7cmV0dXJuIGEuTWkoKXx8YS5laigpfHxhLlhwKCl8fGEubGwoKXx8YS55bSgpfX07cmV0dXJuIGEuUG4oKX0samE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxuPWEubGVuZ3RoO2Y8bjsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxRYjpmdW5jdGlvbihhKXthPXRoaXMuamEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSx5YTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LElwOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LApiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLmphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sd286ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxuPTA7bjxiLmxlbmd0aDtuKyspZFtiW25dXT0hMDtmb3Iobj0wO248YS5sZW5ndGg7bisrKWRbYVtuXV18fGYucHVzaChhW25dKTtyZXR1cm4gZn0sRXQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxxZzpmdW5jdGlvbihhKXthPQpNYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLk9oKGIpKyI6Iit0aGlzLk9oKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sWWU6ZnVuY3Rpb24oYSl7dGhpcy5QYT1hfSxvZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLlBhO3RoaXMuUGYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LHNjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5vZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSwKYixkLGYsbixjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5TYShiLGQpKTtiJiYoQj1rLlNhKGEsYikpO2YmJihCPWsuU2EoQixmKSk7biYmKEI9ay5TYShCLG4pKTtjJiYoQj1rLlNhKEIsYykpO2cmJihCPWsuU2EoQixjKSk7ZS5zYyhCKX0sRnM6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlJiYxMDIzIT1hLmNvZGUmJjEwMTghPWEuY29kZSl7dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuSXAoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0KMjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn19LFBmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRnMoYSk7aWYoYilpZighbHx8IWwuWCl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuQmQoKTtsLndhKGEsITApO2E9bC53YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLklhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwKIWwuWCl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9YStiO3RoaXMuSmN8fCh0aGlzLkpjPXt9KTt0aGlzLkpjW2ZdfHwodGhpcy5KY1tmXT0wKTt0aGlzLkpjW2ZdKys7MTA8dGhpcy5KY1tmXXx8KGY9bC5CZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC53YShmLCEwKSxmPWwud2EoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPQohMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSkpfX0sRWU6ZnVuY3Rpb24oKXtsJiZsLlg/bC5pc0VuYWJsZWQmJmwuYm8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWUoKX0uYmluZCh0aGlzKSw1MDApfSxtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHBlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIn0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFRmOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi56ZShhKXx8dGhpcy5BcShhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LldlJiZ3aW5kb3cuc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LldlWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LldlWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLm1nKGEpKXJldHVybiB0aGlzLm1nKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9OwpuLmhvbWFkX3VybF9zdWZmaXg9YTtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYSk7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlRhKGEsYi5HYSxuLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5zZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5kbihjLGEpO3JldHVybiBjfSwKVGE6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZSxnKXt2YXIgaz1jfHxsO2M9ITA7ZyYmKGM9ITEpO2lmKGsmJmsuWClpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe24obSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKW4oKTtlbHNle2sud2EoYSxjKTtjPWsud2EoYSxjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWMuZGF0YVtxXT1kW3FdO3JldHVybiBrLklhKGMsZixuLCIiLCIiLGUpfX1lbHNlIG4oKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYShhLGIsZCxmLG4sayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LFdnOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7CmQ9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocSl7YyYmYygpfXJldHVybiBsfSxicjpmdW5jdGlvbihhLGIsZCl7dGhpcy5XZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5IYylmb3IodmFyIGMgaW4gdGhpcy5IYylhPWEuc3BsaXQoYykuam9pbih0aGlzLkhjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucmIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxYZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLlRhKGEsZi5HYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuYnIoZi5zZCgpLnJlcGxhY2UoIltoYXNoXSIsCmEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkhjPWF9LGV2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5UYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsCm1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxRbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sdnE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlNhPQpmdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IudnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IudXI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVnU9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5Ubz17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmF2PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTmY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuR2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTsKYi5LZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuWG09e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuSWY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5DdT17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudHI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVW89e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLld1PQp7Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5iZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLm9vPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLmRkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5NZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuWm09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlJjPQp7Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuVWQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuV2Q9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLlltPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5WaD17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLkFyPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudmQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IubGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuVXU9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuenU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi52cj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5pa3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbOV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5Jaj10aGlzLmFbOV07CnRoaXMubW49dGhpcy5hWzRdO3RoaXMuVmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOF19Yy5Uaz1iO2IucHJvdG90eXBlPXtSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU286dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhpOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kdTp0aGlzLkhqKGEpfSxIajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSWo6dGhpcy5sbihhKX0sbG46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1uOnRoaXMuVWwoYSl9LFVsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5WbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVGt8fGthLG1jPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1tYy5Sbyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtrPWI7Yi5wcm90b3R5cGU9e3FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxzYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5tZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm1kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0seGM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5xZSh0aGlzLnNiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhjKCkrIjIifSxMZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnFlKHRoaXMuQ3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5tZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ra3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DbT10aGlzLmFbNF07dGhpcy5waj10aGlzLmFbNF07dGhpcy5UcD10aGlzLmFbN107dGhpcy5IcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5Taz1iO2IucHJvdG90eXBlPXtCbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ206dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5wajp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHA6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLlNrfHxsYSxuYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1uYy5CbSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubTt0aGlzLm09ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm09aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuaGo9Yn0pKGMpO3ZhciBMPWMuaGp8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubW09dGhpcy5hWzNdO3RoaXMuZ2s9dGhpcy5hWzhdO3RoaXMuZXM9dGhpcy5hWzJdO3RoaXMuVGw9dGhpcy5hWzldO3RoaXMuRG89dGhpcy5hWzldO3RoaXMuc3U9dGhpcy5hWzJdOwp0aGlzLkprPXRoaXMuYVs2XTt0aGlzLmtuPXRoaXMuYVs4XTt0aGlzLmdtPXRoaXMuYVsxXTt0aGlzLllyPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuSnI9YjtiLnByb3RvdHlwZT17bG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nazp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZXM6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5UbDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRG86dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnN1OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua246dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5nbTp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYT1jLkpyfHxtYSxvYz1uZXcgbWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1vYy5sbSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLnhsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuSmE9e307dGhpcy5LPW51bGw7dGhpcy5DYz0xMDA7dGhpcy5DYj0wO3RoaXMuUWE9MTUwO3RoaXMuRmI9MDt0aGlzLml0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5DYjw9dGhpcy5RYT8odGhpcy5DYisrLHRoaXMuRmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5DYykpOjA+dGhpcy5RYSYmKHRoaXMuRmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCnRoaXMuQ2MpKX0sWHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYj50aGlzLlFhPyEwOiExfSxWZTpmdW5jdGlvbigpe3RoaXMuQ2I9MH0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGl0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxBcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LFA6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLk8oKSwhMCk7dGhpcy5KYVtiLnNiKCldPWI7TSYmTS5UZyYmTS5IdChiKX0sQXY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5vZSh0aGlzLkphKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkphW2Iuc2IoKV0/ITA6ITF9LHdxOmZ1bmN0aW9uKGIpe2I9Yi5GYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkphKWlmKGIuaWQ9PXRoaXMuSmFbYV0uRmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sT3Y6ZnVuY3Rpb24oYil7dGhpcy5KYVtiLmlkXT0KbnVsbH19KX0pKGMpO3ZhciB0PWMueGx8fHQ7KGZ1bmN0aW9uKGMpe2Muemw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5DYz0xMDt0aGlzLkNiPTA7dGhpcy5RYT01MDt0aGlzLlY9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy53Yj0iIjt0aGlzLmdnPSExO3RoaXMuUygpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuRmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sS2E6ZnVuY3Rpb24oKXt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxCdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LGx0OmZ1bmN0aW9uKGIpe3RoaXMuSGU9CmJ9LHp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGV9LEdlOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5DYjw9dGhpcy5RYSYmKHRoaXMuQ2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSx0aGlzLkNjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LAp0ZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxzYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LFF2OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlJwKCl8fHRoaXMuJG0oKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sQ3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sJG06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sUnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09CnR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxSYTpmdW5jdGlvbigpe3JldHVybiExfSxKdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxuYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LERjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmCmIubXV0ZWQ/Yi5tdXRlZDohMX0sQmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdmg6ZnVuY3Rpb24oYil7dGhpcy53Yj1ifSx5djpmdW5jdGlvbigpe3JldHVybiB0aGlzLndifSxyaDpmdW5jdGlvbigpe3RoaXMud2I9bnVsbH0sRXY6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLndiJiYoYj0hMCk7cmV0dXJuIGJ9LEx2OmZ1bmN0aW9uKCl7dGhpcy5nZ3x8KHRoaXMuZ2c9ITApfSxsZTpmdW5jdGlvbigpe3JldHVybiExfSx2djpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHI9Yy56bHx8cjsoZnVuY3Rpb24oYyl7Yy5laT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLkNmPSIxIjt0aGlzLkRmPSIyIjt0aGlzLlVtPSIzIjt0aGlzLk1jPTA7dGhpcy4kZz0zMDt0aGlzLkpiPVtdO3RoaXMuWmE9W107CnRoaXMuZWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuUWY9dGhpcy5SaD0hMTt0aGlzLnN0YXR1cz10aGlzLk1jO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy5aZShiKTt0aGlzLmp0KGEpfSxnOmZ1bmN0aW9uKCl7fSxxYTpmdW5jdGlvbigpe3RoaXMuUmh8fCh0aGlzLlJoPSEwLGUuRWUoKSl9LEtlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5PKCk7UyYmUy5TYiYmIW5hJiYobmE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sSTpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtyZXR1cm4gdGhpcy5yYSgpPyExOih0aGlzLm90KCksdGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCksdGhpcy5LaCgpLHRoaXMuUWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLnJhKCl8fCh0aGlzLkpiLnB1c2goYiksCnRoaXMuWmEucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LEtoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5KYiYmMDx0aGlzLkpiLmxlbmd0aCYmKHRoaXMuSmI9ZS51bmlxdWUodGhpcy5KYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuSmIuam9pbigiLCIpKSk7aWYodGhpcy5aYSl7Zm9yKHZhciBoPTA7aDx0aGlzLlphLmxlbmd0aDtoKyspdGhpcy5lY1t0aGlzLlphW2hdLnJlYXNvbl09PXRoaXMuZWNbYl0mJmEucHVzaCh0aGlzLlphW2hdLmRldGFpbCksdGhpcy5lY1t0aGlzLlphW2hdLnJlYXNvbl08dGhpcy5lY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuWmFbaF0uZGV0YWlsKSxiPXRoaXMuWmFbaF0ucmVhc29uKTt0aGlzLmVjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sRHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZn0sCnc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNmfSxvdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGZ9LHB0OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5VbX0scGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1jfSxIZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5DZn0sbHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRGZ9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLk1jfSxaZTpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGp0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxBcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LGVyOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5laXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuWmo9dGhpcy5hWzJdO3RoaXMuWm89dGhpcy5hWzddO3RoaXMuTG89dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNV19Yy5obD1iO2IucHJvdG90eXBlPXtZajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWmo6dGhpcy5ZbyhhKX0sWW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpvOnRoaXMuS28oYSl9LEtvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Mbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9hPWMuaGx8fG9hLHBjPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBjLllqKDQpOyhmdW5jdGlvbihjKXtjLk1qPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7CnRoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBwYT1jLk1qfHxwYTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIubXY7YT9hLmxhP2EubGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYKKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnFhKCkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMubygiZnJhbWV3b3JrIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcWE9Yy5Oanx8cWE7KGZ1bmN0aW9uKGMpe2MuT2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBwYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IHFhKGIsdGhpcy5LKSkuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciByYT1jLk9qfHxyYTsobmV3IHJhKHEpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHM9dGhpcy5hWzddO3RoaXMua2k9dGhpcy5hWzFdO3RoaXMuTXQ9dGhpcy5hWzFdO3RoaXMueWo9dGhpcy5hWzFdO3RoaXMuRHE9dGhpcy5hWzldO3RoaXMuem89dGhpcy5hWzJdO3RoaXMubWo9dGhpcy5hWzJdO3RoaXMuRnI9dGhpcy5hWzRdO3RoaXMuSHM9dGhpcy5hWzVdOwp0aGlzLmo9dGhpcy5hWzddfWMuSm89YjtiLnByb3RvdHlwZT17a3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxzOnRoaXMuamkoYSl9LGppOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5raTp0aGlzLkx0KGEpfSxMdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTXQ6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlqOnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EcTp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem86dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1qOnRoaXMuRXIoYSl9LEVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gcjp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBzYT1jLkpvfHwKc2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMua3MoNCk7KGZ1bmN0aW9uKGMpe2Mudms9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5UYj0hMTt0aGlzLmxnKCk7dGhpcy5uZygpO3RoaXMubm89ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5UYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuVGI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuWShiKX0sbmc6ZnVuY3Rpb24oKXtpZighdGhpcy5UYil7dmFyIGI9dGhpcy5GYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fCh0aGlzLlRiPSEwKTt0aGlzLlooYSl9fSxLYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sCkdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLkhlJiYoMCx0aGlzLkhlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fAoicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmCihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMudmt8fHRhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NYzt0aGlzLmlzUGxheWluZz10aGlzLk9jPSExO3RoaXMuVmQ9MTt0aGlzLlBjPVtdO3RoaXMucGI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLk9jPSExO3RoaXMuVmQ9MTt0aGlzLlBjPVtdO3RoaXMucGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmCih0aGlzLlZkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5wYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMucGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMucGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnBiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5PYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuS2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLiRnJiYhdGhpcy5yYSgpJiYodGhpcy5wYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnJhKCkmJih0aGlzLnBhKCksdGhpcy5nZXRQbGF5ZXIoKS5ubz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkud2I7YSYmKGEueGQoKSxhLmZkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLk9jPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5LZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpOwppZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuJGcmJiF0aGlzLnJhKCkmJih0aGlzLnBiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5QYy5pbmRleE9mKGEpJiZ0aGlzLlBjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucWEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOgoodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuUGMubGVuZ3RoPj10aGlzLlZkJiZ0aGlzLnMoKSl9LGVyOmZ1bmN0aW9uKGIpe3RoaXMubSgiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMuaWU/dGhpcy5pZSsrOnRoaXMuaWU9MTp0aGlzLmhlP3RoaXMuaGUrKzp0aGlzLmhlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkFoKGEudmlkZW9UYWcpP2EuVGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5PY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuaGU+dGhpcy5pZSYmKGI9ITEpLHRoaXMuSShiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksNTApOihhLmxnKCksYS5uZygpLGEuVGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdWE9Yy51a3x8dWE7KGZ1bmN0aW9uKGMpe2Mud2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWUuamEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMud3AoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPQpbXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyB0YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy53cShoKXx8KHRoaXMuUChoKSxoPW5ldyB1YShoLHRoaXMuSyksaC5TKCksaC5nKCkpfX10aGlzLlIoKX19LHh2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHdwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5qYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5yYihiLmFuY2hvcil9fSl9KShjKTt2YXIgdmE9Yy53a3x8dmEsd2E9bmV3IHZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdqPQp0aGlzLmFbOF07dGhpcy5mdT10aGlzLmFbMTBdO3RoaXMuUnI9dGhpcy5hWzRdO3RoaXMueHM9dGhpcy5hWzhdO3RoaXMuRms9dGhpcy5hWzddO3RoaXMuU2k9dGhpcy5hWzddO3RoaXMubmw9dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzEwXTt0aGlzLmFrPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzFdfWMuc3M9YjtiLnByb3RvdHlwZT17Zmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdqOnRoaXMuZXUoYSl9LGV1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Gazp0aGlzLlJpKGEpfSxSaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuU2k6dGhpcy5tbChhKX0sbWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5ubDp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFrOnRoaXMuVm4oYSl9LFZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHhhPWMuc3N8fHhhLHJjPW5ldyB4YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJjLmZqKDQpOyhmdW5jdGlvbihjKXtjLnJtPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlkoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5uYSgpKTp0aGlzLm5hKCl9ZWxzZSB0aGlzLm5hKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlYmJnRoaXMuVigpfSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sUmE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MucW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYiwKYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuY2E9dGhpcy53Yz10aGlzLnhhPXRoaXMuV2M9ITE7dGhpcy5vaD1lLkJiKDEwKTt0aGlzLlFoPSEwO3RoaXMuamM9dGhpcy5JZz0hMTt0aGlzLnNyKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5kaCgpLHRoaXMuWm4oKSx0aGlzLmpiKCkpfSxzcjpmdW5jdGlvbihiKXtyZXR1cm4gZS55YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxNdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuc2IoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuVywiOyIsdHlwZW9mIGIuVywiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5XP2IuVy5zdGF0ZToKInVuZGVmaW5lZFgiLCI7IixiLlc/dHlwZW9mIGIuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuRGE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuRGE6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5EYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5EYT9iLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkRhP3R5cGVvZiBiLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5EYT9iLkouRGEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkRhP3R5cGVvZiBiLkouRGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlNkOiJ1bmRlZmluZWRYIiwKIjsiLGIuSj90eXBlb2YgYi5KLlNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuVGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuVGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5UZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLmxhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmxhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmxhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoubGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLllkOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWWQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLm9oKX0sdGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFBiOmZ1bmN0aW9uKCl7aWYoIXRoaXMubGEpe3ZhciBiPXRoaXMudGIoKTsKYiYmKGIuYWRzTG9hZGVyJiYodGhpcy5sYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5sYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5sYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5sYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5sYX0sd2c6ZnVuY3Rpb24oKXtpZighdGhpcy53Yyl7dmFyIGI9dGhpcy50YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLndjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy53Yz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLndjfSx1cTpmdW5jdGlvbigpe2lmKCF0aGlzLkhnKXt2YXIgYj10aGlzLnRiKCksYT10aGlzLnRxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5IZz0hMCl9cmV0dXJuIHRoaXMuSGd9LAp0cTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuV2MmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLldjPSEwKTtyZXR1cm4gdGhpcy5XY30samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlBiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuU3MoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMucmEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qYigpfS5iaW5kKHRoaXMpLDIwKX0sU3M6ZnVuY3Rpb24oKXt0aGlzLmpjPSEwO3ZhciBiPXRoaXMud2coKTtpZihifHx0aGlzLnJhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsCmZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLmhiKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMua2M9ITA7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5rYz0hMDtpZihlLnlhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMua2M9ITA7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMua2M9ITA7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMua2M9ITA7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmtjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuZmEoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpiKCl9LmJpbmQodGhpcyksMjApfSx3djpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuZGcmJmIuYWRzJiYodGhpcy5kZz1iLmFkcyk7cmV0dXJuIHRoaXMuZGd9LFpuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYSgpO3RoaXMuZmEoITApO3RoaXMubygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5YKWhvbWFkVXRpbHMuSGEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMud2coKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMudXEoKSl7dmFyIGE9dGhpcy50YigpLGg9dGhpcy5QYigpO2EmJmgmJih0aGlzLnRiKCksdGhpcy5QYigpLHRoaXMuamN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qYz90aGlzLncoKToodGhpcy5mYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMudGIoKX1lbHNlIHRoaXMuSWc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnRiKCksYj10aGlzLlBiKCk7YSYmIWI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwKMTAwKTp0aGlzLklnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5yYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGgoKX0uYmluZCh0aGlzKSw1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTticmVha319LCRuOmZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLm5jIT1iLmFkcy5zdGF0ZSYmKHRoaXMubmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMubmMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5uYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJG4oKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2F9LApBYTpmdW5jdGlvbigpezA8PWUuUWIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuVD8odGhpcy5jYT0hMCx0aGlzLnMoITApKToodGhpcy5jYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jYT8odGhpcy53KCksdGhpcy5xYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLnJhKCl8fChifHwodGhpcy5RaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkkodGhpcy5RaCxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZm86ZnVuY3Rpb24oKXt0aGlzLkZ2fHwoMTA8dGhpcy5IdT8odGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5IdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLldzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZvKCl9LmJpbmQodGhpcyksNTApKSl9LFdzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLkl1KXt0aGlzLkl1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSwKNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHphPWMucW18fHphOyhmdW5jdGlvbihjKXtjLnNtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLkJoKHdpbmRvdyk7CmZvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuQmgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuUigpfX0sQmg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5vZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB5YShiW2hdKSxhLm9hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUChhKSwobmV3IHphKGEsdGhpcy5LKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFI6ZnVuY3Rpb24oKXt0aGlzLkZiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuQ2MpfX0pfSkoYyk7dmFyIEFhPWMuc218fEFhLEJhPW5ldyBBYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGk9dGhpcy5hWzhdO3RoaXMuVHE9dGhpcy5hWzEwXTt0aGlzLldqPXRoaXMuYVsyXTt0aGlzLkhsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzFdfWMuZHY9YjtiLnByb3RvdHlwZT17d2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhpOnRoaXMuU3EoYSl9LFNxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5UcTp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuV2o6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQ2E9Yy5kdnx8Q2Esc2M9bmV3IENhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2Mud2koNCk7CihmdW5jdGlvbihjKXtjLnJsPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuTWU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLm5hKCk7cmV0dXJufXRoaXMuWShhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMubmEoKX0sQXM6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy53YixoPXRoaXMuc2IoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuU2ImJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fAoodGhpcy5NZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LFJhOmZ1bmN0aW9uKCl7dGhpcy5NZSsrO2lmKDEwPHRoaXMuTWUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJgp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTpiLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmlmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxLYTpmdW5jdGlvbigpe30sSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX19KX0pKGMpO3ZhciBEYT1jLnJsfHxEYTsoZnVuY3Rpb24oYyl7Yy5xbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLmtlKWlmKHRoaXMueGJ8fCh0aGlzLnhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJgp0aGlzLnhiKyssMTU8dGhpcy54Yil0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLmtlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmNhfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlQpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGEoKX0uYmluZCh0aGlzKSwxMCk7CmVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5UPXRoaXMuVHx8ITE7dGhpcy54YSgpO3ZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuYXA/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnBhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnBhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5wYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy5hcD0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihhKXtiLkFzKGEpfS5iaW5kKHRoaXMpKSk6Yi5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuSShiKX19KX0pKGMpO3ZhciBFYT1jLnFsfHxFYTsoZnVuY3Rpb24oYyl7Yy5zbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlFhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJgowPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IERhKGJbYV0pO2gub2F8fHRoaXMuTihoKXx8KHRoaXMuUChoKSwobmV3IEVhKGgsdGhpcy5LKSkuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBGYT0KYy5zbHx8RmEsR2E9bmV3IEZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRsPXRoaXMuYVsxXTt0aGlzLkFqPXRoaXMuYVsyXTt0aGlzLm1xPXRoaXMuYVs4XTt0aGlzLnhyPXRoaXMuYVsxXTt0aGlzLmJtPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzhdfWMuU3I9YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRsOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bajp0aGlzLmxxKGEpfSxscTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1xOnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHI6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9CmMuU3J8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLlpsKDQpOyhmdW5jdGlvbihjKXtjLnNrPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLnVnKGIsImVsZW1lbnRJRCIpO3RoaXMuamg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT0KdGhpcy5qaD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5qaD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5sZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmxkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZW86ZnVuY3Rpb24oKXtlLk9nKHRoaXMubGQpO2Uud2UodGhpcy5sZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5za3x8SWE7KGZ1bmN0aW9uKGMpe2Mucms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTsKdGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLnJrfHxKYTsoZnVuY3Rpb24oYyl7Yy50az10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlFhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS51ZyhiLCJlbGVtZW50SUQiKTtlLk9nKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkZiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkZiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLnRrfHxLYSxMYT1uZXcgS2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueWs9dGhpcy5hWzddO3RoaXMuTWw9dGhpcy5hWzldOwp0aGlzLlByPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMub2s9YjtiLnByb3RvdHlwZT17eGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NbDp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTWE9Yy5va3x8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMueGsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmxrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPQphfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LGFuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMubGt8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxoLGQsZil7dGhpcy5YYT1hO3RoaXMucGc9dGhpcy4kaD0hMTt0aGlzLmVoPWQ7dGhpcy5DaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5YYT1uZXcgeihhKSk7dmFyIGM9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5BZSh0aGlzLlhhLnVybCkmJgpsLktkKXt2YXIgZT1uZXcgeihhLnVybCk7ZS5rdCgiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoZSxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChoKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMubWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMucGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkNoPwp0aGlzLmxiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMubGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy4kaHx8KHRoaXMubGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5BZSh0aGlzLlhhLnVybCk/bC5LZD9sLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkFlKHRoaXMuWGEudXJsKSx0aGlzLmVoJiZ0aGlzLmVoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBOYT1jLm1rfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9CiExO3RoaXMubWM9IiI7dGhpcy5aZD10aGlzLmxjPXRoaXMucWI9bnVsbDt0aGlzLnhvPXRoaXMuRGI9dGhpcy5WZz0hMTt0aGlzLkdhPSIiO3RoaXMuUWc9ITE7dGhpcy5DYT10aGlzLnBkPSIiO3RoaXMuTWc9dGhpcy5YPXRoaXMuaXNFbmFibGVkPXRoaXMuVGU9ITE7dGhpcy56YT1bXTt0aGlzLkNnPXRoaXMuV2I9IiI7dGhpcy5nZT0hMTt0aGlzLmdmPTA7dGhpcy54Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLnZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5JYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5kYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy53Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuWWI9IiI7dGhpcy5FYj1bXTt0aGlzLlpiPVtdO3RoaXMuWGI9IiI7dGhpcy5oZj0wO3RoaXMudmlkZW9wbGF6YT0Ke307dGhpcy52Yz0hMTt0aGlzLmhvPXRoaXMuTGQ9bnVsbDt0aGlzLnloPXRoaXMuS2M9dGhpcy5pZz10aGlzLm1mPXRoaXMuS2Q9dGhpcy5hZT10aGlzLk5jPSExO3RoaXMuJGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucmQ9MDt0aGlzLkVnPSExO3RoaXMuRGc9MUUzO3RoaXMuWWM9ITE7dGhpcy5NYT0xRTM7dGhpcy5GZj0iIn1jLm5rPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkhhLGFkdGFncGFyYW1ldGVyOnRoaXMubWMsYWR0YWdtb2RpZmllcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5sYyxhZHRhZ3JlZ2V4OnRoaXMuWmQsYml0cmF0ZTp0aGlzLk1hLGpzcG9wdXBzOnRoaXMuVmcsc2lkZWxvYWRzOnRoaXMuRGIsZGlzYWJsZXRlc3RzOnRoaXMueG8saG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5RZyxnbG9iYWxDb25maWc6dGhpcy5wZCxjbGllbnRDb25maWc6dGhpcy5DYSwKaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5YLGlzQmxvY2tlZDp0aGlzLk1nLHNlcnZlcjp0aGlzLnphLHN2bUNvbmZpZzp0aGlzLldiLGhvbWFkQWRwYXRoOnRoaXMuQ2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5nZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5nZixIT01BRF9WRVJJRklFRDp0aGlzLnhmLEhPTUFEX0JMT0NLRUQ6dGhpcy52ZixIT01BRF9OT0JMT0NLRVI6dGhpcy5JYixIT01BRF9BREJMT0NLRVI6dGhpcy5kYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMud2YsdGVzdEhpZGU6dGhpcy5ZYix0ZXN0VGFnczp0aGlzLkViLHRlc3RUYWdzSlM6dGhpcy5aYix0ZXN0Q29va2llOnRoaXMuWGIsdGhyb3R0bGU6dGhpcy5oZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnZjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuaG8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5OYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuYWUsCnVzZVN0cmljdENoZWNrczp0aGlzLktkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLm1mLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuJGEsc2l0ZUNvbmZpZzp0aGlzLldhLHNlcnZlcklkOnRoaXMudWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLnJjLHZwYWlkOnRoaXMuS2Msc2tpcEFsbG93ZWQ6dGhpcy55aCx2bWFwczp0aGlzLldoLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5ZYyxhZEZhbGxiYWNrVVJMOnRoaXMuRmZ9fSxQcDpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2JdJiYxPT10aGlzLiRhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LFhlOmZ1bmN0aW9uKGEpe3RoaXMuJGFbYV09ITB9LHhwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sSWQ6ZnVuY3Rpb24oYSl7YT0KYXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkJiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuUW4oYSl9LHdhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5IYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2Y9dGhpcy56ZShhKTtjPXRoaXMuamEoYSk7Zj8odGhpcy55YygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9CmMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuQmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy5tY3x8dGhpcy5xYnx8dGhpcy5sY3x8dGhpcy5aZCkmJihnPXRoaXMub3IoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy56cChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihnKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy55YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHljOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnphJiZ0aGlzLnphLmxlbmd0aCYmMDx0aGlzLnphLmxlbmd0aCYmKGI9dGhpcy56YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxBZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLnplKGEpO3JldHVybiBifSx6cDpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sCmIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuc3Y7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphW3RoaXMudWhdfSxCZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxiPXRoaXMueGgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sYWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sbnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksCmY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMuYWgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLmFoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sb3I6ZnVuY3Rpb24oYSl7dGhpcy5tYyYmKGErPXRoaXMubWMpO2lmKHRoaXMucWIpZm9yKHZhciBiIGluIHRoaXMucWIpdGhpcy5xYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5xYltiXSkpO3RoaXMubGMmJihhPXRoaXMubnIoYSx0aGlzLmxjKSk7cmV0dXJuIGF9LApsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5RZz0hMDt0aGlzLnBkPWE7dGhpcy5DYT1iO3RoaXMuVGU9ZDt0aGlzLkxkPWY7dGhpcy5vYz1jO3RoaXMuV2E9ZXx8e307dGhpcy5hcigpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5DYSl0aGlzLlpxKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkNhKXRyeXt0aGlzLkNhPWIoKSx0aGlzLmJkKCl9Y2F0Y2goZyl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LGliOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxhcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5wZCt0aGlzLlRjKCJnbG9iYWwiKSksdGhpcy5OcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiYKdGhpcy5iZCgpfS5iaW5kKHRoaXMpLCEwKX0sWnE6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLkNhK3RoaXMuVGMoImNsaWVudCIpKTt0aGlzLklhKG5ldyB6KHRoaXMuQ2ErdGhpcy5UYygiY2xpZW50IikpLHRoaXMuYmQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGUoImNsaWVudCIpO3RoaXMuaWEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LFRjOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLkJiKCk7dGhpcy5XYSYmdGhpcy5XYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuV2EmJnRoaXMuV2Eubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxpYTpmdW5jdGlvbihhKXtpZighdGhpcy5hZSl7dGhpcy5hZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJgphW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsKIjRwbGF5ZXJzLmRlIj09ZS5RYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMub2M9ITEpO3RoaXMub2MmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5vYz90aGlzLm9jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlg9dGhpcy5NZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuaWIodGhpcy52ZikpO3RoaXMuR2IoKTtlLnNjKGsudnMpOyhiPWUuUWIodGhpcy5zZCgpKSl8fChiPWUuUWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE5wOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuJGIoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8CnRoaXMuV2J8fHRoaXMuR2F8fHRoaXMuYmQoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmliKHRoaXMuSWIpKSx0aGlzLkdiKCkpfX0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5DYX1lbHNlIGE9dGhpcy5DYTt0aGlzLmlzRW5hYmxlZD10aGlzLiRiKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLnphPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy56YS5sZW5ndGg7YisrKXRoaXMuemFbYl09dGhpcy56YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5XYj1hLmNvbmZpZ3x8IiI7dGhpcy5HYT1hLmFsaWFzfHxudWxsO3RoaXMuQ2c9YS5hZHBhdGh8fCIiO3RoaXMuZ2U9YS5kaXNhYmxlY29va2lldGVzdHx8CiExO3RoaXMudWg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuemEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5XYiYmdGhpcy5HYSYmdGhpcy56YS5sZW5ndGg/dGhpcy56YyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5YPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5pYih0aGlzLkliKSksdGhpcy5HYigpKX0semM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5CZCgpKSxkPXRoaXMuamEodGhpcy5XYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLldiK3RoaXMuVGMoImN1c3RvbWVyIikpO3RoaXMuSWEoYiwKdGhpcy5PdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY3VzdG9tZXIiKTthP3RoaXMuTmw/dGhpcy5pYSgibm9TVk1Db25maWciKToodGhpcy5ObD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuemMoITApfS5iaW5kKHRoaXMpLCEwKX19LE90OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy52YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMudmM9ITA7dGhpcy56YyghMCk7cmV0dXJufX10aGlzLktkPXRoaXMuJGIoYi5zdHJpY3QpO3RoaXMubWY9dGhpcy4kYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5pZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMucmM9dGhpcy4kYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuJGIoYi5lbmFibGVkKTsKdGhpcy5ZYj1iLnRlc3RoaWRlfHwiIjt0aGlzLkViPWIudGVzdGFkdGFnc3x8W107dGhpcy5aYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLm1jPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMucWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMubGM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLlpkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlZnPWIuanNwb3B1cHN8fCExO3RoaXMuRGI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuS2M9Yi52cGFpZHx8ITE7dGhpcy5XYS52cGFpZD10aGlzLktjO3RoaXMueWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5aYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuV2g9Yi52bWFwc3x8IiI7dGhpcy5ZYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuTWE9Yi5iaXRyYXRlfHwxRTM7dGhpcy5GZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5YYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZgpBcnJheT90aGlzLkhwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5nZSYmKHRoaXMuWGI9bnVsbCk7dGhpcy5oZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnZjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy52Yz0hMCx0aGlzLnpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmd1KCkmJih0aGlzLllifHx0aGlzLlpifHx0aGlzLkVifHx0aGlzLlhiKT90aGlzLlRlPyh0aGlzLkhhPXRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuaWIodGhpcy5JYikpLHRoaXMuY2UoKSx0aGlzLkdiKCkpOnRoaXMuVXQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WdCgpKX19LFV0OmZ1bmN0aW9uKCl7dGhpcy5UdCgpO3RoaXMuV3QoKX0sV3Q6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrCmErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuZWEoMTApLGc9ZS5lYSgxMCksSD1lLmVhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLAoiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUucWMoKTsKaWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5oYigpKXtpZih0aGlzLldhJiZ0aGlzLldhLnBsYXllciYmdGhpcy5XYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sVnQ6ZnVuY3Rpb24oKXt0aGlzLlg9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmliKHRoaXMuSWIpKTt0aGlzLkdiKCl9LEljOmZ1bmN0aW9uKGEpe3RoaXMuTmM9ITA7dGhpcy5YfHwodGhpcy5YPXRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmliKGEpKSx0aGlzLkdiKCksdGhpcy5jZSgpKX0sVHQ6ZnVuY3Rpb24oKXtpZih0aGlzLlliKXt2YXIgYT1lLnFjKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5VZygpKXRoaXMuSWModGhpcy5kYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7CmVsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlliKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuWWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuSWModGhpcy5kYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuR2goKX19ZWxzZSB0aGlzLkdoKCl9LEZoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGQ7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkJiKCkpOwp0aGlzLlp0KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5kZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuSWModGhpcy5kYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfXRoaXMuRWI9bnVsbCx0aGlzLmRmKCl9LFp0OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxHaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5CYigpKTt0aGlzLiR0KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5GaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuSWModGhpcy5kYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWmImJnRoaXMuWmIubGVuZ3RoKXt2YXIgZD10aGlzLlpiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuRmgoKX0sJHQ6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixkKXtkPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9CmM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxkZjpmdW5jdGlvbigpe3RoaXMuWGI/KHRoaXMuZ2YrKyx0aGlzLklhKG5ldyB6KHRoaXMuWGIpLHRoaXMuU3QuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5EaCgpfSxlZjpmdW5jdGlvbihhKXt0aGlzLkljKHRoaXMud2YsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxTdDpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5nZj90aGlzLmRmKCk6dGhpcy5lZigiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuRGgoKTp0aGlzLmVmKCJBQUEiKX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlg9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmliKHRoaXMuSWIpKTsKdGhpcy5HYigpO3RoaXMuY2UoKX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxHYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5oYigpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLk5jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS55YSgidC1vbmxpbmUuZGUiKXx8ZS55YSgiZ2lnYS5kZSIpfHxlLnlhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLlVnKCksITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5pYih0aGlzLnhmKSk7dGhpcy5MZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkxkJiZ0aGlzLkxkKCl9LGNvOmZ1bmN0aW9uKCl7aWYodGhpcy5tZiYmCnRoaXMuUHAoKSl7dmFyIGE9dGhpcy54cCgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sS2g6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsZCxmLGMsZyl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5EZyYmIXRoaXMuRWcmJih0aGlzLkVnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5EZywhMCkpO2E9bmV3IE5hKGEsYixkKTtmJiYoYS4kaD0hMCk7YyYmZS54cSgpJiYoYS5wZz0hMCk7ZyYmKGEuQ2g9ITApO3JldHVybiBhLmxvYWQoKX0sWWY6ZnVuY3Rpb24oKXtlLmhiKCl8fGUuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLnljKCl8fChhPXRoaXMuamEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT0KZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sUHQ6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuV2h9LGJvOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLkJ1LmJpbmQodGhpcyksdGhpcy5BdS5iaW5kKHRoaXMpKX0sQnU6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLlZvKCl9LEF1OmZ1bmN0aW9uKCl7fSxWbzpmdW5jdGlvbigpe2Uuc2Moay5Vbyk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sY2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5EYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkRiLmxlbmd0aDthKyspe3ZhciBiPQp0aGlzLkRiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLlRhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgUjt3aW5kb3dbZC54YygpXT10aGlzO2UuVGEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sZ3U6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5oZn0sSHA6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LEJiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41PgpNYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sJGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGUsZyxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGY9YS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGc9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGYpP2c9az02NDppc05hTihjKSYmKGs9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZywKZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHhoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGQ9IiIsYyxoO2ZvcihjPTc7MDw9YztjLS0paD1hPj4+NCpjJjE1LGQrPWgudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHIsdSx4LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx3LnB1c2goZSk7c3dpdGNoKHAlNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz0KYS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGMpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXdbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztwPWw7cj1tO3U9cTt4PXQ7Zm9yKGM9MDsxOT49YztjKyspdj1kKGUsNSkrKHAmcnx+cCZ1KSt4K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHg9dSx1PXIscj1kKHAsMzApLHA9ZSxlPXY7Zm9yKGM9MjA7Mzk+PWM7YysrKXY9ZChlLDUpKyhwXnJedSkreCtnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSwKeD11LHU9cixyPWQocCwzMCkscD1lLGU9djtmb3IoYz00MDs1OT49YztjKyspdj1kKGUsNSkrKHAmcnxwJnV8ciZ1KSt4K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHg9dSx1PXIscj1kKHAsMzApLHA9ZSxlPXY7Zm9yKGM9NjA7Nzk+PWM7YysrKXY9ZChlLDUpKyhwXnJedSkreCtnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx4PXUsdT1yLHI9ZChwLDMwKSxwPWUsZT12O2s9aytlJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rciY0Mjk0OTY3Mjk1O3E9cSt1JjQyOTQ5NjcyOTU7dD10K3gmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ua3x8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5SbD1iO2IucHJvdG90eXBlPQp7R286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5SbHx8UGEsdmM9bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuR28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsZCl7dGhpcy5iPWE7YS5mLk8/dGhpcy5VYT1hLmYuTygpOnRoaXMuVWE9IiI7YS5mLktnJiZhLmYuS2coe3BhdXNlOnRoaXMueGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5zaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5JZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZ1LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuYWI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5OYj10aGlzLlhjPSExO3RoaXMuT249MUUzO3RoaXMuZGE9Cm51bGw7dGhpcy5MPWI7dGhpcy52YT17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307ZS5nYigibmV3QmlnQWRJZCIpO3RoaXMuVG49ZS5lYSgxMCk7dGhpcy5hZj0wO3RoaXMuVmM9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5WYz1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmIuZikmJnRoaXMuYi5mLnUmJihhPXRoaXMuYi5mLnUoKSksdGhpcy5WYz1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5nbj1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmZoPXRoaXMuR2Q9ITE7dGhpcy5ZZz1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuU2M9ITE7dGhpcy5OaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlNiPQohMTt0aGlzLnBvPWUuZWEoMTApO3RoaXMuQWI9ZS5lYSgxMCk7dGhpcy55Yj1lLmVhKDEwKTt0aGlzLnpoPWUuZWEoMTApO3RoaXMuY29uZj17fTt0aGlzLnBjPXRoaXMuemI9ITE7dGhpcy5qZT1udWxsO3RoaXMuT2Q9dGhpcy5IYj10aGlzLnVlPXRoaXMuUGU9dGhpcy5mZT10aGlzLmdkPXRoaXMuY2Y9dGhpcy5rYj10aGlzLmNjPXRoaXMuaGg9dGhpcy50Yz10aGlzLmp1PXRoaXMub2I9ITE7dGhpcy5oYz1bXTt0aGlzLmFjPXt9O3RoaXMuamY9ITE7dGhpcy5VYj17fTt0aGlzLnJzPTIwMDt0aGlzLnNmPXRoaXMuWmg9dGhpcy4kZD10aGlzLlNlPSExfWMuaGs9YjtiLnByb3RvdHlwZT17ZnQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5VYV0mJnRoaXMuY29uZlt0aGlzLlVhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuVWFdW2FdKTtyZXR1cm4gYn0sTGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuUGEmJgplLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLkwuTmM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS52KGsuWm0sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sRGU6ZnVuY3Rpb24oYSxiLGQsYyl7dGhpcy5vYj1kO3ZhciBuPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihuPSEwKTtpZih0aGlzLkwuWCl0aGlzLmFmKyssZS5nYigibmV3U21hbGxBZElkIiksdGhpcy5MLmNvKCksYz1sLmdldENvbmZpZygpLHRoaXMuTC5IYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5MaCgpLG5ldyBUKHRoaXMsYSx0aGlzLllnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5NYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5LYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLApjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5MaCgpLG5ldyBUKHRoaXMsYSx0aGlzLllnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLktjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5NYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuTmEoKTtlbHNle3ZhciBnPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2cuRGUoYSxiLGQpfSw1MCl9fSxOZTpmdW5jdGlvbihhKXsic3BpZWdlbC5kZSIhPWUuUWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fHRoaXMuZmh8fCJzdm1wcmV2aWV3IiE9ZS5qYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3I/KHRoaXMuT2Q9CnRoaXMuSGI9dGhpcy50Yz0hMSx0aGlzLmM9YSx0aGlzLnN0KHRoaXMuYyksdGhpcy56ZyhhKSx0aGlzLmhjPXRoaXMucmcoYSksdGhpcy5hYz17fSx0aGlzLmpmPSExLHRoaXMuaW8oKSk6dGhpcy5mZCgpfSx6ZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5IZD10aGlzLktwKGEpKSx0aGlzLnpnKGEucGFyZW50KSl9LHJnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5yZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLnNwKGEpKSk7cmV0dXJuIGN9LHNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPQowO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpkfX0sS3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sZD1bXSxjPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWQucHVzaChhLmJiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LG1hOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZD0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoYj1hLmtkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuTGMuY29kZTpiPT1GLlFkLmNvZGU/ZS52KGsuVnUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTooZS5FZSgpLGI9PUYuQWYuY29kZSYmZS52KGsudHIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS52KGsuVG8sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7CmJyZWFrO2Nhc2Ugdy55Zi5jb2RlOmUudihrLkN1LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2Ugdy5CZi5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UudihrLld1LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3Jfd3JhcHBlcmxpbWl0IjticmVhaztjYXNlIHcuUmQuY29kZTplLnYoay5hdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuUGQuY29kZTplLnYoay51cix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnBjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwKIjEwNSIpLGQ9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09ZCYmYS5lcnJvciYmYS5lcnJvci51YSYmKGQrPSJfIithLmVycm9yLnVhKTtlLnRyYWNrKGQsIiIsITApO3RoaXMuT2IoYSk7dGhpcy5OYSgpfSxPYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuTGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5MYS5wb3AoKTt0aGlzLkNlKGQudXJsLGQudHlwZSxiKX1jYXRjaChjKXt9fSxzdDpmdW5jdGlvbihhKXt0aGlzLmZlPXRoaXMudWU9dGhpcy5QZT0hMTt0aGlzLnZhPXRoaXMuYi5HO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnZhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJgpkLmVudnZhcnMpdHJ5e2I9ZC5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuU2U9ITB9Y2F0Y2goYyl7fX1jYXRjaChlKXt9Yi5Odj0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuZ24mJnRoaXMucGxheWVyLmxlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5sZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTsKZm9yKGQ9MDtkPGEuTS5sZW5ndGg7ZCsrKWIuY2FuUGxheVR5cGUoYS5NW2RdLnR5cGUpJiZ0aGlzLmJuKGIsYS5NW2RdLnVybCsiIixhLk1bZF0udHlwZSk7dGhpcy5TZSYmYi5sb2FkKCk7aWYodGhpcy5IaChiKSl7dGhpcy5lbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLmRhPXRoaXMudmEuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuU2U/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLmxvKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMudmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLHRoaXMucXQoKSk6dGhpcy55ZSgpP3RoaXMud2goKTp0aGlzLmMub3JpZ2luLmpnKHcuUGQpfSxxdDpmdW5jdGlvbigpe3RoaXMua2I9dGhpcy5jYz0hMTt0aGlzLmIuZi5zYSYmdGhpcy5iLmYuc2EoKSYmKGUudihrLmNnLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5rYj0hMCk7ZS5lZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi50ZiYmZS5mbih0aGlzLmMub3JpZ2luLnRmKTtlLllhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi5paCgpO3RoaXMuYi5HYygpO2ZvcihhPQp0aGlzLmIuRzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLkdjKCk7dGhpcy5kYT10aGlzLnZhPXRoaXMuYi5HO3RoaXMub2YoInZwYWlkIik7aWYodGhpcy5rYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnliKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTtlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKTtlLnYoay52ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfXRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuRy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi5zYSYmdGhpcy5iLmYuc2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYy5NcCgpLGM9dGhpcy5jLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2Uua2EodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5rYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uua2EodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmthKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5rYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uua2EodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmthKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uua2EodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uua2EodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmthKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5UZigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuTCk7dGhpcy5ILnNyYz1hO2UuWGQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpeyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5SYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5oYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkp1KGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLkt1KCksdGhpcy5iLlJiKCEwKSwhdGhpcy5IYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5IYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5PZD0hMDtlLnYoay5WaCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS54ZSh0aGlzLkhiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuUmIoITApLHRoaXMuT3UoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYi5SYighMCksdGhpcy5TdSgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RdSgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SdSgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlR1KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB1KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhoKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLk1iKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmJnLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5ZYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpOwpiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuTnUoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLldkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuTHUoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlpoJiYodGhpcy5zZj0hMSx0aGlzLkZjKCkpLHRoaXMuTXUoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMueWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5rYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay52ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKToodGhpcy5rYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsubGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlhkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcykpO2UuWGQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuUmYoZnVuY3Rpb24oYSl7ZS5rYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxMdTpmdW5jdGlvbigpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLlVkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmNjPSEwfSxNdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlJjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5jYz0hMX0sT3U6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxOdTpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5NZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSwKS3U6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5ZYSgiaW1wcmVzc2lvbiIpO2UudihrLklmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFN1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLllhKCJzdGFydCIpO2UudihrLlJjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFF1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMudGM9ITA7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLkdmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFJ1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudihrLktmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFR1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTsKZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sUHU6ZnVuY3Rpb24oKXt0aGlzLk1kKCk7ZS5ZYSgiY29tcGxldGUiKX0sWGg6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5lZSgpO3RoaXMuSD0hMTt0aGlzLk5hKGEpfX0sSnU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZyxmPVtdOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZywoZj1iLm1hdGNoKGMpKT9mLmpvaW4mJihiPWYuam9pbigiLSIpKTpiPWIuc3Vic3RyaW5nKDAsMjApKTsKZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixiLCEwKTtlLllhKCJlcnIiLGIpO2UudihrLlV1LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5YaCghMCl9LGJuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuSGEmJmIuaXNFbmFibGVkJiYhYi55YygpKXt2YXIgZD1iLmphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5HdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LEhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxlbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuVWguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5NZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLk5kLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5VaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk1kLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTmQuYmluZCh0aGlzKSl9LApVaDpmdW5jdGlvbihhKXt0aGlzLk5ifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmJ8fHRoaXMucGYoYSl9LmJpbmQodGhpcyksdGhpcy5PbikpfSxwZjpmdW5jdGlvbihhKXtpZighdGhpcy5YYyYmdGhpcy5IaCh0aGlzLnZpZGVvKSYmIXRoaXMuemImJiF0aGlzLk5iKXt0aGlzLlhjPSEwO3RyeXtpZighZS5oYigpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy56Ynx8KHRoaXMuemI9ITAsdGhpcy5DZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLkwuaWd8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLk5hKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuRnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPQohMTt0aGlzLmIuR2MoKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuVWYoKTt0aGlzLmIuaWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuYmYoKX19LGJmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZ2QpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5QYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5xZD1bXTtmb3IodmFyIGI9dGhpcy5iLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMucWQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKYy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5RYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5RYygpfWVsc2UgdGhpcy5RYygpfSxRYzpmdW5jdGlvbihhKXtpZih0aGlzLnFkKWZvcih2YXIgYj0wO2I8dGhpcy5xZC5sZW5ndGg7YisrKXRoaXMucWRbYl0uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLmdkfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5OYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMuSWUoITApLHRoaXMuUWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMudWUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLlBlPSEwfS5iaW5kKHRoaXMpKTtkYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuVmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5WYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5WYi5iaW5kKHRoaXMpKSk6Cko9ZnVuY3Rpb24oKXt0aGlzLlNjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0uYmluZCh0aGlzKTt0aGlzLm5lKCkudmgodGhpcyl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5MLnJjJiYhdGhpcy56YiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuWG0sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLk5hKCl9LE5hOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmZlKWlmKHRoaXMuZmU9ITAsdGhpcy5PZHx8KGUudihrLkFyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLm5ifHx0aGlzLmMuZmMpe2UuZ2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuYWYrKzt0aGlzLk5iPXRoaXMuWGM9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy52YS5yZW1vdmVDaGlsZCh0aGlzLmRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5HZD0hMTt0cnl7dGhpcy5iLlBoKCl9Y2F0Y2goZyl7fXRoaXMuY2Y9ITA7dGhpcy5iLnJlKCk7dGhpcy5TYj0hMTt0aGlzLm5lKCkucmgoKTt0aGlzLmMubmImJnRoaXMuYy5vcmlnaW4uSmUoKTt0aGlzLmMuZmMmJihhP3RoaXMuYy5vcmlnaW4uYmgoKTp0aGlzLmZkKCkpfWVsc2UgdGhpcy5mZCgpfSxHdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMueWUoKT90aGlzLndoKCk6dGhpcy5OZChhKSl9LE5kOmZ1bmN0aW9uKGEpe3RoaXMuTmI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmCih0aGlzLnllKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBjfHx0aGlzLkwuWWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuTC5ZZigpKTt0aGlzLmMub3JpZ2luLmpnKHcuUGQpfSxxZjpmdW5jdGlvbigpe2lmKHRoaXMuanUpdGhpcy5OYSgpO2Vsc2V7dGhpcy5TYj0hMDt0aGlzLmIuZi5SYSYmIXRoaXMuY2YmJnRoaXMuYi5mLlJhKCkmJmUudihrLmRkLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLm91KGEpO2lmKCF0aGlzLkhiKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLkhiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5PZD0hMDtlLnYoay5WaCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS54ZSh0aGlzLkhiKX1jPSIiO3RoaXMuYy4kZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy56aCkpJiYoYz10aGlzLmMuJGUtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLk1mLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5jLm5iPyh0aGlzLk5iPXRoaXMuWGM9ITEsCnRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5kYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnZhLnJlbW92ZUNoaWxkKHRoaXMuZGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5HZD0hMSx0aGlzLmIuUGgoKSx0aGlzLmMub3JpZ2luLkplKCkpOnRoaXMuTmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLnFnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuU2M9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHdoOmZ1bmN0aW9uKCl7dGhpcy5wYz0hMDt0aGlzLnZhPXRoaXMuYi5HO3RoaXMudmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnZhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLAoiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5GcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nOwp0aGlzLmIuRj1hO3ZhciBiPXRoaXMuYi5GLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy52YS5hcHBlbmRDaGlsZChjKTt0aGlzLmIuR2MoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnZhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy52YS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuVGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuU2goKTt0aGlzLm9mKCk7dGhpcy5qZT1zZXRJbnRlcnZhbCh0aGlzLmFvLmJpbmQodGhpcyksCjEwMCk7cmV0dXJuIGF9LEZwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5jLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmMuTVtjXSxlO2U9Yi51cmw7dmFyIGc9dGhpcy5MO2cuSGEmJmcuaXNFbmFibGVkJiYhZy55YygpJiYoZT1nLmphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sYW86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMuYy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLmplKSx0aGlzLk1kKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucWYoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuamUpLAp0aGlzLk5kKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sTWg6ZnVuY3Rpb24oKXt0aGlzLmhofHwodGhpcy5oaD0hMCx0aGlzLnRjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sb3U6ZnVuY3Rpb24oYSl7ZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthPT10aGlzLk5ofHx0aGlzLnpifHwoMD09YSYmKHRoaXMub2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMub2IpLHRoaXMub2I9ITEpLHRoaXMuUGV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMudWU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuTWgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsCmZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpKSx0aGlzLnBjJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy56Ynx8ZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGUuaGIoKSYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudihrLklmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnBjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwucmMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLnRjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksCmUudihrLkdmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLnJjJiZlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5LZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLnJjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksdGhpcy5OaD1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy56Yil7dHJ5e2lmKHRoaXMuYWNbYV09KG5ldyBEYXRlKS5nZXRUaW1lKCksdGhpcy5hYy5pbXByZXNzaW9uJiZ0aGlzLmFjLmNvbXBsZXRlJiYhdGhpcy5qZil7dGhpcy5qZj0KITA7dmFyIGM9dGhpcy5hYy5jb21wbGV0ZS10aGlzLmFjLmltcHJlc3Npb24sZj0ic3RhdHNfaGRfdGltZWRpZmYiO3RoaXMuSCYmKGYrPSJ2cGFpZCIpOzVFMz5jJiYoMTA+YyYmKGM9MTApLDA+YyYmKGM9Im5lZ2F0aXZlIiksZS50cmFjayhmLGMsITApKX19Y2F0Y2goZyl7fWlmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1jPVtdO3RyeXtjPXRoaXMuTHAodGhpcy5jLkxhLGEpfWNhdGNoKGwpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBtPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy4kZD0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkhkLmltcHJlc3Npb25zJiZlLnZxKG0udXJsLHRoaXMuSGQuaW1wcmVzc2lvbnMpP3RoaXMuQ2UobS51cmwsbS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwplLnYoay5ZbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5DKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuQ2UobS51cmwsbS50eXBlKX1jYXRjaChxKXt9aWYoIWIpdHJ5e3RoaXMuYy5MYT10aGlzLnZvKHRoaXMuYy5MYSxhKX1jYXRjaChyKXt9fX0sQ2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwud2EoYSksYyYmYi5hbihjKSxmfHwoZj10aGlzLmhnKSxlfHwoZT10aGlzLmhnKSx0aGlzLmNuKGEpLHRoaXMuTC5JYShiLGZ1bmN0aW9uKCl7dGhpcy5xaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxjbjpmdW5jdGlvbihhKXt0aGlzLlViW2FdPSJvcGVuIn0scWg6ZnVuY3Rpb24oYSl7dGhpcy5VYlthXT0iY2xvc2VkIn0saW86ZnVuY3Rpb24oKXt0aGlzLlViPQp7fX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5VYil0aGlzLlViLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuVWJbYl0mJmErKztyZXR1cm4gYX0sTHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2bzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxGdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuVGguYmluZCh0aGlzKSl9LFRoOmZ1bmN0aW9uKCl7dGhpcy5jLk1iJiYoZS52KGsuYmcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksIXRoaXMudGMmJmUuaGIoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLAplLnRwKCksITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RoaXMuTC5ZYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5NYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuTWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxTaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5WYy5yZXBsYWNlKCJbdGltZV0iLGUucWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5aYyYmKGI9dGhpcy5MLlpjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnViLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmRhLmFwcGVuZENoaWxkKGEpfX0sdWI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5aYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuWmMpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvZjpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMucG87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuRmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy52YigpO3RoaXMudWIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuQWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5KaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLkloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSWguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy52YigpO3RoaXMudWIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLnliO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubHUuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rdS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudmIoKTt0aGlzLnViKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLnpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLiRlJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLmRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTt0aGlzLmRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudmIoKTt0aGlzLnViKCl9LmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5kYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT8KYi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMudGEmJih0aGlzLnRhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnRhPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLlJmKGZ1bmN0aW9uKGEpe3RoaXMudGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnNhJiZ0aGlzLmIuZi5zYSgpJiYoZS52KGsuY2csdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkllKCkpO3RoaXMudmIoKX19LHZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sRmM6ZnVuY3Rpb24oKXt0aGlzLnRhJiYiYmxvY2siPT10aGlzLnRhLnN0eWxlLmRpc3BsYXl8fHRoaXMuc2Z8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudGEmJih0aGlzLnRhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5VZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudGEmJih0aGlzLnRhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnZiKCksdGhpcy51YigpKSl9LEpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5jYz8oZS5rYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy50YSYmKHRoaXMudGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuY2M9ITEpOihlLmthKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMudGEmJih0aGlzLnRhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnZiKCksdGhpcy51YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMuY2M9ITApfSx4ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5VZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlJjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSwKdGhpcy5DKCkpKX0sa3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnliKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5sZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsudmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy55Yik7dGhpcy5rYj8oZS5rYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSwKdGhpcy5rYj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5rYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5rYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxJZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMueWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsudmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LHZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy55Yik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay5sZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sVmI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5WYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5WYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuVmIpO3RoaXMuZ2R8fHRoaXMuU2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmJmKCkpfSxmZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuamEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7ZS5xYygpO2lmKGF8fCF0aGlzLiRkJiYKYi5hZEZhbGxiYWNrVVJMKXRoaXMuZmg9dGhpcy5aaD10aGlzLnNmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwiIiwhMCksdGhpcy4kZD0hMCxhPWUuVGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuRGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtlbHNlIGlmKHRoaXMuZ2Q9ITAsdGhpcy5vYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5vYiksdGhpcy5vYj0hMSksKCJwcmVyb2xsIj09ZS5QYSYmdGhpcy5TY3x8InBvc3Ryb2xsIj09ZS5QYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpaWYoYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsLCJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuUGEpKSwic3RyaW5nIj09dHlwZW9mIGEmJmEpe2ZvcihiPXRoaXMuYi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmIuR2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKYy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuaGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5oZCgpO2Vsc2UgdGhpcy5oZCgpfSwKaGQ6ZnVuY3Rpb24oYSl7dGhpcy5HdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLHRoaXMucnMpOih0aGlzLmNmPSEwLHRoaXMuYi5yZSgpLHRoaXMuYi5ZcygpLHRoaXMuU2I9ITEsZS52KGsub28sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm5lKCkucmgoKSl9LG5lOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJgooYT0hMCl9cmV0dXJuIGF9LFVmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYSgibWluVmlzIik7YSYmKGUud2UodGhpcy52aWRlbyxhKT90aGlzLnNoKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk1iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLm5iLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuaGMmJjA8dGhpcy5oYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuaGMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuVG4rCiItIit0aGlzLmFmO3RoaXMuYyYmdGhpcy5jLnZnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy52ZygpKTtyZXR1cm4gYX0saGc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLmhrfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5McT10aGlzLmFbNl07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5XcD10aGlzLmFbM107dGhpcy5DbD10aGlzLmFbNV07dGhpcy5Mbj10aGlzLmFbNl07dGhpcy5Gbj10aGlzLmFbNl07dGhpcy5ZdT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs5XX1jLlpyPWI7Yi5wcm90b3R5cGU9e0txOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5McTp0aGlzLkVvKGEpfSxFbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRm86dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLldwOnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkNsOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZuOnRoaXMuWHUoYSl9LFh1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFJhPWMuWnJ8fFJhLHdjPW5ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLktxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuQmE9bnVsbDt0aGlzLlc9W107dGhpcy5VPW51bGw7dGhpcy5nYz10aGlzLmljPSExO3RoaXMudGY9IiI7dGhpcy5yZj0hMTtkJiZkLmVtcHR5P3RoaXMuZHIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MucG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUucWMoKSxiO2I9ZS5qYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC53YShsLklkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuaGIoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuZWcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPApkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuSWQoYSkpKyImdHlwZT1qcyIsYj1sLndhKGwuSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwud2EobC5JZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPQoidHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5jci5iaW5kKHRoaXMpLHRoaXMuJHEuYmluZCh0aGlzKSl9LHNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkJhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5QYSl0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuUGF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLlBhfHx0aGlzLnpxKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLlB0KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTsKMD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/Ci0xOjE6MH0pfSx6cTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sY3I6ZnVuY3Rpb24oYSl7dGhpcy5NcyhhKTt0cnl7dGhpcy5CYT1hLnJlc3BvbnNlWE1MLHRoaXMuQmF8fCh0aGlzLkJhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLk9hKHcuUmQpKX10aGlzLlc9dGhpcy5zZygpO3RoaXMuaWM9dGhpcy5mZigpO3RoaXMuZ2M9dGhpcy5FaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5CYygpOnRoaXMubWEodGhpcy5PYSh3LkxjLHtlcnJvcjp0aGlzLnJmP0YuUWQ6Ri56Zn0pKX0sZHI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuQmF8fCh0aGlzLkJhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMubWEodGhpcy5PYSh3LlJkKSl9dGhpcy5XPXRoaXMuc2coKTt0aGlzLmljPXRoaXMuZmYoKTt0aGlzLmdjPXRoaXMuRWgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuQmMoKTp0aGlzLm1hKHRoaXMuT2Eody5MYyx7ZXJyb3I6dGhpcy5yZj9GLlFkOkYuemZ9KSl9LCRxOmZ1bmN0aW9uKCl7dGhpcy5tYSh0aGlzLk9hKHcueWYse2RlcHRoOmF9KSl9LEJjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVy5zaGlmdCgpOwp0aGlzLkJxKCk/dGhpcy5hdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkFnKCksaCx7QWRTeXN0ZW06dGhpcy5ycCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLm1hKHRoaXMuT2Eody5CZikpOihhPTAsdGhpcy55dSgpJiZ0aGlzLk5lKHRoaXMuc28oKSkpfSxKZTpmdW5jdGlvbigpe3RoaXMuaWM/KHRoaXMuaWM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuQmMoKSk6dGhpcy5wYXJlbnQuSmUoKX0sYmg6ZnVuY3Rpb24oKXt0aGlzLmdjPyh0aGlzLmdjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLkJjKCkpOnRoaXMucGFyZW50LmJoKCl9LHl1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXQoKT90aGlzLlh0KCk/ITA6KC0xIT10aGlzLnVjKCk/dGhpcy5tYSh0aGlzLk9hKHcudWYpKTp0aGlzLm1hKHRoaXMuT2Eody5raikpLCExKToodGhpcy5tYSh0aGlzLk9hKHcuTGMsRi5BZikpLCExKX0sTmU6ZnVuY3Rpb24oYSl7YS5MYT0KYS5MYS5jb25jYXQodGhpcy5GZSgpKTthLm5iPWEubmI/YS5uYjp0aGlzLmljO2EuZmM9YS5mYz9hLmZjOnRoaXMuZ2M7dGhpcy5wYXJlbnQuTmUoYSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy51YygpO2EuTT10aGlzLnhnKCk7YS5NYj10aGlzLnVwKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy5xcCgpO2EuJGU9dGhpcy5KcChhLmR1cmF0aW9uKTtyZXR1cm4gYX0sbWE6ZnVuY3Rpb24oYil7dGhpcy5VJiYoYi5MYT1iLmVycm9yLmNvZGUhPXcudWYuY29kZT9iLkxhLmNvbmNhdCh0aGlzLnZwKCkpOmIuTGEuY29uY2F0KHRoaXMuRHAoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5PYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lk9iJiZ0aGlzLnBhcmVudC5PYihiKSxhPTAsdGhpcy5CYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm1hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQubWEmJgp0aGlzLnBhcmVudC5tYShiKSxhPTApfSxPYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5PYihhKX0samc6ZnVuY3Rpb24oYSxiKXt0aGlzLm1hKHRoaXMuT2EoYSxiKSl9LE9hOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sYXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxZdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGcoKS5sZW5ndGh9LFh0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy51YygpfSxmZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LEVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5mZigpJiYoYT0hMCk7cmV0dXJuIGF9LE1zOmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy50Zj0KYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLnJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5BZygpLmxlbmd0aH0sQWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxycDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lKHRoaXMuVSwiQWRTeXN0ZW0iKX0sRmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYKIXRoaXMuTmcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuYmIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxOZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLk5nKGEucGFyZW50Tm9kZSk6ITF9LERwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHZwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx1cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSx4ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxNYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksdHY6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuYmIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuTWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk1hKS1NYXRoLmFicyhkLWIuTWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuTWEpLU1hdGguYWJzKGQtCmIuTWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LHFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMub2QoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHVjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuYmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rCjYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5FdChkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LG1lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5iYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGJiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMub2QoYSk6IiJ9LG9kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFQ9Yy5wbXx8VDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VaT10aGlzLmFbNF07dGhpcy5TbT10aGlzLmFbMTBdO3RoaXMueG49dGhpcy5hWzJdO3RoaXMuT2k9dGhpcy5hWzhdO3RoaXMuYnQ9dGhpcy5hWzFdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOF19Yy54dD1iO2IucHJvdG90eXBlPXtUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5SbShhKX0sUm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TbTp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueG46dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9pOnRoaXMuYXQoYSl9LAphdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnQ6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkVqOnRoaXMuaG0oYSl9LGhtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMueHR8fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLlRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTGE9W107dGhpcy5NPVtdO3RoaXMuTWI9IiI7dGhpcy5BPXRoaXMuZmM9dGhpcy5uYj0hMTt0aGlzLnNlPXRoaXMub3JpZ2luPW51bGw7dGhpcy50ZT0iIn1jLndsPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PQp0aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LEJwOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5CYSl7dmFyIGE9CnRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuc2U9YVtjXSl9cmV0dXJuIHRoaXMuc2V9LHZnOmZ1bmN0aW9uKCl7aWYodGhpcy50ZSlyZXR1cm4gdGhpcy50ZTt2YXIgYT0iIjsoYT10aGlzLkJwKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy50ZT1hfSxNcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMud2x8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Waz10aGlzLmFbMTBdO3RoaXMucXI9dGhpcy5hWzRdO3RoaXMuV3I9dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzldO3RoaXMub3E9dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzZdO3RoaXMuRGk9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzFdO3RoaXMueHU9dGhpcy5hWzNdO3RoaXMuQm49dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMV19Yy5Qaj1iO2IucHJvdG90eXBlPXtVazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZrOnRoaXMucHIoYSl9LHByOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xcjp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV3I6dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdxOnRoaXMubnEoYSl9LG5xOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5vcTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUW86dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5EaTp0aGlzLkRtKGEpfSxEbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRW06dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnh1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Cbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUGp8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlVrKDQpO3ZhciB3PXtSZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix1YToiWE1MX1BBUlNFX0VSUk9SIn0sa2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHVhOiJEVVJBVElPTl9FUlJPUiJ9LApMYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsdWE6IkVNUFRZX1ZBU1QifSxCZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix1YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0seWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnVhOiJMT0FEX0VSUk9SIn0sUGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHVhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sanY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsdWE6Ik1FRElBRklMRV9FUlJPUiJ9LHVmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHVhOiJEVU1NWV9BRCJ9fSxGPXt6Zjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHVhOiJOT19BRFMifSxBZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsdWE6Ik5PX01FRElBRklMRVMifSxrdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsdWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxRZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix1YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs2XX1jLkVpPWI7Yi5wcm90b3R5cGU9e2ZzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLkVpfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5mcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiKXt0aGlzLmVycm9yPWE7dGhpcy5rZD1iO3RoaXMuTGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkxqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5Manx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG49dGhpcy5hWzddO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuem49dGhpcy5hWzRdO3RoaXMuZ3Y9dGhpcy5hWzddO3RoaXMudGk9dGhpcy5hWzVdO3RoaXMuaXY9dGhpcy5hWzddO3RoaXMubnU9dGhpcy5hWzddO3RoaXMucXE9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMTBdfWMuQnI9YjtiLnByb3RvdHlwZT17c246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bjp0aGlzLklzKGEpfSxJczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnM6dGhpcy55bihhKX0seW46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpuOgp0aGlzLmZ2KGEpfSxmdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ3Y6dGhpcy5zaShhKX0sc2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRpOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaXY6dGhpcy5tdShhKX0sbXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm51OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xcTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkJyfHxYYSxBYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1BYy5zbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHwKe307dGhpcy5mPWE7dGhpcy5hYj1hLnRnKCk7dGhpcy5HPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuRy5pZD1lLmVhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuU2Y9ITE7dGhpcy5MYj1bXX1jLm5qPWI7Yi5wcm90b3R5cGU9e3BwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMucHAoYSk7CmZvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5VcChhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxOdDpmdW5jdGlvbigpe3RoaXMuU2Y9ITB9LApQaDpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saWg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5kZCx0aGlzLmYudSgpKX0sWXM6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5lZCx0aGlzLmYudSgpKSl9LEdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz0KdGhpcy5hYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmFiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuYWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuYWIpO3RoaXMuZi5EYyYmdGhpcy5mLkRjKCk/dGhpcy5mLnRnKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5SYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sVXA6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHwKYiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxncDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFJiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ3AodGhpcy5hYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5yZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuRGMoKT8odGhpcy5HLnN0eWxlLmxlZnQ9CiIwcHgiLHRoaXMuRy5zdHlsZS50b3A9IjBweCIpOih0aGlzLkcuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkcuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkcuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkcuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5MYi5sZW5ndGg7YSsrKXRoaXMuTGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5BaCh0aGlzLkcpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJiLmJpbmQodGhpcyksMTApfSxSZjpmdW5jdGlvbihhKXt0aGlzLkxifHwodGhpcy5MYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuTGIucHVzaChhKX0scmU6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmCnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMubmp8fFlhLEM9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuZWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBKPSExLGRhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzEwXTsKdGhpcy5Oaz10aGlzLmFbMTBdO3RoaXMuVXI9dGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzEwXTt0aGlzLk9vPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLk1vPWI7Yi5wcm90b3R5cGU9eyRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hczp0aGlzLmJrKGEpfSxiazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2s6dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5rOnRoaXMuVHIoYSl9LFRyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vcjp0aGlzLk9tKGEpfSxPbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUG06dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk9vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgJGE9Yy5Nb3x8JGEsQmM9bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLiRyKDQpOyhmdW5jdGlvbihjKXtjLmpsPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlkoYSk7dGhpcy5EZChiKTt0aGlzLmZnKCl9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksCjEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkZhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGFiPWMuamx8fGFiOyhmdW5jdGlvbihjKXtjLmlsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lYSgpO3RoaXMuS2I9dGhpcy5LYnx8ITE7dGhpcy5KZj10aGlzLkxmPXRoaXMuSmc9dGhpcy5jYT10aGlzLmtmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuZXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmtmPSEwO3RoaXMuSmcmJnRoaXMuYWcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkud2I7YSYmYS5TYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmFkKCk7dGhpcy5KZz0hMDt0aGlzLmFnKCl9LmJpbmQodGhpcykpO3RoaXMuV2YoKX0sYWc6ZnVuY3Rpb24oKXtpZighdGhpcy5LYil7dGhpcy5hZCgpO2lmKCF0aGlzLmtmJiYhdGhpcy5hZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMua2YmJnRoaXMuSmYmJiF0aGlzLkxmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LAp5ZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxXZjpmdW5jdGlvbigpe2lmKHRoaXMuYWQoKSl7dmFyIGI9dGhpcy55ZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLkxmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuSmY9Yi5ydn10aGlzLnJhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZigpfS5iaW5kKHRoaXMpLDEwMCl9LHV2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkh2KCk6ITF9LHVjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/CmIudWMoKTotMX0sRXA6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sZXA6ZnVuY3Rpb24oYixhKXt0aGlzLktiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuS2J8fDMwMj09dGhpcy5LYj90aGlzLmNhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5LYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuY2E/KHRoaXMudygpLHRoaXMucWEoKSk6Yi52ZSgpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkVwKGIpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGEoKX0uYmluZCh0aGlzKSwyRTMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLmlsfHxiYjsoZnVuY3Rpb24oYyl7Yy5rbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LHlxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkFsLlZtLlRtP3dpbmRvdy5PTy5BbC5WbS5UbS5wdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55cSgpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5RYT0xNTAwO3ZhciBiPWVhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLm9lKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBhYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgYmIoYywKdGhpcy5LKSkuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBjYj1jLmtsfHxjYixkYj1uZXcgY2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbM119Yy5icT1iO2IucHJvdG90eXBlPXtmaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ2k6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBlYj1jLmJxfHxlYixDYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5maSg0KTsoZnVuY3Rpb24oYyl7Yy5jaj1yLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLm9hPSExO3RoaXMuQmcoKX0sQmc6ZnVuY3Rpb24oKXt2YXIgYj0KITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5ZKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLm1oKCl9LG1oOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5janx8ZmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sWGY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLAp0aGlzLnFhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucWEoKTp0aGlzLnMoKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuWGYoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YZihhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5ianx8Z2I7KGZ1bmN0aW9uKGMpe2MuZGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKcGg6ZnVuY3Rpb24oYil7Yj1uZXcgZmIoYik7Yi5vYT90aGlzLlIoKTp0aGlzLk4oYil8fChiLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmZwfHwodGhpcy5mcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMucGgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnBoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5kanx8aGIsVT1uZXcgaGIocSk7VS5nKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs1XTt0aGlzLldpPXRoaXMuYVs3XTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLm5zPXRoaXMuYVs4XTt0aGlzLmN2PXRoaXMuYVszXTt0aGlzLnVsPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMuT2w9YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnVvOnRoaXMuVmkoYSl9LFZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XaTp0aGlzLmhpKGEpfSxoaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmlpOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5uczp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY3Y6dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMuT2x8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnRvKDQpOyhmdW5jdGlvbihjKXtjLlhsPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuWShiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LERjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5YbHx8VjsoZnVuY3Rpb24oYyl7Yy5XbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt5LlVjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eS5VYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLklyKGEpfS5iaW5kKHRoaXMpKTsKeS5VYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt5LlVjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eS5PcCgpfSxJcjpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnFhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTsKdGhpcy5xYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuV2x8fFc7KGZ1bmN0aW9uKGMpe2MuWWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMud2QmJihiPWUud28oYix0aGlzLndkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz0KYlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMud2R8fCh0aGlzLndkPVtdKSx0aGlzLndkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxVYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5iYXx8KHRoaXMuYmE9e30pO3RoaXMuYmFbYl18fCh0aGlzLmJhW2JdPXt9KTt0aGlzLmJhW2JdW2FdfHwodGhpcy5iYVtiXVthXT1bXSk7dGhpcy5iYVtiXVthXS5wdXNoKGMpfSxidTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmJhfHx0aGlzLmJhJiYhdGhpcy5iYVthXSl0aGlzLkFjfHwodGhpcy5BYz1bXSksdGhpcy5BYy5wdXNoKGIpLHRoaXMuWHMoKSYmKHRoaXMuVmUoKSx0aGlzLmcoKSk7CmVsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYmFbYV1bY10mJjA8dGhpcy5iYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmJhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5iYVthXVtjXVtkXShiKX19LE9wOmZ1bmN0aW9uKCl7aWYodGhpcy5BYylmb3IodmFyIGI9MDtiPHRoaXMuQWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5BY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYmFbY11bZF0mJjA8dGhpcy5iYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmJhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5iYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmCiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmJ1KGIpfX0pfSkoYyk7dmFyIGpiPWMuWWx8fGpiLHk9bmV3IGpiKHEpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3A9dGhpcy5hWzZdO3RoaXMuSG49dGhpcy5hWzEwXTt0aGlzLmlyPXRoaXMuYVsxMF07dGhpcy5FdT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs2XX1jLldtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vcDp0aGlzLkduKGEpfSxHbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSG46dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7CnZhciBrYj1jLldtfHxrYixFYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5ucCg0KTsoZnVuY3Rpb24oYyl7Yy5aaT1yLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuWShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApSYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuWml8fGxiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHwKYS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMubygibm9BZCIsInBsYXllZCIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuSSghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLiRpfHxtYjsoZnVuY3Rpb24oYyl7Yy5haj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPQpiW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBsYihkKTt0aGlzLk4oZyl8fCh0aGlzLlAoZyksKG5ldyBtYihnLHRoaXMuSykpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlIoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGE9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYi5zYigpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLmFqfHxuYixvYj1uZXcgbmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2w9dGhpcy5hWzZdO3RoaXMuWG89dGhpcy5hWzZdO3RoaXMud2o9dGhpcy5hWzNdO3RoaXMucm89dGhpcy5hWzVdO3RoaXMuaj0KdGhpcy5hWzJdfWMub3M9YjtiLnByb3RvdHlwZT17Zmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmdsOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ybzp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2o6dGhpcy5xbyhhKX0scW86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5vc3x8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpOwp0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5ZKGIpO3RoaXMuWihhKTt0aGlzLlFzKHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LFFzOmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmdGhpcy5oYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LEtnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuYWx8fHFiOyhmdW5jdGlvbihjKXtjLiRrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5ZaD0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpOwpiLmF1dG9zdGFydCYmIXRoaXMuWWgmJih0aGlzLkkoKSx0aGlzLlloPSEwLHRoaXMucGEoKSk7YS5GYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgcmI9Yy4ka3x8cmI7KGZ1bmN0aW9uKGMpe2MuYmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5ibHx8c2IsWD1uZXcgc2IocSk7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs1XTt0aGlzLk9xPXRoaXMuYVsyXTt0aGlzLkltPXRoaXMuYVs4XTt0aGlzLk9zPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs4XTt0aGlzLkFrPXRoaXMuYVszXTt0aGlzLnV0PXRoaXMuYVs3XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxXX1jLnVqPWI7Yi5wcm90b3R5cGU9e0p0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LdDp0aGlzLk5xKGEpfSxOcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3E6dGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkltOnRoaXMuTnMoYSl9LE5zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pczp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWWk6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkFrOgp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudXQ6dGhpcy5ubihhKX0sbm46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBuOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHRiPWMudWp8fHRiLEdjPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLkp0KDQpOyhmdW5jdGlvbihjKXtjLndtPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7CnZhciB1Yj1jLndtfHx1YjsoZnVuY3Rpb24oYyl7Yy52bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxQYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sUHM6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLlZhfHwodGhpcy5WYT1bXSk7dGhpcy5WYS5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucWEoKTp0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5qYz0KITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmdldFBsYXllcigpO3RoaXMueGE/dGhpcy5Qcyh0aGlzLnhhKToodGhpcy54YT10aGlzLlBiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LHM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMueGEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5qYyl7dGhpcy5JKCk7cmV0dXJufWI9ITA7aWYodGhpcy5WYSYmdGhpcy5WYS5sZW5ndGgmJjE8dGhpcy5WYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLlZhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLlZhW2FdJiYzMDMhPXRoaXMuVmFbYV0mJjQwMyE9dGhpcy5WYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucWEoKTsKZWxzZXt0aGlzLkkoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB2Yj1jLnZtfHx2YjsoZnVuY3Rpb24oYyl7Yy54bT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLlFhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHViKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5QKGMpLChuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMueG18fHdiLHhiPW5ldyB3YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuTnI9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMucmo9dGhpcy5hWzZdO3RoaXMuYXE9dGhpcy5hWzVdO3RoaXMuWnA9dGhpcy5hWzNdO3RoaXMuSnE9dGhpcy5hWzNdO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuUXE9dGhpcy5hWzRdO3RoaXMuaXU9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbOV19Yy5Gaj1iO2IucHJvdG90eXBlPXtNcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnI6dGhpcy5wayhhKX0scGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFrOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yajp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYXE6dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5acDp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSnE6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5Vajp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXE6dGhpcy5odShhKX0saHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLml1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgeWI9Yy5Ganx8eWIsSGM9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXIoNCk7KGZ1bmN0aW9uKGMpe2MuSmw9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuT2U9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5CcygpfS5iaW5kKHRoaXMpLDUwMCl9LEJzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuViYmdGhpcy5WKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuT2UmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuT2UpOwp0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sRnQ6ZnVuY3Rpb24oKXt0aGlzLk9lPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5KbHx8emI7KGZ1bmN0aW9uKGMpe2MuSWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmJjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLmtyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5iY3x8KHRoaXMuYmM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksCnRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuYmN8fHRoaXMuYmMrKyx0aGlzLmJjPD10aGlzLmtyPyh0aGlzLmJjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5GdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIEFiPWMuSWx8fEFiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5LbHx8QmIsQ2I9bmV3IEJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdtPXRoaXMuYVs0XTt0aGlzLmRsPXRoaXMuYVs4XTt0aGlzLnd0PXRoaXMuYVszXTsKdGhpcy5lcT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLldxPWI7Yi5wcm90b3R5cGU9e0ZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HbTp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZGw6dGhpcy52dChhKX0sdnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnd0OnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMuV3F8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZtKDQpOyhmdW5jdGlvbihjKXtjLkVsPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sS2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5WKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksCjIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLkVsfHxFYjsoZnVuY3Rpb24oYyl7Yy5EbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnBhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubW8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOwowPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlJxKCk6dGhpcy4kZigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LG1vOmZ1bmN0aW9uKCl7dGhpcy5IZigpfHx0aGlzLnMoITApfSxScTpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTshYi5sYSYmYi5XJiZiLm52JiZiLnF2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sJGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09CmI/KHRoaXMudygpLHRoaXMucWEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSwxMDApfSxuZDpmdW5jdGlvbigpe2lmKCF0aGlzLmdoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5naD1iW2NdKTtyZXR1cm4gdGhpcy5naH0sSXY6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKTp0aGlzLkkoKTp0aGlzLkkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuRGx8fEZiOyhmdW5jdGlvbihjKXtjLkZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLkZsfHxHYixIYj1uZXcgR2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbM119Yy5obj1iO2IucHJvdG90eXBlPXtHcjpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkhyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgSWI9Yy5obnx8SWIsSmM9bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuR3IoNCk7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5ZKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5uYSgpfWVsc2UgdGhpcy5uYSgpfSwKR3Y6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLlFiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LFJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxEYzpmdW5jdGlvbigpe3JldHVybiEwfSwKRmE6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuUGt8fFk7KGZ1bmN0aW9uKGMpe2MuT2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5RZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlFlJiZiIT10aGlzLlFlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUueWEoInRlbGU1LmRlIikmJgoicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubygiYWRlcnJvciIsYS5LdiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubygiYWRlcnJvciIpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuT2t8fFo7KGZ1bmN0aW9uKGMpe2MuUWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPwohMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5vYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5vYT90aGlzLlZlKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBHLEpiPWMuUWt8fEpiLEtiPW5ldyBKYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY3M9dGhpcy5hWzldO3RoaXMuUWw9dGhpcy5hWzldOwp0aGlzLkppPXRoaXMuYVsxXTt0aGlzLmpzPXRoaXMuYVs0XTt0aGlzLmtxPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMudmw9YjtiLnByb3RvdHlwZT17YnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jczp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFsOnRoaXMuSWkoYSl9LElpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5KaTp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExiPWMudmx8fExiLEtjPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLmJzKDQpOyhmdW5jdGlvbihjKXtjLkttPQpyLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5ZKGEpfWVsc2UgdGhpcy5uYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcucGxheSgpfSxSYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuS218fE1iOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFJzOmZ1bmN0aW9uKGIpe2ImJgpiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiYKYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKSl9LCRjOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxFZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy4kYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnJhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRWYuYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuUnMod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5FZigpfX0pfSkoYyk7dmFyIE5iPWMuSm18fE5iOyhmdW5jdGlvbihjKXtjLkxtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5vYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuTG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMub2k9dGhpcy5hWzZdO3RoaXMuenI9dGhpcy5hWzddO3RoaXMudXM9dGhpcy5hWzEwXTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLnF1PQp0aGlzLmFbNF07dGhpcy5Tbj10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbNl07dGhpcy5qaj10aGlzLmFbNV07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLiRvPWI7Yi5wcm90b3R5cGU9e3VuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMub2k6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnpyOnRoaXMudHMoYSl9LHRzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51czp0aGlzLmRrKGEpfSxkazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZWs6dGhpcy5wdShhKX0scHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnF1OnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5qajp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBRYj1jLiRvfHxRYixMYz1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy51big0KTsoZnVuY3Rpb24oYyl7Yy5kbT1yLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLmtoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSwKYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLnJyPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5uYSgpfWVsc2UgdGhpcy5uYSgpfWVsc2UgdGhpcy5uYSgpfSxQdjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sUmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LE86ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5raCYmKHRoaXMua2g9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgTz1jLmRtfHxPOyhmdW5jdGlvbihjKXtjLmNtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHhhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMua2UpaWYodGhpcy54Ynx8KHRoaXMueGI9MCksdGhpcy54YisrLDE1PHRoaXMueGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMucHQoKTp0aGlzLnMoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmtlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5jYXx8KHRoaXMubygiYWRlcnJvciIsdGhpcy5UKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMueGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgUD1jLmNtfHxQOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKTt0aGlzLlFhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBQKGIsdGhpcy5LKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFAoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBQKGIsdGhpcy5LKSxiLmcoKSkpO3RoaXMuVmUoKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBSYj1jLmVtfHxSYixTYj1uZXcgUmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGo9dGhpcy5hWzRdO3RoaXMuVnE9dGhpcy5hWzhdO3RoaXMua289dGhpcy5hWzddO3RoaXMuRnE9dGhpcy5hWzhdO3RoaXMuQm89dGhpcy5hWzddO3RoaXMuZHU9dGhpcy5hWzFdO3RoaXMuWGs9dGhpcy5hWzhdO3RoaXMuQW09dGhpcy5hWzZdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMuR2o9YjtiLnByb3RvdHlwZT17c2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnRqOnRoaXMuVXEoYSl9LFVxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5WcTp0aGlzLmpvKGEpfSwKam86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtvOnRoaXMuRXEoYSl9LEVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5GcTp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQm86dGhpcy5jdShhKX0sY3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmR1OnRoaXMuV2soYSl9LFdrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Yazp0aGlzLnptKGEpfSx6bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQW06dGhpcy55cyhhKX0seXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgVGI9Yy5Hanx8VGIsTWM9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuc2ooNCk7KGZ1bmN0aW9uKGMpe2MuQ2s9CnIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuWShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5ZKGEucGFyZW50Tm9kZSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGFhPWMuQ2t8fGFhOyhmdW5jdGlvbihjKXtjLkJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkdnPTA7dGhpcy5UPXRoaXMuVHx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmNhPXRoaXMud2M9dGhpcy54YT0KdGhpcy5XYz0hMTt0aGlzLm9oPWUuQmIoMTApO3RoaXMuUGcoKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubGE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLmpiKCksITA7dGhpcy5HZysrO2lmKDEwPHRoaXMuR2cpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMucyghMCk6dGhpcy5zKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5QZy5iaW5kKHRoaXMpLDEwMCksITF9LGpiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5sYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnJhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamIoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2F9LEFhOmZ1bmN0aW9uKCl7dGhpcy5jYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNhPyh0aGlzLncoKSx0aGlzLnFhKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkkoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJhPWMuQmt8fGJhOyhmdW5jdGlvbihjKXtjLkRrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBhYSh3aW5kb3cucGxheWVyKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgVWI9Yy5Ea3x8VWIsVmI9bmV3IFViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5scD10aGlzLmFbNl07dGhpcy5Laj10aGlzLmFbMV07dGhpcy5ybj10aGlzLmFbNV07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVszXX1jLlFtPWI7Yi5wcm90b3R5cGU9e2twOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuS2o6dGhpcy5xbihhKX0scW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJuOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuUW18fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLmtwKDQpOyhmdW5jdGlvbihjKXtjLlJqPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5uYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLlJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Raj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5aZigpfSxaZjpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmYoITApfS5iaW5kKHRoaXMpLAoxMDApKX19KX0pKGMpO3ZhciBZYj1jLlFqfHxZYjsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuU2p8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Obj10aGlzLmFbNF07dGhpcy5xcz10aGlzLmFbOV07dGhpcy5Ecj0KdGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbMTBdfWMuTXE9YjtiLnByb3RvdHlwZT17TW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5uOnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5DcihhKX0sQ3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5NcXx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuTW4oNCk7KGZ1bmN0aW9uKGMpe2MuYmk9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5uYSgpKTp0aGlzLm5hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBiYz1jLmJpfHxiYzsoZnVuY3Rpb24oYyl7Yy5haT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmJlKCk7dGhpcy5WZigpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmNhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxWZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnFhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmYuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJlLmJpbmQodGhpcyksMTAwKX0sYmU6ZnVuY3Rpb24oKXtpZighdGhpcy5yYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5wYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLnMoKTp0aGlzLnMoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmUuYmluZCh0aGlzKSwxMDApfX0sczpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBhLmJpbmQodGhpcyksMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5haXx8Y2M7KGZ1bmN0aW9uKGMpe2MuY2k9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLm9hP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlNhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5SKCl9fSl9KShjKTt2YXIgZGM9Yy5jaXx8ZGMsZWM9bmV3IGRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnV1PXRoaXMuYVs1XTt0aGlzLllxPXRoaXMuYVszXTt0aGlzLkhrPXRoaXMuYVs4XTt0aGlzLnZpPXRoaXMuYVs0XTt0aGlzLm9tPXRoaXMuYVs4XTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmV0PXRoaXMuYVs0XTt0aGlzLkxrPXRoaXMuYVsxMF07dGhpcy5EdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLklvPWI7Yi5wcm90b3R5cGU9e3R1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51dTp0aGlzLlhxKGEpfSxYcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWXE6dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Iazp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmk6dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9tOnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ObTp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy5LayhhKX0sS2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxrOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIGZjPWMuSW98fGZjLFBjPW5ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnR1KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlJnPQp0aGlzLlRnPXRoaXMuU2c9ITE7dGhpcy55ZD1bXTt0aGlzLlVlPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhiP251bGw6SGIsanc6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2E/bnVsbDp3YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFg/bnVsbDpYfX1jLnlsPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuR3AoYSk6W10sYjt0aGlzLlRnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLlNnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnRoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5VZSl7aWYodGhpcy5SZylicmVhaztiPXRoaXMuVWVbY107dGhpcy5uZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLnRoKGIpKX19LApuZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LEdwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLlVlW2NdLHRoaXMubmYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sdGg6ZnVuY3Rpb24oYSl7dGhpcy5uZihhKSYmYS5nKCl9LEh0OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiByJiYhdGhpcy5TZylmb3IodGhpcy5SZz0hMCxhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXS5GYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnlkW2FdLkZiKX19fSkoYyk7dmFyIGdjPWMueWx8fGdjLE09bmV3IGdjO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmttPXRoaXMuYVs0XTt0aGlzLlprPXRoaXMuYVsyXTsKdGhpcy56aT10aGlzLmFbNl07dGhpcy5pcT10aGlzLmFbMl07dGhpcy5wbD10aGlzLmFbMl07dGhpcy5MaT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxXX1jLkZpPWI7Yi5wcm90b3R5cGU9e2ptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbTp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnppOnRoaXMuaHEoYSl9LGhxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pcTp0aGlzLm9sKGEpfSxvbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucGw6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5GaXx8aGMsUWM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmptKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLnNjKGsuenUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLnNjKGsudnIpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKRS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IFIsbT0hMTtJLnhjKCk7SS5MZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkueGMoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLkxnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS54YygpO3ZhciBTYz1SYyhmdW5jdGlvbigpe2Uub2cod2luZG93LEkucnEoKSx7aWQ6U2N9KX0sNTAwKSxqYT1lLmVhKDEwKTtmYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5yaT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsxXX1jLmpwPWI7Yi5wcm90b3R5cGU9e3BpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYz1jLmpwfHxpYyxUYz1uZXcgaWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5waSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubGg9dGhpcy5jb25mPXRoaXMuZWI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnVkPTA7dGhpcy5VYT0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLm5oPSExO3RoaXMuUmU9W107ZS5nYigibmV3QWRkZWxpdmVyeSIpfWMuZGk9YjtiLnByb3RvdHlwZT17bXQ6ZnVuY3Rpb24oYSl7dGhpcy5saD0KYX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlVhPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxodDpmdW5jdGlvbihhKXt0aGlzLmViPWF9LGd0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuVWFdJiZ0aGlzLmNvbmZbdGhpcy5VYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlVhXVthXSk7cmV0dXJuIGJ9LEVjOmZ1bmN0aW9uKGEsYil7ZS55YSgid2VsdC5kZSIpJiZlLlRhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsCiJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5lYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLnNxKCkpdGhpcy5lYi5sKHRoaXMuZWIucGQsdGhpcy5lYi5DYSx0aGlzLmViLlRlLGZ1bmN0aW9uKCl7dGhpcy5FYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuZWIub2MpO2Vsc2UgaWYodGhpcy5RcCgpKXRoaXMuY3QoZnVuY3Rpb24oKXt0aGlzLkVjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5kZCx0aGlzLnBsYXllci51KCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuTnQoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5nYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBRYShsLHRoaXMuZWIsZyk7bC5mdCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7CmE9YShtKX0oYT10aGlzLmpyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuQmUmJihjPXRoaXMucGxheWVyLkJlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkRlKGEsYyxmKTt0aGlzLnBsYXllci52aChsKX19LHNxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy51ZC5nZXRUaW1lKCksdGhpcy51ZD1hLDNFNTxiPyEwOiExO3RoaXMudWQ9YTtyZXR1cm4hMX0senQ6ZnVuY3Rpb24oKXtlLmdiKCJwcmVyb2xsIik7ZS5ZZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLmtnKGEpKT90aGlzLkVjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmVkLHRoaXMucGxheWVyLnUoKSkpfSx5dDpmdW5jdGlvbihhKXtpZighdGhpcy5saCl7ZS5ZZSgicG9zdHJvbGwiKTtlLmdiKCJwb3N0cm9sbCIpO3RoaXMubXQoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMua2coYykpP3RoaXMuRWMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIudSgpKSl9fSxrZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEoYil9cmV0dXJuIGF9LFVzOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucnQodGhpcy55dC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxGZDpmdW5jdGlvbihhKXtlLmdiKCJtaWRyb2xsIik7ZS5ZZSgibWlkcm9sbCIpO2lmKCF0aGlzLlpnKXt0aGlzLlpnPSEwO3ZhciBiPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLkVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpnPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnUoKSkpfX0sVHM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5sdCh0aGlzLkZkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkdlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLnp0KCk7dGhpcy5wbGF5ZXIuR2UmJnRoaXMuVHMoKTsKdGhpcy5VcygpfSxWczpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLnpkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ldihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LGN0OmZ1bmN0aW9uKGEpe3RoaXMubmg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5Fcy5iaW5kKHRoaXMpKX0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuUmUucHVzaChhKTsKMD49dGhpcy5BZCYmdGhpcy5uaCgpfSxqcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5SZS5sZW5ndGg7YysrKWI9dGhpcy5SZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy5kaXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kbj10aGlzLmFbM107dGhpcy5Ebj10aGlzLmFbM107dGhpcy5CaT10aGlzLmFbMV07dGhpcy5tcj10aGlzLmFbNl07dGhpcy51bT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVszXX1jLlJrPWI7Yi5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kbjp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRG46dGhpcy5BaShhKX0sQWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJpOnRoaXMubHIoYSl9LApscjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubXI6dGhpcy50bShhKX0sdG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgamM9Yy5Sa3x8amMsVWM9bmV3IGpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuSW4oNCl9KS5jYWxsKE9ib29waGFleGVpRmlOZ2ksT2Jvb3BoYWV4ZWlGaU5naSk7Cg==
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
109.71.25.30 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 02 Sep 2019 07:35:45 GMT
content-encoding
gzip
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
W/"5d1db79a-109"
status
200
access-control-allow-methods
GET
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=900
access-control-allow-headers
accept, content-type
expires
Mon, 02 Sep 2019 07:50:45 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 3442
650 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=3892857409
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9ib29waGFleGVpRmlOZ2k9T2Jvb3BoYWV4ZWlGaU5naXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBjYSgpe3kuTGV8fCh5LkxlPTApO3kuTGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5MZSYmd2luZG93LnNldFRpbWVvdXQoY2EsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7ZGE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGVhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZmEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5UYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGtjKGZhLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5VbillLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5kZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuWmUoYyk7YS5odChsKTthLmd0KG0pO2EuVnMoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBoYShjLGIpe2MucGF1c2UoKTtpZihsLkRiLmxlbmd0aCl7dmFyIGE9bC5EYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5udCh7IltMT0FEU0NSSVBUXSI6ZS5lYSgxMCksIltVVElMU10iOmUuZWEoMTApLCJbQ0FMTEJBQ0tdIjplLmVhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5YZy5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtxKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuWGcoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY3A9dGhpcy5hWzZdO3RoaXMuTHI9dGhpcy5hWzFdO3RoaXMuUWk9dGhpcy5hWzEwXTt0aGlzLkJ0PXRoaXMuYVs5XTt0aGlzLkNqPXRoaXMuYVs1XTt0aGlzLmdyPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzhdfWMuWGo9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmNwOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Mcjp0aGlzLlBpKGEpfSxQaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWk6dGhpcy5BdChhKX0sQXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJ0OnRoaXMuQmooYSl9LEJqOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuQ2o6dGhpcy5mcihhKX0sZnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaWE9Yy5Yanx8aWEsbGM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9bGMuYnAoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVW49ITE7dGhpcy5QYT0ic2V0dXAiO3RoaXMuSGM9W107dGhpcy5lZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkRzLmJpbmQodGhpcykpO3RoaXMuZmI9e307dGhpcy5GZz17fX1jLmprPWI7Yi5wcm90b3R5cGU9e0l0OmZ1bmN0aW9uKCl7dmFyIGE9IiIsYjtmb3IoYiBpbiB0aGlzLmZiKXRoaXMuZmIuaGFzT3duUHJvcGVydHkoYikmJihhKz1iK3RoaXMuZmJbYl0rCiJfIik7cmV0dXJuIGF9LGdiOmZ1bmN0aW9uKGEpe3RoaXMuZmJbYV18fCh0aGlzLmZiW2FdPTApO3RoaXMuZmJbYV0rPTE7NTx0aGlzLmZiW2FdJiYhdGhpcy5GZ1thXSYmKHRoaXMuRmdbYV09ITAsIm5ld0JpZ0FkSWQiPT1hJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jaGVja3RyYWNrcyIsdGhpcy5JdCgpLCEwKSl9LGVlOmZ1bmN0aW9uKCl7dGhpcy5hYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGZuOmZ1bmN0aW9uKGEpe3RoaXMuYWEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmCmEucG9zdE1lc3NhZ2UoYiwiKiIpfSxrYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sRHM6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuQ3MoYS5kYXRhKX0sQ3M6ZnVuY3Rpb24oYSl7aWYodGhpcy5hYSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYj10aGlzLmFhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuYWEmJnRoaXMuYWEuZXZlbnRsaXN0ZW5lciYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmFhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5hYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxYZDpmdW5jdGlvbihhLGIpe3RoaXMuYWEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxlZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnlwKGEpLGQ9ITE7aWYoYilyZXR1cm4gdGhpcy5XZyhhLAoiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LHlwOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LGRuOmZ1bmN0aW9uKGEsYil7aWYoYiYmISgwPnRoaXMuamEoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09CmIpe2lmKGUubXAoYSkpcmV0dXJuOyhiPXRoaXMuZWcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmFhLnVybHNbYV09Yjt0aGlzLmFhLnVybHNbYl09YTt0aGlzLmFhLmhvbWFkVXJsc1thXT1iO3RoaXMuYWEub3JpZ2luYWxVcmxzW2JdPWF9fSxtcDpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5hYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxtZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmFhLm9yaWdpbmFsVXJscyYmdGhpcy5hYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMuYWEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxBcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxvZTpmdW5jdGlvbihhKXtpZighYXx8CiJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZzpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sQWg6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sT2c6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sd2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxuPTAsYz0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgZz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCFnKXJldHVybiExO249Zy5oZWlnaHQqZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYKKGQrPWcubGVmdCk7Zy5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1nLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8biYmKGM9MTAwL24qZCpmKTtjPj1iJiYoZT0hMCk7cmV0dXJuIGV9LHhlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMud2UoYS5lbCxhLnBlcmNlbnQpO2Euc3RhcnRUaW1lfHwoYS5zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCkpO2lmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGUoYSl9LmJpbmQodGhpcyksMTAwKX0sQmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOgoxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxxZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0seGg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLApuLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxnPTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEs9MjcxNzMzODc4LGw9MzI4NTM3NzUyMCxwLG0sdSx4LHE7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7cD1hLmxlbmd0aDt2YXIgdD1bXTtmb3IoZj0wO2Y8cC0zO2YrPTQpbj1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx0LnB1c2gobik7c3dpdGNoKHAlNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcih0LnB1c2goZik7MTQhPXQubGVuZ3RoJQoxNjspdC5wdXNoKDApO3QucHVzaChwPj4+MjkpO3QucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx0Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXRbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO249ZTtwPWc7bT1rO3U9Szt4PWw7Zm9yKGY9MDsxOT49ZjtmKyspcT1kKG4sNSkrKHAmbXx+cCZ1KSt4K2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHg9dSx1PW0sbT1kKHAsMzApLHA9bixuPXE7Zm9yKGY9MjA7Mzk+PWY7ZisrKXE9ZChuLDUpKyhwXm1edSkreCtjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx4PXUsdT1tLG09ZChwLDMwKSxwPW4sbj1xO2ZvcihmPTQwOzU5Pj1mO2YrKylxPWQobiw1KSsocCZtfHAmdXxtJnUpK3grY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUseD11LHU9bSxtPWQocCwzMCkscD1uLG49cTtmb3IoZj02MDs3OT49ZjtmKyspcT1kKG4sNSkrKHBebV4KdSkreCtjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx4PXUsdT1tLG09ZChwLDMwKSxwPW4sbj1xO2U9ZStuJjQyOTQ5NjcyOTU7Zz1nK3AmNDI5NDk2NzI5NTtrPWsrbSY0Mjk0OTY3Mjk1O0s9Syt1JjQyOTQ5NjcyOTU7bD1sK3gmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKGcpK2IoaykrYihLKStiKGwpKS50b0xvd2VyQ2FzZSgpfSxyYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLG4sYyxlLGcsaz0wO2s8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGsrKyksZj1hLmNoYXJDb2RlQXQoaysrKSxuPWEuY2hhckNvZGVBdChrKyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8bj4+NixnPW4mNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKG4pJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKTtyZXR1cm4gYn0seHE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxxYzpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLG49ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuTGI/ITA6CiExfWNhdGNoKHUpe310cnl7bj0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksZz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxrPSFnJiYhIXdpbmRvdy5TdHlsZU1lZGlhLGw9KG18fG4pJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPW47YS5pc0ZpcmVmb3g9YzthLmlzU2FmYXJpPWU7YS5pc0lFPWc7YS5pc0VkZ2U9azthLmlzQ2hyb21lPW07YS5pc0JsaW5rPWw7cmV0dXJuIGF9LHRwOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5xYygpO2IuaXNQaGFudG9tSlM/YT0iSFAiOgpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxoYjpmdW5jdGlvbigpe3ZhciBhPXtNaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxlajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxYcDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSx5bTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sClBuOmZ1bmN0aW9uKCl7cmV0dXJuIGEuTWkoKXx8YS5laigpfHxhLlhwKCl8fGEubGwoKXx8YS55bSgpfX07cmV0dXJuIGEuUG4oKX0samE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxuPWEubGVuZ3RoO2Y8bjsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxRYjpmdW5jdGlvbihhKXthPXRoaXMuamEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSx5YTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LElwOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LApiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLmphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sd286ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxuPTA7bjxiLmxlbmd0aDtuKyspZFtiW25dXT0hMDtmb3Iobj0wO248YS5sZW5ndGg7bisrKWRbYVtuXV18fGYucHVzaChhW25dKTtyZXR1cm4gZn0sRXQ6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChuKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxxZzpmdW5jdGlvbihhKXthPQpNYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLk9oKGIpKyI6Iit0aGlzLk9oKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxPaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sWWU6ZnVuY3Rpb24oYSl7dGhpcy5QYT1hfSxvZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLlBhO3RoaXMuUGYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LHNjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5vZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSwKYixkLGYsbixjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5TYShiLGQpKTtiJiYoQj1rLlNhKGEsYikpO2YmJihCPWsuU2EoQixmKSk7biYmKEI9ay5TYShCLG4pKTtjJiYoQj1rLlNhKEIsYykpO2cmJihCPWsuU2EoQixjKSk7ZS5zYyhCKX0sRnM6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlJiYxMDIzIT1hLmNvZGUmJjEwMTghPWEuY29kZSl7dHJ5e2phJiYoYi5zZXNzaW9uX2lkPWphKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2IuZXZlbnQ9YS5jb2RlO2Iuc2l0ZV9ocmVmPXRoaXMuSXAoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpiLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yi5wb3NpdGlvbj0KMjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn19LFBmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRnMoYSk7aWYoYilpZighbHx8IWwuWCl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGYoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuQmQoKTtsLndhKGEsITApO2E9bC53YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLklhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwKIWwuWCl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9YStiO3RoaXMuSmN8fCh0aGlzLkpjPXt9KTt0aGlzLkpjW2ZdfHwodGhpcy5KY1tmXT0wKTt0aGlzLkpjW2ZdKys7MTA8dGhpcy5KY1tmXXx8KGY9bC5CZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC53YShmLCEwKSxmPWwud2EoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPQohMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSkpfX0sRWU6ZnVuY3Rpb24oKXtsJiZsLlg/bC5pc0VuYWJsZWQmJmwuYm8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRWUoKX0uYmluZCh0aGlzKSw1MDApfSxtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHBlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOgoiIn0sYmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5vZChhKToiIn0sb2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFRmOmZ1bmN0aW9uKGEsYixkLGYpe2Q9ITE7aWYoYi56ZShhKXx8dGhpcy5BcShhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LldlJiZ3aW5kb3cuc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LldlWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LldlWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLm1nKGEpKXJldHVybiB0aGlzLm1nKGEpO3ZhciBuPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9OwpuLmhvbWFkX3VybF9zdWZmaXg9YTtuLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYSk7bi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO24uaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihuWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihuLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO24uaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7bi5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKG4uaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlRhKGEsYi5HYSxuLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGUpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5zZCgpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy5kbihjLGEpO3JldHVybiBjfSwKVGE6ZnVuY3Rpb24oYSxiLGQsZixuLGMsZSxnKXt2YXIgaz1jfHxsO2M9ITA7ZyYmKGM9ITEpO2lmKGsmJmsuWClpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKG0pe24obSl9aWYoInN0cmluZyIhPXR5cGVvZiBhKW4oKTtlbHNle2sud2EoYSxjKTtjPWsud2EoYSxjKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2MuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWMuZGF0YVtxXT1kW3FdO3JldHVybiBrLklhKGMsZixuLCIiLCIiLGUpfX1lbHNlIG4oKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYShhLGIsZCxmLG4sayxlLGcpfS5iaW5kKHRoaXMpLDUwMCl9LFdnOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7CmQ9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocSl7YyYmYygpfXJldHVybiBsfSxicjpmdW5jdGlvbihhLGIsZCl7dGhpcy5XZyhhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5IYylmb3IodmFyIGMgaW4gdGhpcy5IYylhPWEuc3BsaXQoYykuam9pbih0aGlzLkhjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucmIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxYZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucmIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLlRhKGEsZi5HYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuYnIoZi5zZCgpLnJlcGxhY2UoIltoYXNoXSIsCmEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkhjPWF9LGV2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5UYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsCm1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxRbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sdnE6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlNhPQpmdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IudnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IudXI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVnU9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5Ubz17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmF2PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTmY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuR2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTsKYi5LZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuWG09e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuSWY9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5DdT17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudHI9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVW89e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLld1PQp7Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5iZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLm9vPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5lZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLmRkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5NZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuWm09e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLlJjPQp7Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuVWQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuV2Q9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLlltPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5WaD17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLkFyPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudmQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IubGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLmNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuVXU9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuenU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi52cj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5pa3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbOV07dGhpcy5IaT10aGlzLmFbNV07dGhpcy4kdT10aGlzLmFbMl07dGhpcy5Jaj10aGlzLmFbOV07CnRoaXMubW49dGhpcy5hWzRdO3RoaXMuVmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOF19Yy5Uaz1iO2IucHJvdG90eXBlPXtSbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU286dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhpOnRoaXMuWnUoYSl9LFp1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kdTp0aGlzLkhqKGEpfSxIajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSWo6dGhpcy5sbihhKX0sbG46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1uOnRoaXMuVWwoYSl9LFVsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5WbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVGt8fGthLG1jPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD1tYy5Sbyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmtrPWI7Yi5wcm90b3R5cGU9e3FlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxzYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKX0sQ3A6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rCm5hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LG1kOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5tZChhKzY1KTtpZig5MDxhKXJldHVybiB0aGlzLm1kKE1hdGgucm91bmQoYS8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQ9YS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0seGM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5xZSh0aGlzLnNiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMubWQoYVtkXSk7CjA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnhjKCkrIjIifSxMZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnFlKHRoaXMuQ3AoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5tZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ra3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DbT10aGlzLmFbNF07dGhpcy5waj10aGlzLmFbNF07dGhpcy5UcD10aGlzLmFbN107dGhpcy5IcT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5Taz1iO2IucHJvdG90eXBlPXtCbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQ206dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5wajp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHA6dGhpcy5HcShhKX0sR3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLlNrfHxsYSxuYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1uYy5CbSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmCmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubTt0aGlzLm09ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm09aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuaGo9Yn0pKGMpO3ZhciBMPWMuaGp8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubW09dGhpcy5hWzNdO3RoaXMuZ2s9dGhpcy5hWzhdO3RoaXMuZXM9dGhpcy5hWzJdO3RoaXMuVGw9dGhpcy5hWzldO3RoaXMuRG89dGhpcy5hWzldO3RoaXMuc3U9dGhpcy5hWzJdOwp0aGlzLkprPXRoaXMuYVs2XTt0aGlzLmtuPXRoaXMuYVs4XTt0aGlzLmdtPXRoaXMuYVsxXTt0aGlzLllyPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuSnI9YjtiLnByb3RvdHlwZT17bG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nazp0aGlzLmRzKGEpfSxkczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZXM6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5UbDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRG86dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnN1OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMua246dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5nbTp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBtYT1jLkpyfHxtYSxvYz1uZXcgbWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1vYy5sbSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLnhsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuSmE9e307dGhpcy5LPW51bGw7dGhpcy5DYz0xMDA7dGhpcy5DYj0wO3RoaXMuUWE9MTUwO3RoaXMuRmI9MDt0aGlzLml0KGIpfSxnOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5DYjw9dGhpcy5RYT8odGhpcy5DYisrLHRoaXMuRmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5DYykpOjA+dGhpcy5RYSYmKHRoaXMuRmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCnRoaXMuQ2MpKX0sWHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYj50aGlzLlFhPyEwOiExfSxWZTpmdW5jdGlvbigpe3RoaXMuQ2I9MH0sTzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGl0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxBcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LFA6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLk8oKSwhMCk7dGhpcy5KYVtiLnNiKCldPWI7TSYmTS5UZyYmTS5IdChiKX0sQXY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5vZSh0aGlzLkphKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5KYSlpZihhPT10aGlzLkphW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkphW2Iuc2IoKV0/ITA6ITF9LHdxOmZ1bmN0aW9uKGIpe2I9Yi5GYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkphKWlmKGIuaWQ9PXRoaXMuSmFbYV0uRmEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0sT3Y6ZnVuY3Rpb24oYil7dGhpcy5KYVtiLmlkXT0KbnVsbH19KX0pKGMpO3ZhciB0PWMueGx8fHQ7KGZ1bmN0aW9uKGMpe2Muemw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5DYz0xMDt0aGlzLkNiPTA7dGhpcy5RYT01MDt0aGlzLlY9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy53Yj0iIjt0aGlzLmdnPSExO3RoaXMuUygpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuRmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sUzpmdW5jdGlvbigpe30sS2E6ZnVuY3Rpb24oKXt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuVj1ifSxCdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZ9LGx0OmZ1bmN0aW9uKGIpe3RoaXMuSGU9CmJ9LHp2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGV9LEdlOmZ1bmN0aW9uKCl7fSxSOmZ1bmN0aW9uKCl7dGhpcy5DYjw9dGhpcy5RYSYmKHRoaXMuQ2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSx0aGlzLkNjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LAp0ZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxzYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxEZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LFF2OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlJwKCl8fHRoaXMuJG0oKTt0aGlzLkRkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sQ3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sJG06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sUnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFk6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRmE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09CnR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxSYTpmdW5jdGlvbigpe3JldHVybiExfSxKdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxuYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LERjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmCmIubXV0ZWQ/Yi5tdXRlZDohMX0sQmU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdmg6ZnVuY3Rpb24oYil7dGhpcy53Yj1ifSx5djpmdW5jdGlvbigpe3JldHVybiB0aGlzLndifSxyaDpmdW5jdGlvbigpe3RoaXMud2I9bnVsbH0sRXY6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLndiJiYoYj0hMCk7cmV0dXJuIGJ9LEx2OmZ1bmN0aW9uKCl7dGhpcy5nZ3x8KHRoaXMuZ2c9ITApfSxsZTpmdW5jdGlvbigpe3JldHVybiExfSx2djpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHI9Yy56bHx8cjsoZnVuY3Rpb24oYyl7Yy5laT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuSz10aGlzLnBsYXllcj0iIjt0aGlzLkNmPSIxIjt0aGlzLkRmPSIyIjt0aGlzLlVtPSIzIjt0aGlzLk1jPTA7dGhpcy4kZz0zMDt0aGlzLkpiPVtdO3RoaXMuWmE9W107CnRoaXMuZWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuUWY9dGhpcy5SaD0hMTt0aGlzLnN0YXR1cz10aGlzLk1jO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy5aZShiKTt0aGlzLmp0KGEpfSxnOmZ1bmN0aW9uKCl7fSxxYTpmdW5jdGlvbigpe3RoaXMuUmh8fCh0aGlzLlJoPSEwLGUuRWUoKSl9LEtlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5PKCk7UyYmUy5TYiYmIW5hJiYobmE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sSTpmdW5jdGlvbihiLGEpe3ZhciBoPSEwO2ImJihoPSExKTtyZXR1cm4gdGhpcy5yYSgpPyExOih0aGlzLm90KCksdGhpcy5LKHRoaXMuZ2V0UGxheWVyKCksaCksdGhpcy5LaCgpLHRoaXMuUWY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLnJhKCl8fCh0aGlzLkpiLnB1c2goYiksCnRoaXMuWmEucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LEtoOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy5KYiYmMDx0aGlzLkpiLmxlbmd0aCYmKHRoaXMuSmI9ZS51bmlxdWUodGhpcy5KYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuSmIuam9pbigiLCIpKSk7aWYodGhpcy5aYSl7Zm9yKHZhciBoPTA7aDx0aGlzLlphLmxlbmd0aDtoKyspdGhpcy5lY1t0aGlzLlphW2hdLnJlYXNvbl09PXRoaXMuZWNbYl0mJmEucHVzaCh0aGlzLlphW2hdLmRldGFpbCksdGhpcy5lY1t0aGlzLlphW2hdLnJlYXNvbl08dGhpcy5lY1tiXSYmKGE9W10sYS5wdXNoKHRoaXMuWmFbaF0uZGV0YWlsKSxiPXRoaXMuWmFbaF0ucmVhc29uKTt0aGlzLmVjW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGg9ZS51bmlxdWUoYSksYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sRHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RZn0sCnc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNmfSxvdDpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGZ9LHB0OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5VbX0scGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk1jfSxIZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5DZn0sbHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRGZ9LHJhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLk1jfSxaZTpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGp0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxBcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LGVyOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy5laXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuWmo9dGhpcy5hWzJdO3RoaXMuWm89dGhpcy5hWzddO3RoaXMuTG89dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNV19Yy5obD1iO2IucHJvdG90eXBlPXtZajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWmo6dGhpcy5ZbyhhKX0sWW86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlpvOnRoaXMuS28oYSl9LEtvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Mbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9hPWMuaGx8fG9hLHBjPW5ldyBvYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXBjLllqKDQpOyhmdW5jdGlvbihjKXtjLk1qPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Db250YWluZXI7CnRoaXMuWShiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpO3ZhciBwYT1jLk1qfHxwYTsoZnVuY3Rpb24oYyl7Yy5Oaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPWIubXY7YT9hLmxhP2EubGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dmFyIGI9ITEsZj0iIjthLmdldEVycm9yJiYoYj1hLmdldEVycm9yKCkpO2J8fGEuZGV0YWlsLmdldEVycm9yJiYKKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnFhKCkpOih0aGlzLm8oImFkZXJyb3IiKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKTpiLl9hZENvbmZpZy5hZHNEaXNhYmxlZHx8KHRoaXMubygiZnJhbWV3b3JrIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgcWE9Yy5Oanx8cWE7KGZ1bmN0aW9uKGMpe2MuT2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBwYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IHFhKGIsdGhpcy5LKSkuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciByYT1jLk9qfHxyYTsobmV3IHJhKHEpKS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHM9dGhpcy5hWzddO3RoaXMua2k9dGhpcy5hWzFdO3RoaXMuTXQ9dGhpcy5hWzFdO3RoaXMueWo9dGhpcy5hWzFdO3RoaXMuRHE9dGhpcy5hWzldO3RoaXMuem89dGhpcy5hWzJdO3RoaXMubWo9dGhpcy5hWzJdO3RoaXMuRnI9dGhpcy5hWzRdO3RoaXMuSHM9dGhpcy5hWzVdOwp0aGlzLmo9dGhpcy5hWzddfWMuSm89YjtiLnByb3RvdHlwZT17a3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxzOnRoaXMuamkoYSl9LGppOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5raTp0aGlzLkx0KGEpfSxMdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTXQ6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnlqOnRoaXMuQ3EoYSl9LENxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EcTp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuem86dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm1qOnRoaXMuRXIoYSl9LEVyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gcjp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBzYT1jLkpvfHwKc2EscWM9bmV3IHNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9cWMua3MoNCk7KGZ1bmN0aW9uKGMpe2Mudms9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dGhpcy5UYj0hMTt0aGlzLmxnKCk7dGhpcy5uZygpO3RoaXMubm89ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5UYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuVGI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuWShiKX0sbmc6ZnVuY3Rpb24oKXtpZighdGhpcy5UYil7dmFyIGI9dGhpcy5GYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CmF8fCh0aGlzLlRiPSEwKTt0aGlzLlooYSl9fSxLYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5WJiYoMCx0aGlzLlYpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuViYmKDAsdGhpcy5WKSgpfS5iaW5kKHRoaXMpKX0sCkdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuRmQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkZkKGEpfS5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLkhlJiYoMCx0aGlzLkhlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fAoicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTzpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmCihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHRhPWMudmt8fHRhOyhmdW5jdGlvbihjKXtjLnVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFM6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NYzt0aGlzLmlzUGxheWluZz10aGlzLk9jPSExO3RoaXMuVmQ9MTt0aGlzLlBjPVtdO3RoaXMucGI9ITF9LGc6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLk9jPSExO3RoaXMuVmQ9MTt0aGlzLlBjPVtdO3RoaXMucGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmCih0aGlzLlZkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5wYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMucGI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMucGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnBiPSEwKSk6dGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5PYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkSW1wcmVzc2lvbiIpO3RoaXMuS2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLncoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLiRnJiYhdGhpcy5yYSgpJiYodGhpcy5wYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5zKCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnMoITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLApjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLnJhKCkmJih0aGlzLnBhKCksdGhpcy5nZXRQbGF5ZXIoKS5ubz0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkud2I7YSYmKGEueGQoKSxhLmZkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy53KCJvbkFkQ29tcGxldGUiKTt0aGlzLk9jPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5LZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpOwppZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuJGcmJiF0aGlzLnJhKCkmJih0aGlzLnBiPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5QYy5pbmRleE9mKGEpJiZ0aGlzLlBjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucWEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOgoodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuUGMubGVuZ3RoPj10aGlzLlZkJiZ0aGlzLnMoKSl9LGVyOmZ1bmN0aW9uKGIpe3RoaXMubSgiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMuaWU/dGhpcy5pZSsrOnRoaXMuaWU9MTp0aGlzLmhlP3RoaXMuaGUrKzp0aGlzLmhlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkFoKGEudmlkZW9UYWcpP2EuVGI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5PY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuaGU+dGhpcy5pZSYmKGI9ITEpLHRoaXMuSShiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksNTApOihhLmxnKCksYS5uZygpLGEuVGJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdWE9Yy51a3x8dWE7KGZ1bmN0aW9uKGMpe2Mud2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKZzpmdW5jdGlvbigpe3ZhciBiPWUuamEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMud3AoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPQpbXTtpZigxPGEubGVuZ3RoKWZvcihoPTA7aDxhLmxlbmd0aDtoKyspYi5wdXNoKGFbaF0uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyB0YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy53cShoKXx8KHRoaXMuUChoKSxoPW5ldyB1YShoLHRoaXMuSyksaC5TKCksaC5nKCkpfX10aGlzLlIoKX19LHh2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LHdwOmZ1bmN0aW9uKCl7dmFyIGI9ZS5qYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5yYihiLmFuY2hvcil9fSl9KShjKTt2YXIgdmE9Yy53a3x8dmEsd2E9bmV3IHZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdqPQp0aGlzLmFbOF07dGhpcy5mdT10aGlzLmFbMTBdO3RoaXMuUnI9dGhpcy5hWzRdO3RoaXMueHM9dGhpcy5hWzhdO3RoaXMuRms9dGhpcy5hWzddO3RoaXMuU2k9dGhpcy5hWzddO3RoaXMubmw9dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzEwXTt0aGlzLmFrPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzFdfWMuc3M9YjtiLnByb3RvdHlwZT17Zmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdqOnRoaXMuZXUoYSl9LGV1OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhzOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Gazp0aGlzLlJpKGEpfSxSaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuU2k6dGhpcy5tbChhKX0sbWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5ubDp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnQ6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFrOnRoaXMuVm4oYSl9LFZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIHhhPWMuc3N8fHhhLHJjPW5ldyB4YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXJjLmZqKDQpOyhmdW5jdGlvbihjKXtjLnJtPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlkoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlooYik6dGhpcy5uYSgpKTp0aGlzLm5hKCl9ZWxzZSB0aGlzLm5hKCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5KZChiKX0uYmluZCh0aGlzKSl9LEpkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlYmJnRoaXMuVigpfSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sUmE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeWE9Yy5ybXx8eWE7KGZ1bmN0aW9uKGMpe2MucW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYiwKYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuY2E9dGhpcy53Yz10aGlzLnhhPXRoaXMuV2M9ITE7dGhpcy5vaD1lLkJiKDEwKTt0aGlzLlFoPSEwO3RoaXMuamM9dGhpcy5JZz0hMTt0aGlzLnNyKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy5kaCgpLHRoaXMuWm4oKSx0aGlzLmpiKCkpfSxzcjpmdW5jdGlvbihiKXtyZXR1cm4gZS55YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxNdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuc2IoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuVywiOyIsdHlwZW9mIGIuVywiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5XP2IuVy5zdGF0ZToKInVuZGVmaW5lZFgiLCI7IixiLlc/dHlwZW9mIGIuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuRGE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuRGE6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5EYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkRhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5EYT9iLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkRhP3R5cGVvZiBiLmltYS5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5EYT9iLkouRGEoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkRhP3R5cGVvZiBiLkouRGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLlNkOiJ1bmRlZmluZWRYIiwKIjsiLGIuSj90eXBlb2YgYi5KLlNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuVGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuVGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5UZDoidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLlRkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLmxhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmxhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmxhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoubGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLllkOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouWWQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5ZZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLm9oKX0sdGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFBiOmZ1bmN0aW9uKCl7aWYoIXRoaXMubGEpe3ZhciBiPXRoaXMudGIoKTsKYiYmKGIuYWRzTG9hZGVyJiYodGhpcy5sYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5sYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5sYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5sYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5sYX0sd2c6ZnVuY3Rpb24oKXtpZighdGhpcy53Yyl7dmFyIGI9dGhpcy50YigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLndjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy53Yz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLndjfSx1cTpmdW5jdGlvbigpe2lmKCF0aGlzLkhnKXt2YXIgYj10aGlzLnRiKCksYT10aGlzLnRxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5IZz0hMCl9cmV0dXJuIHRoaXMuSGd9LAp0cTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuV2MmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLldjPSEwKTtyZXR1cm4gdGhpcy5XY30samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlBiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihoPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuU3MoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVCk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMucmEoKXx8CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qYigpfS5iaW5kKHRoaXMpLDIwKX0sU3M6ZnVuY3Rpb24oKXt0aGlzLmpjPSEwO3ZhciBiPXRoaXMud2coKTtpZihifHx0aGlzLnJhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsCmZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLmhiKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMua2M9ITA7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5rYz0hMDtpZihlLnlhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMua2M9ITA7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMua2M9ITA7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMua2M9ITA7ZS55YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmtjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuZmEoKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpiKCl9LmJpbmQodGhpcyksMjApfSx3djpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuZGcmJmIuYWRzJiYodGhpcy5kZz1iLmFkcyk7cmV0dXJuIHRoaXMuZGd9LFpuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5wYSgpO3RoaXMuZmEoITApO3RoaXMubygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5UKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5LZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5YKWhvbWFkVXRpbHMuSGEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMud2coKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmpkKCl9LmJpbmQodGhpcyksNTApKX0sZGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMudXEoKSl7dmFyIGE9dGhpcy50YigpLGg9dGhpcy5QYigpO2EmJmgmJih0aGlzLnRiKCksdGhpcy5QYigpLHRoaXMuamN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qYz90aGlzLncoKToodGhpcy5mYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMudGIoKX1lbHNlIHRoaXMuSWc/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnRiKCksYj10aGlzLlBiKCk7YSYmIWI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwKMTAwKTp0aGlzLklnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5yYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGgoKX0uYmluZCh0aGlzKSw1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTticmVha319LCRuOmZ1bmN0aW9uKCl7dGhpcy5uY3x8KHRoaXMubmM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLm5jIT1iLmFkcy5zdGF0ZSYmKHRoaXMubmM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMubmMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5uYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJG4oKX0uYmluZCh0aGlzKSwxMCl9LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2F9LApBYTpmdW5jdGlvbigpezA8PWUuUWIoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuVD8odGhpcy5jYT0hMCx0aGlzLnMoITApKToodGhpcy5jYT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jYT8odGhpcy53KCksdGhpcy5xYSgpKTp0aGlzLnMoYil9LmJpbmQodGhpcyksMTAwKX0sczpmdW5jdGlvbihiKXt0aGlzLnJhKCl8fChifHwodGhpcy5RaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkkodGhpcy5RaCxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZm86ZnVuY3Rpb24oKXt0aGlzLkZ2fHwoMTA8dGhpcy5IdT8odGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5IdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLldzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZvKCl9LmJpbmQodGhpcyksNTApKSl9LFdzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLkl1KXt0aGlzLkl1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLm8oImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSwKNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHphPWMucW18fHphOyhmdW5jdGlvbihjKXtjLnNtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLkJoKHdpbmRvdyk7CmZvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKXRyeXthPWF8fHRoaXMuQmgoYltoXSl9Y2F0Y2goZCl7fXRoaXMuUigpfX0sQmg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5vZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB5YShiW2hdKSxhLm9hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUChhKSwobmV3IHphKGEsdGhpcy5LKSkuZygpKSk7cmV0dXJuITB9cmV0dXJuITF9LFI6ZnVuY3Rpb24oKXt0aGlzLkZiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuQ2MpfX0pfSkoYyk7dmFyIEFhPWMuc218fEFhLEJhPW5ldyBBYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGk9dGhpcy5hWzhdO3RoaXMuVHE9dGhpcy5hWzEwXTt0aGlzLldqPXRoaXMuYVsyXTt0aGlzLkhsPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzFdfWMuZHY9YjtiLnByb3RvdHlwZT17d2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhpOnRoaXMuU3EoYSl9LFNxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5UcTp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuV2o6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgQ2E9Yy5kdnx8Q2Esc2M9bmV3IENhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2Mud2koNCk7CihmdW5jdGlvbihjKXtjLnJsPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3RoaXMuTWU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLm5hKCk7cmV0dXJufXRoaXMuWShhKTsoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMubmEoKX0sQXM6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy53YixoPXRoaXMuc2IoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuU2ImJigwPD1oLmluZGV4T2YoZCl8fGEueGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fAoodGhpcy5NZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LFJhOmZ1bmN0aW9uKCl7dGhpcy5NZSsrO2lmKDEwPHRoaXMuTWUpcmV0dXJuITE7dGhpcy5wYXVzZSgicGF1c2VSZXBlYXRPbkFkRGVsaXZlcnkiKTtyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJgp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTpiLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmlmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxLYTpmdW5jdGlvbigpe30sSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5WJiZ0aGlzLlYoKX19KX0pKGMpO3ZhciBEYT1jLnJsfHxEYTsoZnVuY3Rpb24oYyl7Yy5xbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLmtlKWlmKHRoaXMueGJ8fCh0aGlzLnhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJgp0aGlzLnhiKyssMTU8dGhpcy54Yil0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5zKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLmtlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmNhfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlQpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGEoKX0uYmluZCh0aGlzKSwxMCk7CmVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTsKcmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5UPXRoaXMuVHx8ITE7dGhpcy54YSgpO3ZhciBhPXdpbmRvdy5vdlZpZGVvO2F8fChhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIpO2EmJmEucmVnaXN0ZXJFdmVudCYmIXRoaXMuYXA/KGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnBhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnBhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsCmZ1bmN0aW9uKCl7dGhpcy5wYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsdGhpcy5UKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy5hcD0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihhKXtiLkFzKGEpfS5iaW5kKHRoaXMpKSk6Yi5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuSShiKX19KX0pKGMpO3ZhciBFYT1jLnFsfHxFYTsoZnVuY3Rpb24oYyl7Yy5zbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlFhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJgowPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7aWYoMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IERhKGJbYV0pO2gub2F8fHRoaXMuTihoKXx8KHRoaXMuUChoKSwobmV3IEVhKGgsdGhpcy5LKSkuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBGYT0KYy5zbHx8RmEsR2E9bmV3IEZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRsPXRoaXMuYVsxXTt0aGlzLkFqPXRoaXMuYVsyXTt0aGlzLm1xPXRoaXMuYVs4XTt0aGlzLnhyPXRoaXMuYVsxXTt0aGlzLmJtPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzhdfWMuU3I9YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiRsOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bajp0aGlzLmxxKGEpfSxscTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1xOnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHI6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgSGE9CmMuU3J8fEhhLHRjPW5ldyBIYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXRjLlpsKDQpOyhmdW5jdGlvbihjKXtjLnNrPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1lLnVnKGIsImVsZW1lbnRJRCIpO3RoaXMuamg9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT0KdGhpcy5qaD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk6ImFmdGVyIj09dGhpcy5qaD9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpO3RoaXMuWShoKTt0aGlzLlooaCk7dGhpcy5sZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmxkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZW86ZnVuY3Rpb24oKXtlLk9nKHRoaXMubGQpO2Uud2UodGhpcy5sZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVvKCl9LmJpbmQodGhpcyksNTApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSWE9Yy5za3x8SWE7KGZ1bmN0aW9uKGMpe2Mucms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMubygiZXh0ZXJuYWwiKTsKdGhpcy5JKCEwKX19KX0pKGMpO3ZhciBKYT1jLnJrfHxKYTsoZnVuY3Rpb24oYyl7Yy50az10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLlFhPTE1MDA7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS51ZyhiLCJlbGVtZW50SUQiKTtlLk9nKGEpJiYoYj1uZXcgSWEoYiksdGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgSmEoYix0aGlzLkspKS5nKCkpKTt0aGlzLkZiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLkZiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBLYT1jLnRrfHxLYSxMYT1uZXcgS2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueWs9dGhpcy5hWzddO3RoaXMuTWw9dGhpcy5hWzldOwp0aGlzLlByPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMub2s9YjtiLnByb3RvdHlwZT17eGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NbDp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTWE9Yy5va3x8TWEsdWM9bmV3IE1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMueGsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmxrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPQphfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LGFuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMubGt8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxoLGQsZil7dGhpcy5YYT1hO3RoaXMucGc9dGhpcy4kaD0hMTt0aGlzLmVoPWQ7dGhpcy5DaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5YYT1uZXcgeihhKSk7dmFyIGM9dGhpcy5sYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbCYmbC5BZSh0aGlzLlhhLnVybCkmJgpsLktkKXt2YXIgZT1uZXcgeihhLnVybCk7ZS5rdCgiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoZSxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChoKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMubWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMucGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkNoPwp0aGlzLmxiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMubGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy4kaHx8KHRoaXMubGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmxiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmxiLnNlbmQoYSl9Y2F0Y2goZil7bCYmbC5BZSh0aGlzLlhhLnVybCk/bC5LZD9sLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTpsLkFlKHRoaXMuWGEudXJsKSx0aGlzLmVoJiZ0aGlzLmVoKCl9cmV0dXJuIHRoaXMubGJ9fX0pKGMpO3ZhciBOYT1jLm1rfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9CiExO3RoaXMubWM9IiI7dGhpcy5aZD10aGlzLmxjPXRoaXMucWI9bnVsbDt0aGlzLnhvPXRoaXMuRGI9dGhpcy5WZz0hMTt0aGlzLkdhPSIiO3RoaXMuUWc9ITE7dGhpcy5DYT10aGlzLnBkPSIiO3RoaXMuTWc9dGhpcy5YPXRoaXMuaXNFbmFibGVkPXRoaXMuVGU9ITE7dGhpcy56YT1bXTt0aGlzLkNnPXRoaXMuV2I9IiI7dGhpcy5nZT0hMTt0aGlzLmdmPTA7dGhpcy54Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLnZmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5JYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5kYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy53Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuWWI9IiI7dGhpcy5FYj1bXTt0aGlzLlpiPVtdO3RoaXMuWGI9IiI7dGhpcy5oZj0wO3RoaXMudmlkZW9wbGF6YT0Ke307dGhpcy52Yz0hMTt0aGlzLmhvPXRoaXMuTGQ9bnVsbDt0aGlzLnloPXRoaXMuS2M9dGhpcy5pZz10aGlzLm1mPXRoaXMuS2Q9dGhpcy5hZT10aGlzLk5jPSExO3RoaXMuJGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucmQ9MDt0aGlzLkVnPSExO3RoaXMuRGc9MUUzO3RoaXMuWWM9ITE7dGhpcy5NYT0xRTM7dGhpcy5GZj0iIn1jLm5rPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLkhhLGFkdGFncGFyYW1ldGVyOnRoaXMubWMsYWR0YWdtb2RpZmllcjp0aGlzLnFiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5sYyxhZHRhZ3JlZ2V4OnRoaXMuWmQsYml0cmF0ZTp0aGlzLk1hLGpzcG9wdXBzOnRoaXMuVmcsc2lkZWxvYWRzOnRoaXMuRGIsZGlzYWJsZXRlc3RzOnRoaXMueG8saG9tYWRBbGlhczp0aGlzLkdhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5RZyxnbG9iYWxDb25maWc6dGhpcy5wZCxjbGllbnRDb25maWc6dGhpcy5DYSwKaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5YLGlzQmxvY2tlZDp0aGlzLk1nLHNlcnZlcjp0aGlzLnphLHN2bUNvbmZpZzp0aGlzLldiLGhvbWFkQWRwYXRoOnRoaXMuQ2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5nZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5nZixIT01BRF9WRVJJRklFRDp0aGlzLnhmLEhPTUFEX0JMT0NLRUQ6dGhpcy52ZixIT01BRF9OT0JMT0NLRVI6dGhpcy5JYixIT01BRF9BREJMT0NLRVI6dGhpcy5kYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMud2YsdGVzdEhpZGU6dGhpcy5ZYix0ZXN0VGFnczp0aGlzLkViLHRlc3RUYWdzSlM6dGhpcy5aYix0ZXN0Q29va2llOnRoaXMuWGIsdGhyb3R0bGU6dGhpcy5oZix2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLnZjLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuaG8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5OYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuYWUsCnVzZVN0cmljdENoZWNrczp0aGlzLktkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLm1mLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuJGEsc2l0ZUNvbmZpZzp0aGlzLldhLHNlcnZlcklkOnRoaXMudWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLnJjLHZwYWlkOnRoaXMuS2Msc2tpcEFsbG93ZWQ6dGhpcy55aCx2bWFwczp0aGlzLldoLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5ZYyxhZEZhbGxiYWNrVVJMOnRoaXMuRmZ9fSxQcDpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLiRhW2JdJiYxPT10aGlzLiRhW2JdJiYoYT0hMCk7cmV0dXJuIGF9LFhlOmZ1bmN0aW9uKGEpe3RoaXMuJGFbYV09ITB9LHhwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sSWQ6ZnVuY3Rpb24oYSl7YT0KYXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkJiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpO3JldHVybiBhPWUuUW4oYSl9LHdhOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj0iIixjPSIiLGU9IiIsZz0iIjtpZighdGhpcy5IYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2Y9dGhpcy56ZShhKTtjPXRoaXMuamEoYSk7Zj8odGhpcy55YygpP2U9YTplPWMucHJvdG9jb2wrIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9CmMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuQmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy5tY3x8dGhpcy5xYnx8dGhpcy5sY3x8dGhpcy5aZCkmJihnPXRoaXMub3IoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy56cChjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5yYihnKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LHplOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7KGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy55YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHljOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLnphJiZ0aGlzLnphLmxlbmd0aCYmMDx0aGlzLnphLmxlbmd0aCYmKGI9dGhpcy56YVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxBZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLnplKGEpO3JldHVybiBifSx6cDpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sCmIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuc3Y7cmV0dXJuIm5vbmUifSxzZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnphW3RoaXMudWhdfSxCZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2QoKSxiPXRoaXMueGgoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sYWg6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChmKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sbnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLmphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksCmY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMuYWgoZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLmFoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPWZ9bD1bXTtmb3IoYyBpbiBkLnF1ZXJ5S2V5KWwucHVzaChjKyI9IitkLnF1ZXJ5S2V5W2NdKTtyZXR1cm4gZj1kLmhvc3QrZC5wYXRoKyI/IitsLmpvaW4oIiYiKX0sb3I6ZnVuY3Rpb24oYSl7dGhpcy5tYyYmKGErPXRoaXMubWMpO2lmKHRoaXMucWIpZm9yKHZhciBiIGluIHRoaXMucWIpdGhpcy5xYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5xYltiXSkpO3RoaXMubGMmJihhPXRoaXMubnIoYSx0aGlzLmxjKSk7cmV0dXJuIGF9LApsOmZ1bmN0aW9uKGEsYixkLGYsYyxlKXtsPXRoaXM7dGhpcy5RZz0hMDt0aGlzLnBkPWE7dGhpcy5DYT1iO3RoaXMuVGU9ZDt0aGlzLkxkPWY7dGhpcy5vYz1jO3RoaXMuV2E9ZXx8e307dGhpcy5hcigpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5DYSl0aGlzLlpxKCk7ZWxzZSBpZigib2JqZWN0IiE9PXR5cGVvZiB0aGlzLkNhKXRyeXt0aGlzLkNhPWIoKSx0aGlzLmJkKCl9Y2F0Y2goZyl7dGhpcy5pYSgibm9DbGllbnRDb25maWciKX19LGliOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxhcjpmdW5jdGlvbigpe3RoaXMuSWEobmV3IHoodGhpcy5wZCt0aGlzLlRjKCJnbG9iYWwiKSksdGhpcy5OcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiYKdGhpcy5iZCgpfS5iaW5kKHRoaXMpLCEwKX0sWnE6ZnVuY3Rpb24oKXtuZXcgeih0aGlzLkNhK3RoaXMuVGMoImNsaWVudCIpKTt0aGlzLklhKG5ldyB6KHRoaXMuQ2ErdGhpcy5UYygiY2xpZW50IikpLHRoaXMuYmQuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuWGUoImNsaWVudCIpO3RoaXMuaWEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LFRjOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLkJiKCk7dGhpcy5XYSYmdGhpcy5XYS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuV2EmJnRoaXMuV2Eubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxpYTpmdW5jdGlvbihhKXtpZighdGhpcy5hZSl7dGhpcy5hZT0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJgphW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtiXS5wYXVzZSl0cnl7YVtiXS5wYXVzZSgpfWNhdGNoKGgpe31hW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSl9YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsKIjRwbGF5ZXJzLmRlIj09ZS5RYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMub2M9ITEpO3RoaXMub2MmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5vYz90aGlzLm9jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlg9dGhpcy5NZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuaWIodGhpcy52ZikpO3RoaXMuR2IoKTtlLnNjKGsudnMpOyhiPWUuUWIodGhpcy5zZCgpKSl8fChiPWUuUWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LE5wOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGQpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuJGIoYi5lbmFibGVkKTt0aGlzLlg9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8CnRoaXMuV2J8fHRoaXMuR2F8fHRoaXMuYmQoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlg9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmliKHRoaXMuSWIpKSx0aGlzLkdiKCkpfX0sYmQ6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5DYX1lbHNlIGE9dGhpcy5DYTt0aGlzLmlzRW5hYmxlZD10aGlzLiRiKGEuZW5hYmxlZCk7dGhpcy5YPSF0aGlzLmlzRW5hYmxlZDt0aGlzLnphPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy56YS5sZW5ndGg7YisrKXRoaXMuemFbYl09dGhpcy56YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5XYj1hLmNvbmZpZ3x8IiI7dGhpcy5HYT1hLmFsaWFzfHxudWxsO3RoaXMuQ2c9YS5hZHBhdGh8fCIiO3RoaXMuZ2U9YS5kaXNhYmxlY29va2lldGVzdHx8CiExO3RoaXMudWg9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuemEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5XYiYmdGhpcy5HYSYmdGhpcy56YS5sZW5ndGg/dGhpcy56YyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5YPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5pYih0aGlzLkliKSksdGhpcy5HYigpKX0semM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWCl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5CZCgpKSxkPXRoaXMuamEodGhpcy5XYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLldiK3RoaXMuVGMoImN1c3RvbWVyIikpO3RoaXMuSWEoYiwKdGhpcy5PdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY3VzdG9tZXIiKTthP3RoaXMuTmw/dGhpcy5pYSgibm9TVk1Db25maWciKToodGhpcy5ObD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuemMoITApfS5iaW5kKHRoaXMpLCEwKX19LE90OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlgpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtpZighdGhpcy52YyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMudmM9ITA7dGhpcy56YyghMCk7cmV0dXJufX10aGlzLktkPXRoaXMuJGIoYi5zdHJpY3QpO3RoaXMubWY9dGhpcy4kYihiLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5pZz1iLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMucmM9dGhpcy4kYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuJGIoYi5lbmFibGVkKTsKdGhpcy5ZYj1iLnRlc3RoaWRlfHwiIjt0aGlzLkViPWIudGVzdGFkdGFnc3x8W107dGhpcy5aYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLm1jPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMucWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMubGM9Yi5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLlpkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlZnPWIuanNwb3B1cHN8fCExO3RoaXMuRGI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuS2M9Yi52cGFpZHx8ITE7dGhpcy5XYS52cGFpZD10aGlzLktjO3RoaXMueWg9Yi5za2lwYWxsb3dlZHx8ITE7dGhpcy5aYz1iLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuV2g9Yi52bWFwc3x8IiI7dGhpcy5ZYz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuTWE9Yi5iaXRyYXRlfHwxRTM7dGhpcy5GZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5YYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZgpBcnJheT90aGlzLkhwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5nZSYmKHRoaXMuWGI9bnVsbCk7dGhpcy5oZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnZjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy52Yz0hMCx0aGlzLnpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmd1KCkmJih0aGlzLllifHx0aGlzLlpifHx0aGlzLkVifHx0aGlzLlhiKT90aGlzLlRlPyh0aGlzLkhhPXRoaXMuWD0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuaWIodGhpcy5JYikpLHRoaXMuY2UoKSx0aGlzLkdiKCkpOnRoaXMuVXQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WdCgpKX19LFV0OmZ1bmN0aW9uKCl7dGhpcy5UdCgpO3RoaXMuV3QoKX0sV3Q6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrCmErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuZWEoMTApLGc9ZS5lYSgxMCksSD1lLmVhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLAoiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnJiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUucWMoKTsKaWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5oYigpKXtpZih0aGlzLldhJiZ0aGlzLldhLnBsYXllciYmdGhpcy5XYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sVnQ6ZnVuY3Rpb24oKXt0aGlzLlg9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmliKHRoaXMuSWIpKTt0aGlzLkdiKCl9LEljOmZ1bmN0aW9uKGEpe3RoaXMuTmM9ITA7dGhpcy5YfHwodGhpcy5YPXRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmliKGEpKSx0aGlzLkdiKCksdGhpcy5jZSgpKX0sVHQ6ZnVuY3Rpb24oKXtpZih0aGlzLlliKXt2YXIgYT1lLnFjKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5VZygpKXRoaXMuSWModGhpcy5kYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7CmVsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLlliKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuWWIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuSWModGhpcy5kYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuR2goKX19ZWxzZSB0aGlzLkdoKCl9LEZoOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGQ7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkJiKCkpOwp0aGlzLlp0KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5kZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuSWModGhpcy5kYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfXRoaXMuRWI9bnVsbCx0aGlzLmRmKCl9LFp0OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxHaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5CYigpKTt0aGlzLiR0KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5GaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuSWModGhpcy5kYywKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuWmImJnRoaXMuWmIubGVuZ3RoKXt2YXIgZD10aGlzLlpiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuRmgoKX0sJHQ6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixkKXtkPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9CmM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSxkZjpmdW5jdGlvbigpe3RoaXMuWGI/KHRoaXMuZ2YrKyx0aGlzLklhKG5ldyB6KHRoaXMuWGIpLHRoaXMuU3QuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZWYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5EaCgpfSxlZjpmdW5jdGlvbihhKXt0aGlzLkljKHRoaXMud2YsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxTdDpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5nZj90aGlzLmRmKCk6dGhpcy5lZigiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuRGgoKTp0aGlzLmVmKCJBQUEiKX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlg9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmliKHRoaXMuSWIpKTsKdGhpcy5HYigpO3RoaXMuY2UoKX0sVWc6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxHYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5oYigpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLk5jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS55YSgidC1vbmxpbmUuZGUiKXx8ZS55YSgiZ2lnYS5kZSIpfHxlLnlhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLlVnKCksITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5pYih0aGlzLnhmKSk7dGhpcy5MZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkxkJiZ0aGlzLkxkKCl9LGNvOmZ1bmN0aW9uKCl7aWYodGhpcy5tZiYmCnRoaXMuUHAoKSl7dmFyIGE9dGhpcy54cCgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sS2g6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsZCxmLGMsZyl7dGhpcy5yZHx8KHRoaXMucmQ9MCk7dGhpcy5yZCsrO3RoaXMucmQ+dGhpcy5EZyYmIXRoaXMuRWcmJih0aGlzLkVnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5EZywhMCkpO2E9bmV3IE5hKGEsYixkKTtmJiYoYS4kaD0hMCk7YyYmZS54cSgpJiYoYS5wZz0hMCk7ZyYmKGEuQ2g9ITApO3JldHVybiBhLmxvYWQoKX0sWWY6ZnVuY3Rpb24oKXtlLmhiKCl8fGUuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLnljKCl8fChhPXRoaXMuamEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT0KZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sUHQ6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuV2h9LGJvOmZ1bmN0aW9uKCl7dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy53YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLkJ1LmJpbmQodGhpcyksdGhpcy5BdS5iaW5kKHRoaXMpKX0sQnU6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLlZvKCl9LEF1OmZ1bmN0aW9uKCl7fSxWbzpmdW5jdGlvbigpe2Uuc2Moay5Vbyk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5pYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sY2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5EYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkRiLmxlbmd0aDthKyspe3ZhciBiPQp0aGlzLkRiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLlRhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgUjt3aW5kb3dbZC54YygpXT10aGlzO2UuVGEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sZ3U6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5oZn0sSHA6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LEJiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41PgpNYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sJGI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0scmI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGUsZyxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGY9YS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGc9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGYpP2c9az02NDppc05hTihjKSYmKGs9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sYz0xNDtjLS07KWRbYltjXV09YVtjXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZywKZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LHhoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGQ9IiIsYyxoO2ZvcihjPTc7MDw9YztjLS0paD1hPj4+NCpjJjE1LGQrPWgudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxwLHIsdSx4LHY7cD1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoYz0wO2M8cC0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx3LnB1c2goZSk7c3dpdGNoKHAlNCl7Y2FzZSAwOmM9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Yz1hLmNoYXJDb2RlQXQocC0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Yz0KYS5jaGFyQ29kZUF0KHAtMik8PDI0fGEuY2hhckNvZGVBdChwLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQocC0zKTw8MjR8YS5jaGFyQ29kZUF0KHAtMik8PDE2fGEuY2hhckNvZGVBdChwLTEpPDw4fDEyOH1mb3Iody5wdXNoKGMpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChwPj4+MjkpO3cucHVzaChwPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXdbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztwPWw7cj1tO3U9cTt4PXQ7Zm9yKGM9MDsxOT49YztjKyspdj1kKGUsNSkrKHAmcnx+cCZ1KSt4K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHg9dSx1PXIscj1kKHAsMzApLHA9ZSxlPXY7Zm9yKGM9MjA7Mzk+PWM7YysrKXY9ZChlLDUpKyhwXnJedSkreCtnW2NdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSwKeD11LHU9cixyPWQocCwzMCkscD1lLGU9djtmb3IoYz00MDs1OT49YztjKyspdj1kKGUsNSkrKHAmcnxwJnV8ciZ1KSt4K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHg9dSx1PXIscj1kKHAsMzApLHA9ZSxlPXY7Zm9yKGM9NjA7Nzk+PWM7YysrKXY9ZChlLDUpKyhwXnJedSkreCtnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx4PXUsdT1yLHI9ZChwLDMwKSxwPWUsZT12O2s9aytlJjQyOTQ5NjcyOTU7bD1sK3AmNDI5NDk2NzI5NTttPW0rciY0Mjk0OTY3Mjk1O3E9cSt1JjQyOTQ5NjcyOTU7dD10K3gmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5ua3x8T2EsbD1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5SbD1iO2IucHJvdG90eXBlPQp7R286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5SbHx8UGEsdmM9bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuR28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsZCl7dGhpcy5iPWE7YS5mLk8/dGhpcy5VYT1hLmYuTygpOnRoaXMuVWE9IiI7YS5mLktnJiZhLmYuS2coe3BhdXNlOnRoaXMueGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5zaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5JZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLnZ1LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuYWI7dGhpcy5wbGF5ZXI9dGhpcy5iLmY7dGhpcy5OYj10aGlzLlhjPSExO3RoaXMuT249MUUzO3RoaXMuZGE9Cm51bGw7dGhpcy5MPWI7dGhpcy52YT17fTt0aGlzLnZpZGVvPXt9O3RoaXMuSGQ9e307ZS5nYigibmV3QmlnQWRJZCIpO3RoaXMuVG49ZS5lYSgxMCk7dGhpcy5hZj0wO3RoaXMuVmM9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5WYz1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmIuZikmJnRoaXMuYi5mLnUmJihhPXRoaXMuYi5mLnUoKSksdGhpcy5WYz1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5nbj1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmZoPXRoaXMuR2Q9ITE7dGhpcy5ZZz1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5jPXt9O3RoaXMuU2M9ITE7dGhpcy5OaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlNiPQohMTt0aGlzLnBvPWUuZWEoMTApO3RoaXMuQWI9ZS5lYSgxMCk7dGhpcy55Yj1lLmVhKDEwKTt0aGlzLnpoPWUuZWEoMTApO3RoaXMuY29uZj17fTt0aGlzLnBjPXRoaXMuemI9ITE7dGhpcy5qZT1udWxsO3RoaXMuT2Q9dGhpcy5IYj10aGlzLnVlPXRoaXMuUGU9dGhpcy5mZT10aGlzLmdkPXRoaXMuY2Y9dGhpcy5rYj10aGlzLmNjPXRoaXMuaGg9dGhpcy50Yz10aGlzLmp1PXRoaXMub2I9ITE7dGhpcy5oYz1bXTt0aGlzLmFjPXt9O3RoaXMuamY9ITE7dGhpcy5VYj17fTt0aGlzLnJzPTIwMDt0aGlzLnNmPXRoaXMuWmg9dGhpcy4kZD10aGlzLlNlPSExfWMuaGs9YjtiLnByb3RvdHlwZT17ZnQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5VYV0mJnRoaXMuY29uZlt0aGlzLlVhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuVWFdW2FdKTtyZXR1cm4gYn0sTGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuUGEmJgplLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLkwuTmM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS52KGsuWm0sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sRGU6ZnVuY3Rpb24oYSxiLGQsYyl7dGhpcy5vYj1kO3ZhciBuPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihuPSEwKTtpZih0aGlzLkwuWCl0aGlzLmFmKyssZS5nYigibmV3U21hbGxBZElkIiksdGhpcy5MLmNvKCksYz1sLmdldENvbmZpZygpLHRoaXMuTC5IYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy5MaCgpLG5ldyBUKHRoaXMsYSx0aGlzLllnLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLGJpdHJhdGU6Yy5NYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuTC5LYyxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpuLApjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy5MaCgpLG5ldyBUKHRoaXMsYSx0aGlzLllnLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLktjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5NYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOm4sY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuTmEoKTtlbHNle3ZhciBnPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2cuRGUoYSxiLGQpfSw1MCl9fSxOZTpmdW5jdGlvbihhKXsic3BpZWdlbC5kZSIhPWUuUWIoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fHRoaXMuZmh8fCJzdm1wcmV2aWV3IiE9ZS5qYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3I/KHRoaXMuT2Q9CnRoaXMuSGI9dGhpcy50Yz0hMSx0aGlzLmM9YSx0aGlzLnN0KHRoaXMuYyksdGhpcy56ZyhhKSx0aGlzLmhjPXRoaXMucmcoYSksdGhpcy5hYz17fSx0aGlzLmpmPSExLHRoaXMuaW8oKSk6dGhpcy5mZCgpfSx6ZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5IZD10aGlzLktwKGEpKSx0aGlzLnpnKGEucGFyZW50KSl9LHJnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5yZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLnNwKGEpKSk7cmV0dXJuIGN9LHNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBjPQowO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpkfX0sS3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sZD1bXSxjPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxjLmxlbmd0aDtrKyspY1trXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWNba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksY1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWQucHVzaChhLmJiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6Z319LG1hOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZD0ic3RhdHNfaGRfYWRfZXJyb3IiO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5rZCYmYS5rZC5lcnJvciYmYS5rZC5lcnJvci5jb2RlJiYoYj1hLmtkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuTGMuY29kZTpiPT1GLlFkLmNvZGU/ZS52KGsuVnUsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTooZS5FZSgpLGI9PUYuQWYuY29kZSYmZS52KGsudHIsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS52KGsuVG8sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTtkPSJzdGF0c19oZF9hZF9lbXB0eSI7CmJyZWFrO2Nhc2Ugdy55Zi5jb2RlOmUudihrLkN1LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3JfdmFzdGxvYWRmYWlsZWQiO2JyZWFrO2Nhc2Ugdy5CZi5jb2RlOmUudHJhY2soIndyYXBwZXJsaW1pdCIsIjEwNiIpO2UudihrLld1LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7ZD0ic3RhdHNfaGRfYWRfZXJyb3Jfd3JhcHBlcmxpbWl0IjticmVhaztjYXNlIHcuUmQuY29kZTplLnYoay5hdix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO2Q9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuUGQuY29kZTplLnYoay51cix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxkPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLnBjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwKIjEwNSIpLGQ9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09ZCYmYS5lcnJvciYmYS5lcnJvci51YSYmKGQrPSJfIithLmVycm9yLnVhKTtlLnRyYWNrKGQsIiIsITApO3RoaXMuT2IoYSk7dGhpcy5OYSgpfSxPYjpmdW5jdGlvbihhKXt2YXIgYj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYj1hLmVycm9yLmNvZGUsOTAxPGImJihiPTkwMCkpO2ZvcihiPXsiW0VSUk9SQ09ERV0iOmJ9O2EuTGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5MYS5wb3AoKTt0aGlzLkNlKGQudXJsLGQudHlwZSxiKX1jYXRjaChjKXt9fSxzdDpmdW5jdGlvbihhKXt0aGlzLmZlPXRoaXMudWU9dGhpcy5QZT0hMTt0aGlzLnZhPXRoaXMuYi5HO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnZhLnpJbmRleD1iO2I9dGhpcy5iLkY7dHJ5e3ZhciBkPXRoaXMuYi5mLmdldFJhd1BsYXllcigpO2lmKGQmJgpkLmVudnZhcnMpdHJ5e2I9ZC5lbnZ2YXJzKCkudmlkZW9TbG90LHRoaXMuU2U9ITB9Y2F0Y2goYyl7fX1jYXRjaChlKXt9Yi5Odj0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGcgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoZykmJmIuc2V0QXR0cmlidXRlKGcsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bZ10pO3RoaXMuZ24mJnRoaXMucGxheWVyLmxlKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5sZSgpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTsKZm9yKGQ9MDtkPGEuTS5sZW5ndGg7ZCsrKWIuY2FuUGxheVR5cGUoYS5NW2RdLnR5cGUpJiZ0aGlzLmJuKGIsYS5NW2RdLnVybCsiIixhLk1bZF0udHlwZSk7dGhpcy5TZSYmYi5sb2FkKCk7aWYodGhpcy5IaChiKSl7dGhpcy5lbihiKTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLmRhPXRoaXMudmEuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMuU2U/dGhpcy52aWRlbz1iOnRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKX1jYXRjaChrKXt0aGlzLnZpZGVvPWJ9fWVsc2UgdGhpcy5jLmxvKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLmRhPXRoaXMudmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpLHRoaXMucXQoKSk6dGhpcy55ZSgpP3RoaXMud2goKTp0aGlzLmMub3JpZ2luLmpnKHcuUGQpfSxxdDpmdW5jdGlvbigpe3RoaXMua2I9dGhpcy5jYz0hMTt0aGlzLmIuZi5zYSYmdGhpcy5iLmYuc2EoKSYmKGUudihrLmNnLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5rYj0hMCk7ZS5lZSgpO3RoaXMuYyYmdGhpcy5jLm9yaWdpbiYmdGhpcy5jLm9yaWdpbi50ZiYmZS5mbih0aGlzLmMub3JpZ2luLnRmKTtlLllhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi5paCgpO3RoaXMuYi5HYygpO2ZvcihhPQp0aGlzLmIuRzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5iLkdjKCk7dGhpcy5kYT10aGlzLnZhPXRoaXMuYi5HO3RoaXMub2YoInZwYWlkIik7aWYodGhpcy5rYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnliKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTtlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKTtlLnYoay52ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfXRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7CnRoaXMuSC5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuRy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi5zYSYmdGhpcy5iLmYuc2EoKSYmKGE9ITApO3ZhciBiPXRoaXMuYy5NcCgpLGM9dGhpcy5jLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5HLnN0eWxlLmhlaWdodCl9fSwKY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2Uua2EodGhpcy5ILCJjb25maWciLGcpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5rYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uua2EodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmthKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5rYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uua2EodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmthKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uua2EodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uua2EodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmthKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5UZigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuTCk7dGhpcy5ILnNyYz1hO2UuWGQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpeyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPVsiZGF0YSJdLm5hbWUmJnRoaXMuYi5SYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy5oYz1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLkp1KGEpO2lmKCJBZEltcHJlc3Npb24iPT0KYS5kYXRhLm5hbWUmJih0aGlzLkt1KCksdGhpcy5iLlJiKCEwKSwhdGhpcy5IYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5IYj17ZWw6dGhpcy5ILGNiOmZ1bmN0aW9uKCl7dGhpcy5PZD0hMDtlLnYoay5WaCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS54ZSh0aGlzLkhiKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuUmIoITApLHRoaXMuT3UoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuYi5SYighMCksdGhpcy5TdSgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5RdSgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SdSgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlR1KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB1KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhoKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBnPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7Z3x8KGc9dGhpcy5jLk1iKTtpZighZylyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudihrLmJnLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dHJ5e3RoaXMuTC5ZYyYmKGE9Il9ibGFuayIpO3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpOwpiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWd9Y2F0Y2goYyl7d2luZG93Lm9wZW4oZyxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuTnUoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUudihrLldkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuTHUoKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLlpoJiYodGhpcy5zZj0hMSx0aGlzLkZjKCkpLHRoaXMuTXUoKSk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMueWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5rYj0hMCxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsCiEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSxlLnYoay52ZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKToodGhpcy5rYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsubGYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlhkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcykpO2UuWGQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIuUmYoZnVuY3Rpb24oYSl7ZS5rYSh0aGlzLkgsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxMdTpmdW5jdGlvbigpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UudihrLlVkLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLmNjPSEwfSxNdTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudihrLlJjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5jYz0hMX0sT3U6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLnYoay5OZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSxOdTpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5NZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpfSwKS3U6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5ZYSgiaW1wcmVzc2lvbiIpO2UudihrLklmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFN1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLllhKCJzdGFydCIpO2UudihrLlJjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFF1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMudGM9ITA7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudihrLkdmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFJ1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudihrLktmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFR1OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTsKZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKX0sUHU6ZnVuY3Rpb24oKXt0aGlzLk1kKCk7ZS5ZYSgiY29tcGxldGUiKX0sWGg6ZnVuY3Rpb24oYSl7aWYodGhpcy5IJiZ0aGlzLkgucGFyZW50Tm9kZSYmdGhpcy5ILnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5ILnBhcmVudE5vZGU7dGhpcy5ILnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5IKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7ZS5lZSgpO3RoaXMuSD0hMTt0aGlzLk5hKGEpfX0sSnU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5tZXNzYWdlfHwiIixjPS9cZCsvZyxmPVtdOyFiJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihiPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZywoZj1iLm1hdGNoKGMpKT9mLmpvaW4mJihiPWYuam9pbigiLSIpKTpiPWIuc3Vic3RyaW5nKDAsMjApKTsKZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixiLCEwKTtlLllhKCJlcnIiLGIpO2UudihrLlV1LHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5YaCghMCl9LGJuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuSGEmJmIuaXNFbmFibGVkJiYhYi55YygpKXt2YXIgZD1iLmphKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsdGhpcy5MKTtmLm9uZXJyb3I9dGhpcy5HdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZil9ZWxzZSBhLnNldEF0dHJpYnV0ZSgic3JjIixjKGIsdGhpcy5MKSl9LEhoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxlbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuVWguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5NZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLk5kLmJpbmQodGhpcykpfSxDZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5VaC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5xZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLk1kLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuTmQuYmluZCh0aGlzKSl9LApVaDpmdW5jdGlvbihhKXt0aGlzLk5ifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmJ8fHRoaXMucGYoYSl9LmJpbmQodGhpcyksdGhpcy5PbikpfSxwZjpmdW5jdGlvbihhKXtpZighdGhpcy5YYyYmdGhpcy5IaCh0aGlzLnZpZGVvKSYmIXRoaXMuemImJiF0aGlzLk5iKXt0aGlzLlhjPSEwO3RyeXtpZighZS5oYigpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy56Ynx8KHRoaXMuemI9ITAsdGhpcy5DZCh0aGlzLnZpZGVvKSxlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW8iLCIiLCEwKSx0aGlzLkwuaWd8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLk5hKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsIiIsITApfXRoaXMuRnUoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPQohMTt0aGlzLmIuR2MoKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuVWYoKTt0aGlzLmIuaWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuYmYoKX19LGJmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZ2QpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5QYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5xZD1bXTtmb3IodmFyIGI9dGhpcy5iLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMucWQucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKYy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5RYygpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5RYygpfWVsc2UgdGhpcy5RYygpfSxRYzpmdW5jdGlvbihhKXtpZih0aGlzLnFkKWZvcih2YXIgYj0wO2I8dGhpcy5xZC5sZW5ndGg7YisrKXRoaXMucWRbYl0uc3R5bGUuZGlzcGxheT0KImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLmdkfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5OYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIixiLCEwKSk6KHRoaXMuSWUoITApLHRoaXMuUWMoITApKSl9LmJpbmQodGhpcykpO2IudGhlbihmdW5jdGlvbigpe3RoaXMudWUmJmUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlUmVzb2x2ZWRBZnRlckltcHJlc3Npb24iLCIiLCEwKTt0aGlzLlBlPSEwfS5iaW5kKHRoaXMpKTtkYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuVmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5WYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5WYi5iaW5kKHRoaXMpKSk6Cko9ZnVuY3Rpb24oKXt0aGlzLlNjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0uYmluZCh0aGlzKTt0aGlzLm5lKCkudmgodGhpcyl9LE1kOmZ1bmN0aW9uKCl7dGhpcy5MLnJjJiYhdGhpcy56YiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuWG0sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLk5hKCl9LE5hOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmZlKWlmKHRoaXMuZmU9ITAsdGhpcy5PZHx8KGUudihrLkFyLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLm5ifHx0aGlzLmMuZmMpe2UuZ2IoIm5ld1NtYWxsQWRJZCIpO3RoaXMuYWYrKzt0aGlzLk5iPXRoaXMuWGM9ITE7dHJ5e3RoaXMuQ2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy52YS5yZW1vdmVDaGlsZCh0aGlzLmRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5HZD0hMTt0cnl7dGhpcy5iLlBoKCl9Y2F0Y2goZyl7fXRoaXMuY2Y9ITA7dGhpcy5iLnJlKCk7dGhpcy5TYj0hMTt0aGlzLm5lKCkucmgoKTt0aGlzLmMubmImJnRoaXMuYy5vcmlnaW4uSmUoKTt0aGlzLmMuZmMmJihhP3RoaXMuYy5vcmlnaW4uYmgoKTp0aGlzLmZkKCkpfWVsc2UgdGhpcy5mZCgpfSxHdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkNkKHRoaXMudmlkZW8pLHRoaXMueWUoKT90aGlzLndoKCk6dGhpcy5OZChhKSl9LE5kOmZ1bmN0aW9uKGEpe3RoaXMuTmI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmCih0aGlzLnllKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBjfHx0aGlzLkwuWWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuTC5ZZigpKTt0aGlzLmMub3JpZ2luLmpnKHcuUGQpfSxxZjpmdW5jdGlvbigpe2lmKHRoaXMuanUpdGhpcy5OYSgpO2Vsc2V7dGhpcy5TYj0hMDt0aGlzLmIuZi5SYSYmIXRoaXMuY2YmJnRoaXMuYi5mLlJhKCkmJmUudihrLmRkLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLm91KGEpO2lmKCF0aGlzLkhiKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpOwp0aGlzLkhiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5PZD0hMDtlLnYoay5WaCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS54ZSh0aGlzLkhiKX1jPSIiO3RoaXMuYy4kZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy56aCkpJiYoYz10aGlzLmMuJGUtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuR2R8fCh0aGlzLkdkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLk1mLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5jLm5iPyh0aGlzLk5iPXRoaXMuWGM9ITEsCnRoaXMuQ2QodGhpcy52aWRlbyksdGhpcy5kYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnZhLnJlbW92ZUNoaWxkKHRoaXMuZGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5HZD0hMSx0aGlzLmIuUGgoKSx0aGlzLmMub3JpZ2luLkplKCkpOnRoaXMuTmEoKX0uYmluZCh0aGlzKSkpKSxiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuVmMucmVwbGFjZSgiW3RpbWVdIixlLnFnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuU2M9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHdoOmZ1bmN0aW9uKCl7dGhpcy5wYz0hMDt0aGlzLnZhPXRoaXMuYi5HO3RoaXMudmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnZhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLAoiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5GcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nOwp0aGlzLmIuRj1hO3ZhciBiPXRoaXMuYi5GLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuZGE9dGhpcy52YS5hcHBlbmRDaGlsZChjKTt0aGlzLmIuR2MoKTt0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnZhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy52YS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuVGguYmluZCh0aGlzKTt0aGlzLmRhLmFwcGVuZENoaWxkKGIpO3RoaXMuU2goKTt0aGlzLm9mKCk7dGhpcy5qZT1zZXRJbnRlcnZhbCh0aGlzLmFvLmJpbmQodGhpcyksCjEwMCk7cmV0dXJuIGF9LEZwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5jLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmMuTVtjXSxlO2U9Yi51cmw7dmFyIGc9dGhpcy5MO2cuSGEmJmcuaXNFbmFibGVkJiYhZy55YygpJiYoZT1nLmphKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sYW86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMuYy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLmplKSx0aGlzLk1kKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucWYoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuamUpLAp0aGlzLk5kKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sTWg6ZnVuY3Rpb24oKXt0aGlzLmhofHwodGhpcy5oaD0hMCx0aGlzLnRjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sb3U6ZnVuY3Rpb24oYSl7ZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKTthPT10aGlzLk5ofHx0aGlzLnpifHwoMD09YSYmKHRoaXMub2ImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMub2IpLHRoaXMub2I9ITEpLHRoaXMuUGV8fChlLnRyYWNrKCJzdGF0c19oZF9pbXByZXNzaW9uV2l0aE91dFJlc29sdmVkUHJvbWlzZSIsIiIsITApLHRoaXMudWU9ITApLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuTWgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsCmZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpKSx0aGlzLnBjJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy56Ynx8ZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGUuaGIoKSYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUudihrLklmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSksZS52KGsuTmYsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnBjJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwucmMmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLnRjPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksCmUudihrLkdmLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLnJjJiZlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5LZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLnJjJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSksdGhpcy5OaD1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy56Yil7dHJ5e2lmKHRoaXMuYWNbYV09KG5ldyBEYXRlKS5nZXRUaW1lKCksdGhpcy5hYy5pbXByZXNzaW9uJiZ0aGlzLmFjLmNvbXBsZXRlJiYhdGhpcy5qZil7dGhpcy5qZj0KITA7dmFyIGM9dGhpcy5hYy5jb21wbGV0ZS10aGlzLmFjLmltcHJlc3Npb24sZj0ic3RhdHNfaGRfdGltZWRpZmYiO3RoaXMuSCYmKGYrPSJ2cGFpZCIpOzVFMz5jJiYoMTA+YyYmKGM9MTApLDA+YyYmKGM9Im5lZ2F0aXZlIiksZS50cmFjayhmLGMsITApKX19Y2F0Y2goZyl7fWlmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1jPVtdO3RyeXtjPXRoaXMuTHAodGhpcy5jLkxhLGEpfWNhdGNoKGwpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBtPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy4kZD0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkhkLmltcHJlc3Npb25zJiZlLnZxKG0udXJsLHRoaXMuSGQuaW1wcmVzc2lvbnMpP3RoaXMuQ2UobS51cmwsbS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwplLnYoay5ZbSx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCkse2FkSWQ6dGhpcy5IZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5DKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuQ2UobS51cmwsbS50eXBlKX1jYXRjaChxKXt9aWYoIWIpdHJ5e3RoaXMuYy5MYT10aGlzLnZvKHRoaXMuYy5MYSxhKX1jYXRjaChyKXt9fX0sQ2U6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwud2EoYSksYyYmYi5hbihjKSxmfHwoZj10aGlzLmhnKSxlfHwoZT10aGlzLmhnKSx0aGlzLmNuKGEpLHRoaXMuTC5JYShiLGZ1bmN0aW9uKCl7dGhpcy5xaChhKTtmKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxjbjpmdW5jdGlvbihhKXt0aGlzLlViW2FdPSJvcGVuIn0scWg6ZnVuY3Rpb24oYSl7dGhpcy5VYlthXT0iY2xvc2VkIn0saW86ZnVuY3Rpb24oKXt0aGlzLlViPQp7fX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5VYil0aGlzLlViLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuVWJbYl0mJmErKztyZXR1cm4gYX0sTHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2bzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxGdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMuVGguYmluZCh0aGlzKSl9LFRoOmZ1bmN0aW9uKCl7dGhpcy5jLk1iJiYoZS52KGsuYmcsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksIXRoaXMudGMmJmUuaGIoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLAplLnRwKCksITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RoaXMuTC5ZYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5NYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuTWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxTaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5WYy5yZXBsYWNlKCJbdGltZV0iLGUucWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5aYyYmKGI9dGhpcy5MLlpjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnViLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmRhLmFwcGVuZENoaWxkKGEpfX0sdWI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5aYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sCkVkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkwuWmMpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxvZjpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMucG87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMuRmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy52YigpO3RoaXMudWIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuQWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5KaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLkloLmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuSWguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRmMoKTt0aGlzLkVkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy52YigpO3RoaXMudWIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLnliO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMubHUuYmluZCh0aGlzKSk6Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5rdS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudmIoKTt0aGlzLnViKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLnpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLiRlJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLmRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkZjKCk7dGhpcy5FZCgpfS5iaW5kKHRoaXMpKTt0aGlzLmRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMudmIoKTt0aGlzLnViKCl9LmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5kYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT8KYi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGIuc3R5bGUud2lkdGg9IjEwMCUiLGIuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGIuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGIuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGIuc3R5bGUuYm90dG9tPSIwcHgiLGIuc3R5bGUuekluZGV4PSIxMDAwMCIsYi5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMudGEmJih0aGlzLnRhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnRhPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLlJmKGZ1bmN0aW9uKGEpe3RoaXMudGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5mLnNhJiZ0aGlzLmIuZi5zYSgpJiYoZS52KGsuY2csdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkllKCkpO3RoaXMudmIoKX19LHZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sRmM6ZnVuY3Rpb24oKXt0aGlzLnRhJiYiYmxvY2siPT10aGlzLnRhLnN0eWxlLmRpc3BsYXl8fHRoaXMuc2Z8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEloOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudGEmJih0aGlzLnRhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5VZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudGEmJih0aGlzLnRhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnZiKCksdGhpcy51YigpKSl9LEpoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5BYik7dGhpcy5jYz8oZS5rYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy50YSYmKHRoaXMudGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMuY2M9ITEpOihlLmthKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMudGEmJih0aGlzLnRhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLnZiKCksdGhpcy51YigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMuY2M9ITApfSx4ZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQWIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLnYoay5VZCx0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sc2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkFiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudihrLlJjLHRoaXMuYy5BLHRoaXMuYi5mLnUoKSx0aGlzLkIoKSwKdGhpcy5DKCkpKX0sa3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnliKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLnYoay5sZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS52KGsudmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy55Yik7dGhpcy5rYj8oZS5rYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSwKdGhpcy5rYj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5rYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy5rYj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxJZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMueWIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS52KGsudmQsdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSl9LHZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy55Yik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLnYoay5sZix0aGlzLmMuQSx0aGlzLmIuZi51KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sVmI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5WYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5WYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuVmIpO3RoaXMuZ2R8fHRoaXMuU2N8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmJmKCkpfSxmZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUuamEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7ZS5xYygpO2lmKGF8fCF0aGlzLiRkJiYKYi5hZEZhbGxiYWNrVVJMKXRoaXMuZmg9dGhpcy5aaD10aGlzLnNmPSEwLGUudHJhY2soInN0YXRzX3d0X3N0YXJ0IiwiIiwhMCksdGhpcy4kZD0hMCxhPWUuVGYoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuRGUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtlbHNlIGlmKHRoaXMuZ2Q9ITAsdGhpcy5vYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5vYiksdGhpcy5vYj0hMSksKCJwcmVyb2xsIj09ZS5QYSYmdGhpcy5TY3x8InBvc3Ryb2xsIj09ZS5QYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpaWYoYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsLCJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuUGEpKSwic3RyaW5nIj09dHlwZW9mIGEmJmEpe2ZvcihiPXRoaXMuYi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmIuR2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKYy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuaGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5oZCgpO2Vsc2UgdGhpcy5oZCgpfSwKaGQ6ZnVuY3Rpb24oYSl7dGhpcy5HdCgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGQoITApfS5iaW5kKHRoaXMpLHRoaXMucnMpOih0aGlzLmNmPSEwLHRoaXMuYi5yZSgpLHRoaXMuYi5ZcygpLHRoaXMuU2I9ITEsZS52KGsub28sdGhpcy5jLkEsdGhpcy5iLmYudSgpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLm5lKCkucmgoKSl9LG5lOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5mJiYoYT10aGlzLmIuZik7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJgooYT0hMCl9cmV0dXJuIGF9LFVmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5FYSgibWluVmlzIik7YSYmKGUud2UodGhpcy52aWRlbyxhKT90aGlzLnNoKCk6dGhpcy54ZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxCOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5jJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5jLk1iLGEuZHVyYXRpb249dGhpcy5jLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5jLm5iLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuaGMmJjA8dGhpcy5oYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuaGMpKTt0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuVG4rCiItIit0aGlzLmFmO3RoaXMuYyYmdGhpcy5jLnZnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPXRoaXMuYy52ZygpKTtyZXR1cm4gYX0saGc6ZnVuY3Rpb24oKXt9fX0pKHRoaXMpO3ZhciBRYT1jLmhrfHxRYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5McT10aGlzLmFbNl07dGhpcy5Gbz10aGlzLmFbOV07dGhpcy5XcD10aGlzLmFbM107dGhpcy5DbD10aGlzLmFbNV07dGhpcy5Mbj10aGlzLmFbNl07dGhpcy5Gbj10aGlzLmFbNl07dGhpcy5ZdT10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs5XX1jLlpyPWI7Yi5wcm90b3R5cGU9e0txOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5McTp0aGlzLkVvKGEpfSxFbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRm86dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLldwOnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkNsOnRoaXMuS24oYSl9LEtuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG46dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkZuOnRoaXMuWHUoYSl9LFh1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIFJhPWMuWnJ8fFJhLHdjPW5ldyBSYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLktxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtoPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuQmE9bnVsbDt0aGlzLlc9W107dGhpcy5VPW51bGw7dGhpcy5nYz10aGlzLmljPSExO3RoaXMudGY9IiI7dGhpcy5yZj0hMTtkJiZkLmVtcHR5P3RoaXMuZHIoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MucG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUucWMoKSxiO2I9ZS5qYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC53YShsLklkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuaGIoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuZWcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPApkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuSWQoYSkpKyImdHlwZT1qcyIsYj1sLndhKGwuSWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwud2EobC5JZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPQoidHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5jci5iaW5kKHRoaXMpLHRoaXMuJHEuYmluZCh0aGlzKSl9LHNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkJhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5QYSl0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrCmEudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuUGF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLlBhfHx0aGlzLnpxKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxsLlB0KCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTsKMD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09aC5maXJzdENoaWxkO2MucHVzaChoKX1jYXRjaChnKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/Ci0xOjE6MH0pfSx6cTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sY3I6ZnVuY3Rpb24oYSl7dGhpcy5NcyhhKTt0cnl7dGhpcy5CYT1hLnJlc3BvbnNlWE1MLHRoaXMuQmF8fCh0aGlzLkJhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5tYSh0aGlzLk9hKHcuUmQpKX10aGlzLlc9dGhpcy5zZygpO3RoaXMuaWM9dGhpcy5mZigpO3RoaXMuZ2M9dGhpcy5FaCgpO3RoaXMuVy5sZW5ndGg/dGhpcy5CYygpOnRoaXMubWEodGhpcy5PYSh3LkxjLHtlcnJvcjp0aGlzLnJmP0YuUWQ6Ri56Zn0pKX0sZHI6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuQmF8fCh0aGlzLkJhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMubWEodGhpcy5PYSh3LlJkKSl9dGhpcy5XPXRoaXMuc2coKTt0aGlzLmljPXRoaXMuZmYoKTt0aGlzLmdjPXRoaXMuRWgoKTt0aGlzLlcubGVuZ3RoP3RoaXMuQmMoKTp0aGlzLm1hKHRoaXMuT2Eody5MYyx7ZXJyb3I6dGhpcy5yZj9GLlFkOkYuemZ9KSl9LCRxOmZ1bmN0aW9uKCl7dGhpcy5tYSh0aGlzLk9hKHcueWYse2RlcHRoOmF9KSl9LEJjOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVy5zaGlmdCgpOwp0aGlzLkJxKCk/dGhpcy5hdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkFnKCksaCx7QWRTeXN0ZW06dGhpcy5ycCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLm1hKHRoaXMuT2Eody5CZikpOihhPTAsdGhpcy55dSgpJiZ0aGlzLk5lKHRoaXMuc28oKSkpfSxKZTpmdW5jdGlvbigpe3RoaXMuaWM/KHRoaXMuaWM9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuQmMoKSk6dGhpcy5wYXJlbnQuSmUoKX0sYmg6ZnVuY3Rpb24oKXt0aGlzLmdjPyh0aGlzLmdjPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLkJjKCkpOnRoaXMucGFyZW50LmJoKCl9LHl1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXQoKT90aGlzLlh0KCk/ITA6KC0xIT10aGlzLnVjKCk/dGhpcy5tYSh0aGlzLk9hKHcudWYpKTp0aGlzLm1hKHRoaXMuT2Eody5raikpLCExKToodGhpcy5tYSh0aGlzLk9hKHcuTGMsRi5BZikpLCExKX0sTmU6ZnVuY3Rpb24oYSl7YS5MYT0KYS5MYS5jb25jYXQodGhpcy5GZSgpKTthLm5iPWEubmI/YS5uYjp0aGlzLmljO2EuZmM9YS5mYz9hLmZjOnRoaXMuZ2M7dGhpcy5wYXJlbnQuTmUoYSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO2EuZHVyYXRpb249dGhpcy51YygpO2EuTT10aGlzLnhnKCk7YS5NYj10aGlzLnVwKCk7YS5vcmlnaW49dGhpczthLkE9dGhpcy5xcCgpO2EuJGU9dGhpcy5KcChhLmR1cmF0aW9uKTtyZXR1cm4gYX0sbWE6ZnVuY3Rpb24oYil7dGhpcy5VJiYoYi5MYT1iLmVycm9yLmNvZGUhPXcudWYuY29kZT9iLkxhLmNvbmNhdCh0aGlzLnZwKCkpOmIuTGEuY29uY2F0KHRoaXMuRHAoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5PYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lk9iJiZ0aGlzLnBhcmVudC5PYihiKSxhPTAsdGhpcy5CYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50Lm1hJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQubWEmJgp0aGlzLnBhcmVudC5tYShiKSxhPTApfSxPYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5PYihhKX0samc6ZnVuY3Rpb24oYSxiKXt0aGlzLm1hKHRoaXMuT2EoYSxiKSl9LE9hOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sYXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxZdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGcoKS5sZW5ndGh9LFh0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy51YygpfSxmZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LEVoOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5XJiYyPD10aGlzLlcubGVuZ3RoJiYhdGhpcy5mZigpJiYoYT0hMCk7cmV0dXJuIGF9LE1zOmZ1bmN0aW9uKGEpe3RyeXtkLnB1c2godGhpcy50Zj0KYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLnJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5BZygpLmxlbmd0aH0sQWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZSh0aGlzLlUsIlZBU1RBZFRhZ1VSSSIpfSxycDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lKHRoaXMuVSwiQWRTeXN0ZW0iKX0sRmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYKIXRoaXMuTmcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuYmIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxOZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLk5nKGEucGFyZW50Tm9kZSk6ITF9LERwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHZwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx1cDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSx4ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxNYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksdHY6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuYmIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuTWF8fDFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk1hKS1NYXRoLmFicyhkLWIuTWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuTWEpLU1hdGguYWJzKGQtCmIuTWEpfSksYj1oLmNvbmNhdChlKX1jYXRjaChnKXt9cmV0dXJuIGJ9LHFwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGg9IiIsZT1bXSxnPSIiLGc9MDtnPGEubGVuZ3RoO2crKyl7aD1iPXRoaXMub2QoYVtnXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHVjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuYmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rCjYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sSnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5FdChkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGgpe2I9ITF9cmV0dXJuIGJ9LG1lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5iYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGJiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMub2QoYSk6IiJ9LG9kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGUoYSk7YiYmKGI9Yi50cmltKCkpOwohYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFQ9Yy5wbXx8VDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VaT10aGlzLmFbNF07dGhpcy5TbT10aGlzLmFbMTBdO3RoaXMueG49dGhpcy5hWzJdO3RoaXMuT2k9dGhpcy5hWzhdO3RoaXMuYnQ9dGhpcy5hWzFdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuaW09dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOF19Yy54dD1iO2IucHJvdG90eXBlPXtUaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVWk6dGhpcy5SbShhKX0sUm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TbTp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueG46dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9pOnRoaXMuYXQoYSl9LAphdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnQ6dGhpcy5EaihhKX0sRGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkVqOnRoaXMuaG0oYSl9LGhtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pbTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFVhPWMueHR8fFVhLHhjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXhjLlRpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuTGE9W107dGhpcy5NPVtdO3RoaXMuTWI9IiI7dGhpcy5BPXRoaXMuZmM9dGhpcy5uYj0hMTt0aGlzLnNlPXRoaXMub3JpZ2luPW51bGw7dGhpcy50ZT0iIn1jLndsPWI7Yi5wcm90b3R5cGU9e2xvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PQp0aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LEJwOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2UmJnRoaXMub3JpZ2luJiZ0aGlzLm9yaWdpbi5CYSl7dmFyIGE9CnRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJjA8PWIuaW5kZXhPZigiSE9NQUQiKSYmKHRoaXMuc2U9YVtjXSl9cmV0dXJuIHRoaXMuc2V9LHZnOmZ1bmN0aW9uKCl7aWYodGhpcy50ZSlyZXR1cm4gdGhpcy50ZTt2YXIgYT0iIjsoYT10aGlzLkJwKCkpJiZhLmdldEF0dHJpYnV0ZT8oYT1hLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy50ZT1hfSxNcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIFNhPWMud2x8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5Waz10aGlzLmFbMTBdO3RoaXMucXI9dGhpcy5hWzRdO3RoaXMuV3I9dGhpcy5hWzldO3RoaXMuZ3E9dGhpcy5hWzldO3RoaXMub3E9dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzZdO3RoaXMuRGk9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzFdO3RoaXMueHU9dGhpcy5hWzNdO3RoaXMuQm49dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMV19Yy5Qaj1iO2IucHJvdG90eXBlPXtVazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZrOnRoaXMucHIoYSl9LHByOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5xcjp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV3I6dGhpcy5mcShhKX0sZnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmdxOnRoaXMubnEoYSl9LG5xOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5vcTp0aGlzLlBvKGEpfSxQbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUW86dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5EaTp0aGlzLkRtKGEpfSxEbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRW06dGhpcy53dShhKX0sd3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnh1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Cbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFZhPWMuUGp8fFZhLHljPW5ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXljLlVrKDQpO3ZhciB3PXtSZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix1YToiWE1MX1BBUlNFX0VSUk9SIn0sa2o6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLHVhOiJEVVJBVElPTl9FUlJPUiJ9LApMYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsdWE6IkVNUFRZX1ZBU1QifSxCZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix1YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0seWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsCnVhOiJMT0FEX0VSUk9SIn0sUGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHVhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sanY6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsdWE6Ik1FRElBRklMRV9FUlJPUiJ9LHVmOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLHVhOiJEVU1NWV9BRCJ9fSxGPXt6Zjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLHVhOiJOT19BRFMifSxBZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsdWE6Ik5PX01FRElBRklMRVMifSxrdjp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsdWE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxRZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix1YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs2XX1jLkVpPWI7Yi5wcm90b3R5cGU9e2ZzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3M6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLkVpfHxXYSx6Yz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy5mcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiKXt0aGlzLmVycm9yPWE7dGhpcy5rZD1iO3RoaXMuTGE9W107dGhpcy5vcmlnaW49bnVsbH1jLkxqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5Manx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG49dGhpcy5hWzddO3RoaXMuSnM9dGhpcy5hWzldO3RoaXMuem49dGhpcy5hWzRdO3RoaXMuZ3Y9dGhpcy5hWzddO3RoaXMudGk9dGhpcy5hWzVdO3RoaXMuaXY9dGhpcy5hWzddO3RoaXMubnU9dGhpcy5hWzddO3RoaXMucXE9dGhpcy5hWzFdO3RoaXMuJHM9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMTBdfWMuQnI9YjtiLnByb3RvdHlwZT17c246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50bjp0aGlzLklzKGEpfSxJczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnM6dGhpcy55bihhKX0seW46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnpuOgp0aGlzLmZ2KGEpfSxmdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ3Y6dGhpcy5zaShhKX0sc2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRpOnRoaXMuaHYoYSl9LGh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaXY6dGhpcy5tdShhKX0sbXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm51OnRoaXMucHEoYSl9LHBxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xcTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHM6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLkJyfHxYYSxBYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1BYy5zbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHwKe307dGhpcy5mPWE7dGhpcy5hYj1hLnRnKCk7dGhpcy5HPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuRy5pZD1lLmVhKDEwKTt0aGlzLkY9Qy5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuU2Y9ITE7dGhpcy5MYj1bXX1jLm5qPWI7Yi5wcm90b3R5cGU9e3BwOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUseTpifTtnLnBvc2l0aW9uPWM7cmV0dXJuIGd9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMucHAoYSk7CmZvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5VcChhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yix5OmN9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxOdDpmdW5jdGlvbigpe3RoaXMuU2Y9ITB9LApQaDpmdW5jdGlvbigpe3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saWg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5kZCx0aGlzLmYudSgpKX0sWXM6ZnVuY3Rpb24oKXt0aGlzLlNmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5lZCx0aGlzLmYudSgpKSl9LEdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz0KdGhpcy5hYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmFiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuYWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuYWIpO3RoaXMuZi5EYyYmdGhpcy5mLkRjKCk/dGhpcy5mLnRnKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5SYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sVXA6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHwKYiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxncDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFJiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ3AodGhpcy5hYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5yZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuRGMoKT8odGhpcy5HLnN0eWxlLmxlZnQ9CiIwcHgiLHRoaXMuRy5zdHlsZS50b3A9IjBweCIpOih0aGlzLkcuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkcuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkcuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkcuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5MYi5sZW5ndGg7YSsrKXRoaXMuTGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5BaCh0aGlzLkcpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJiLmJpbmQodGhpcyksMTApfSxSZjpmdW5jdGlvbihhKXt0aGlzLkxifHwodGhpcy5MYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuTGIucHVzaChhKX0scmU6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmCnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMubmp8fFlhLEM9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuZWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBKPSExLGRhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXM9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzEwXTsKdGhpcy5Oaz10aGlzLmFbMTBdO3RoaXMuVXI9dGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzEwXTt0aGlzLk9vPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLk1vPWI7Yi5wcm90b3R5cGU9eyRyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hczp0aGlzLmJrKGEpfSxiazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2s6dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5rOnRoaXMuVHIoYSl9LFRyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vcjp0aGlzLk9tKGEpfSxPbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUG06dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLk9vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgJGE9Yy5Nb3x8JGEsQmM9bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLiRyKDQpOyhmdW5jdGlvbihjKXtjLmpsPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlkoYSk7dGhpcy5EZChiKTt0aGlzLmZnKCl9LERkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksCjEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSx2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LE86ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHU6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkZhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIGFiPWMuamx8fGFiOyhmdW5jdGlvbihjKXtjLmlsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj1lYSgpO3RoaXMuS2I9dGhpcy5LYnx8ITE7dGhpcy5KZj10aGlzLkxmPXRoaXMuSmc9dGhpcy5jYT10aGlzLmtmPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuZXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmtmPSEwO3RoaXMuSmcmJnRoaXMuYWcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkud2I7YSYmYS5TYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmFkKCk7dGhpcy5KZz0hMDt0aGlzLmFnKCl9LmJpbmQodGhpcykpO3RoaXMuV2YoKX0sYWc6ZnVuY3Rpb24oKXtpZighdGhpcy5LYil7dGhpcy5hZCgpO2lmKCF0aGlzLmtmJiYhdGhpcy5hZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMua2YmJnRoaXMuSmYmJiF0aGlzLkxmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LAp5ZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxXZjpmdW5jdGlvbigpe2lmKHRoaXMuYWQoKSl7dmFyIGI9dGhpcy55ZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLkxmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuSmY9Yi5ydn10aGlzLnJhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XZigpfS5iaW5kKHRoaXMpLDEwMCl9LHV2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkh2KCk6ITF9LHVjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/CmIudWMoKTotMX0sRXA6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sZXA6ZnVuY3Rpb24oYixhKXt0aGlzLktiPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuS2J8fDMwMj09dGhpcy5LYj90aGlzLmNhPSEwOnRoaXMubygiYWRlcnJvciIsdGhpcy5LYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuY2E/KHRoaXMudygpLHRoaXMucWEoKSk6Yi52ZSgpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkVwKGIpPyh0aGlzLkkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGEoKX0uYmluZCh0aGlzKSwyRTMpKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLmlsfHxiYjsoZnVuY3Rpb24oYyl7Yy5rbD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LHlxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkFsLlZtLlRtP3dpbmRvdy5PTy5BbC5WbS5UbS5wdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55cSgpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5RYT0xNTAwO3ZhciBiPWVhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLm9lKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBhYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5QKGMpLChuZXcgYmIoYywKdGhpcy5LKSkuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBjYj1jLmtsfHxjYixkYj1uZXcgY2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbM119Yy5icT1iO2IucHJvdG90eXBlPXtmaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ2k6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBlYj1jLmJxfHxlYixDYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1DYy5maSg0KTsoZnVuY3Rpb24oYyl7Yy5jaj1yLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLm9hPSExO3RoaXMuQmcoKX0sQmc6ZnVuY3Rpb24oKXt2YXIgYj0KITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5ZKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRDdXJyZW50VGltZSgpfSwKZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLm1oKCl9LG1oOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5WJiYoMCx0aGlzLlYpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1oKCl9LmJpbmQodGhpcyksMTAwKX0sTzpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5janx8ZmI7KGZ1bmN0aW9uKGMpe2MuYmo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sWGY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5jb2RlLGM9Yi5tZXNzYWdlO2IuZGF0YSYmKGE9Yi5kYXRhLmNvZGUsYz1iLmRhdGEubWVzc2FnZSk7MTIwNSE9YSYmKDkwMD09YSYmMDxjLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8odGhpcy53KCJlbXB0eSIpLAp0aGlzLnFhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucWEoKTp0aGlzLnMoKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRFcnJvckV2ZW50cylmb3IodmFyIGE9MDthPGIuYWRFcnJvckV2ZW50cy5sZW5ndGg7YSsrKXRoaXMuWGYoYi5hZEVycm9yRXZlbnRzKTtiLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YZihhKX0uYmluZCh0aGlzKSk7Yi5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/dGhpcy5JKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgZ2I9Yy5ianx8Z2I7KGZ1bmN0aW9uKGMpe2MuZGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSwKcGg6ZnVuY3Rpb24oYil7Yj1uZXcgZmIoYik7Yi5vYT90aGlzLlIoKTp0aGlzLk4oYil8fChiLkRkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLlAoYiksKG5ldyBnYihiLHRoaXMuSykpLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmZwfHwodGhpcy5mcD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMucGgoYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnBoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgaGI9Yy5kanx8aGIsVT1uZXcgaGIocSk7VS5nKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs1XTt0aGlzLldpPXRoaXMuYVs3XTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLm5zPXRoaXMuYVs4XTt0aGlzLmN2PXRoaXMuYVszXTt0aGlzLnVsPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzZdfWMuT2w9YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnVvOnRoaXMuVmkoYSl9LFZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5XaTp0aGlzLmhpKGEpfSxoaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmlpOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5uczp0aGlzLmJ2KGEpfSxidjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY3Y6dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVsOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmo6YX19fSkoYyk7dmFyIGliPWMuT2x8fGliLERjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLnRvKDQpOyhmdW5jdGlvbihjKXtjLlhsPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuWShiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlMuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LERjOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LE86ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5YbHx8VjsoZnVuY3Rpb24oYyl7Yy5XbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt5LlVjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eS5VYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLklyKGEpfS5iaW5kKHRoaXMpKTsKeS5VYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuSSgpfS5iaW5kKHRoaXMpKTt5LlVjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkkoKX0uYmluZCh0aGlzKSk7eS5PcCgpfSxJcjpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnFhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTsKdGhpcy5xYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBXPWMuV2x8fFc7KGZ1bmN0aW9uKGMpe2MuWWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMud2QmJihiPWUud28oYix0aGlzLndkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5QKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5LKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz0KYlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMud2R8fCh0aGlzLndkPVtdKSx0aGlzLndkLnB1c2goYlthXSksZD1uZXcgVihnKSx0aGlzLk4oZCl8fCh0aGlzLlAoZCksZj1uZXcgVyhkLHRoaXMuSyksZi5nKCkpfWNhdGNoKGspe319fXRoaXMuUigpfSxVYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5iYXx8KHRoaXMuYmE9e30pO3RoaXMuYmFbYl18fCh0aGlzLmJhW2JdPXt9KTt0aGlzLmJhW2JdW2FdfHwodGhpcy5iYVtiXVthXT1bXSk7dGhpcy5iYVtiXVthXS5wdXNoKGMpfSxidTpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmJhfHx0aGlzLmJhJiYhdGhpcy5iYVthXSl0aGlzLkFjfHwodGhpcy5BYz1bXSksdGhpcy5BYy5wdXNoKGIpLHRoaXMuWHMoKSYmKHRoaXMuVmUoKSx0aGlzLmcoKSk7CmVsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYmFbYV1bY10mJjA8dGhpcy5iYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmJhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5iYVthXVtjXVtkXShiKX19LE9wOmZ1bmN0aW9uKCl7aWYodGhpcy5BYylmb3IodmFyIGI9MDtiPHRoaXMuQWMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5BY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYmFbY11bZF0mJjA8dGhpcy5iYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmJhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5iYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmCiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmJ1KGIpfX0pfSkoYyk7dmFyIGpiPWMuWWx8fGpiLHk9bmV3IGpiKHEpO2NhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3A9dGhpcy5hWzZdO3RoaXMuSG49dGhpcy5hWzEwXTt0aGlzLmlyPXRoaXMuYVsxMF07dGhpcy5FdT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs2XX1jLldtPWI7Yi5wcm90b3R5cGU9e25wOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vcDp0aGlzLkduKGEpfSxHbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSG46dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuRHUoYSl9LER1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5FdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7CnZhciBrYj1jLldtfHxrYixFYz1uZXcga2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy5ucCg0KTsoZnVuY3Rpb24oYyl7Yy5aaT1yLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuWShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApSYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIGxiPWMuWml8fGxiOyhmdW5jdGlvbihjKXtjLiRpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHwKYS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMubygibm9BZCIsInBsYXllZCIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuSSghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBtYj1jLiRpfHxtYjsoZnVuY3Rpb24oYyl7Yy5haj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPQpiW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZSl7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBnPW5ldyBsYihkKTt0aGlzLk4oZyl8fCh0aGlzLlAoZyksKG5ldyBtYihnLHRoaXMuSykpLmcoKSl9Y2F0Y2goayl7fX10aGlzLlIoKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGE9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMuSmFbYi5zYigpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLmFqfHxuYixvYj1uZXcgbmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2w9dGhpcy5hWzZdO3RoaXMuWG89dGhpcy5hWzZdO3RoaXMud2o9dGhpcy5hWzNdO3RoaXMucm89dGhpcy5hWzVdO3RoaXMuaj0KdGhpcy5hWzJdfWMub3M9YjtiLnByb3RvdHlwZT17Zmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmdsOnRoaXMuV28oYSl9LFdvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Ybzp0aGlzLnZqKGEpfSx2ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMud2o6dGhpcy5xbyhhKX0scW86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgcGI9Yy5vc3x8cGIsRmM9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuZmwoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpOwp0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5ZKGIpO3RoaXMuWihhKTt0aGlzLlFzKHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LFFzOmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmhhJiZ0aGlzLmhhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucmVzdW1lJiZ0aGlzLmhhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmdGhpcy5oYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LEtnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sTzpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMuYWx8fHFiOyhmdW5jdGlvbihjKXtjLiRrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSk7dGhpcy5ZaD0hMX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpOwpiLmF1dG9zdGFydCYmIXRoaXMuWWgmJih0aGlzLkkoKSx0aGlzLlloPSEwLHRoaXMucGEoKSk7YS5GYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkkoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgcmI9Yy4ka3x8cmI7KGZ1bmN0aW9uKGMpe2MuYmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBxYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyByYihjLHRoaXMuSykpLmcoKSl9fWVsc2UgdGhpcy5SKCl9fSl9KShjKTt2YXIgc2I9Yy5ibHx8c2IsWD1uZXcgc2IocSk7WC5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkt0PXRoaXMuYVs1XTt0aGlzLk9xPXRoaXMuYVsyXTt0aGlzLkltPXRoaXMuYVs4XTt0aGlzLk9zPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs4XTt0aGlzLkFrPXRoaXMuYVszXTt0aGlzLnV0PXRoaXMuYVs3XTt0aGlzLnBuPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxXX1jLnVqPWI7Yi5wcm90b3R5cGU9e0p0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5LdDp0aGlzLk5xKGEpfSxOcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3E6dGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkltOnRoaXMuTnMoYSl9LE5zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pczp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWWk6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkFrOgp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudXQ6dGhpcy5ubihhKX0sbm46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnBuOnRoaXMuWG4oYSl9LFhuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Zbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIHRiPWMudWp8fHRiLEdjPW5ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUdjLkp0KDQpOyhmdW5jdGlvbihjKXtjLndtPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5WPygwLHRoaXMuVikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7CnZhciB1Yj1jLndtfHx1YjsoZnVuY3Rpb24oYyl7Yy52bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxQYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYj1iLmdldFJhd1BsYXllcigpO3JldHVybiBiLmltYUFkc0xvYWRlcn0sUHM6ZnVuY3Rpb24oYil7Yi5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLlZhfHwodGhpcy5WYT1bXSk7dGhpcy5WYS5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucWEoKTp0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5qYz0KITA7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLnMoKTt0aGlzLmdldFBsYXllcigpO3RoaXMueGE/dGhpcy5Qcyh0aGlzLnhhKToodGhpcy54YT10aGlzLlBiKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKSl9LHM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMueGEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5qYyl7dGhpcy5JKCk7cmV0dXJufWI9ITA7aWYodGhpcy5WYSYmdGhpcy5WYS5sZW5ndGgmJjE8dGhpcy5WYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLlZhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLlZhW2FdJiYzMDMhPXRoaXMuVmFbYV0mJjQwMyE9dGhpcy5WYVthXSYmKGI9ITEpO2lmKGIpdGhpcy53KCJlbXB0eSIpLHRoaXMucWEoKTsKZWxzZXt0aGlzLkkoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksNTAwKX19KX0pKGMpO3ZhciB2Yj1jLnZtfHx2YjsoZnVuY3Rpb24oYyl7Yy54bT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt0aGlzLlFhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHViKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5QKGMpLChuZXcgdmIoYyx0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIHdiPWMueG18fHdiLHhiPW5ldyB3YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuTnI9dGhpcy5hWzRdO3RoaXMucWs9dGhpcy5hWzFdO3RoaXMucmo9dGhpcy5hWzZdO3RoaXMuYXE9dGhpcy5hWzVdO3RoaXMuWnA9dGhpcy5hWzNdO3RoaXMuSnE9dGhpcy5hWzNdO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuUXE9dGhpcy5hWzRdO3RoaXMuaXU9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbOV19Yy5Gaj1iO2IucHJvdG90eXBlPXtNcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnI6dGhpcy5wayhhKX0scGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFrOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5yajp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuYXE6dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5acDp0aGlzLklxKGEpfSxJcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSnE6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5Vajp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUXE6dGhpcy5odShhKX0saHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLml1OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgeWI9Yy5Ganx8eWIsSGM9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXIoNCk7KGZ1bmN0aW9uKGMpe2MuSmw9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlkoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuT2U9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5CcygpfS5iaW5kKHRoaXMpLDUwMCl9LEJzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuViYmdGhpcy5WKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuT2UmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuT2UpOwp0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sRnQ6ZnVuY3Rpb24oKXt0aGlzLk9lPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgemI9Yy5KbHx8emI7KGZ1bmN0aW9uKGMpe2MuSWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKTt0aGlzLmJjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLmtyPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5iY3x8KHRoaXMuYmM9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIpO3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksCnRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSk6KHRoaXMuYmN8fHRoaXMuYmMrKyx0aGlzLmJjPD10aGlzLmtyPyh0aGlzLmJjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5GdCgpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTsKdmFyIEFiPWMuSWx8fEFiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IHpiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IEFiKGIsdGhpcy5LKSkuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgQmI9Yy5LbHx8QmIsQ2I9bmV3IEJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdtPXRoaXMuYVs0XTt0aGlzLmRsPXRoaXMuYVs4XTt0aGlzLnd0PXRoaXMuYVszXTsKdGhpcy5lcT10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs1XX1jLldxPWI7Yi5wcm90b3R5cGU9e0ZtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HbTp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZGw6dGhpcy52dChhKX0sdnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnd0OnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIERiPWMuV3F8fERiLEljPW5ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLkZtKDQpOyhmdW5jdGlvbihjKXtjLkVsPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlOwp0aGlzLlkoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sS2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5WKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksCjIwMCl9LE86ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBFYj1jLkVsfHxFYjsoZnVuY3Rpb24oYyl7Yy5EbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnBhKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubW8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5uZCgpOwowPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlJxKCk6dGhpcy4kZigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LG1vOmZ1bmN0aW9uKCl7dGhpcy5IZigpfHx0aGlzLnMoITApfSxScTpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmQoKTshYi5sYSYmYi5XJiZiLm52JiZiLnF2JiYodGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sJGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09CmI/KHRoaXMudygpLHRoaXMucWEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGYoKX0uYmluZCh0aGlzKSwxMDApfSxuZDpmdW5jdGlvbigpe2lmKCF0aGlzLmdoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy5naD1iW2NdKTtyZXR1cm4gdGhpcy5naH0sSXY6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubmQoKS5hZHNMb2FkZXI/dGhpcy5JKCEwKTp0aGlzLkkoKTp0aGlzLkkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuRGx8fEZiOyhmdW5jdGlvbihjKXtjLkZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlAoYyksKG5ldyBGYihjLHRoaXMuSykpLmcoKSl9cmV0dXJufX10aGlzLlIoKX19KX0pKGMpO3ZhciBHYj1jLkZsfHxHYixIYj1uZXcgR2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHI9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbM119Yy5obj1iO2IucHJvdG90eXBlPXtHcjpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkhyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgSWI9Yy5obnx8SWIsSmM9bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuR3IoNCk7KGZ1bmN0aW9uKGMpe2MuUGs9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0cmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5ZKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5uYSgpfWVsc2UgdGhpcy5uYSgpfSwKR3Y6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLlFiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LFJhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxEYzpmdW5jdGlvbigpe3JldHVybiEwfSwKRmE6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBZPWMuUGt8fFk7KGZ1bmN0aW9uKGMpe2MuT2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm0oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUWU9IiI7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiJiYodGhpcy5RZT1iLmlkKTtHP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlFlJiZiIT10aGlzLlFlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUueWEoInRlbGU1LmRlIikmJgoicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMubygiYWRlcnJvciIsYS5LdiksdGhpcy5JKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubygiYWRlcnJvciIpLHRoaXMuSSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBaPWMuT2t8fFo7KGZ1bmN0aW9uKGMpe2MuUWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPwohMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFkoYiksYi5vYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFkoYiksYi5vYT90aGlzLlZlKCk6dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFooYix0aGlzLkspLGIuZygpKX10aGlzLlIoKX19KX0pKGMpO3ZhciBHLEpiPWMuUWt8fEpiLEtiPW5ldyBKYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuY3M9dGhpcy5hWzldO3RoaXMuUWw9dGhpcy5hWzldOwp0aGlzLkppPXRoaXMuYVsxXTt0aGlzLmpzPXRoaXMuYVs0XTt0aGlzLmtxPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzhdfWMudmw9YjtiLnByb3RvdHlwZT17YnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jczp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFsOnRoaXMuSWkoYSl9LElpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5KaTp0aGlzLmhzKGEpfSxoczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuanM6dGhpcy5qcShhKX0sanE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5rcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIExiPWMudmx8fExiLEtjPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUtjLmJzKDQpOyhmdW5jdGlvbihjKXtjLkttPQpyLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5ZKGEpfWVsc2UgdGhpcy5uYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcucGxheSgpfSxSYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxPOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIE1iPWMuS218fE1iOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LFJzOmZ1bmN0aW9uKGIpe2ImJgpiLmFkZEV2ZW50TGlzdGVuZXImJihiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiYKYi5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKSl9LCRjOmZ1bmN0aW9uKGIpe3ZhciBhPXt9O2IuZ2V0RXJyb3ImJihiLmdldEVycm9yKCksYT1iLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMubygiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5JKCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiksdGhpcy5JKCkpfSxFZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy4kYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnJhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRWYuYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbigpe3dpbmRvdy5fX2RsOF9hZHNMb2FkZXImJnRoaXMuUnMod2luZG93Ll9fZGw4X2Fkc0xvYWRlcik7dGhpcy5FZigpfX0pfSkoYyk7dmFyIE5iPWMuSm18fE5iOyhmdW5jdGlvbihjKXtjLkxtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGI9bmV3IE1iKHdpbmRvdy5ETDhfR0xPQkFMUyk7Yi5vYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLChuZXcgTmIoYix0aGlzLkspKS5nKCkpfXRoaXMuUigpfX0pfSkoYyk7dmFyIE9iPWMuTG18fE9iLFBiPW5ldyBPYihoYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudm49dGhpcy5hWzNdO3RoaXMub2k9dGhpcy5hWzZdO3RoaXMuenI9dGhpcy5hWzddO3RoaXMudXM9dGhpcy5hWzEwXTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLnF1PQp0aGlzLmFbNF07dGhpcy5Tbj10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbNl07dGhpcy5qaj10aGlzLmFbNV07dGhpcy5taT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVszXX1jLiRvPWI7Yi5wcm90b3R5cGU9e3VuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52bjp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMub2k6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnpyOnRoaXMudHMoYSl9LHRzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy51czp0aGlzLmRrKGEpfSxkazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZWs6dGhpcy5wdShhKX0scHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnF1OnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLktzKGEpfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5qajp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubWk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBRYj1jLiRvfHxRYixMYz1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy51big0KTsoZnVuY3Rpb24oYyl7Yy5kbT1yLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LFM6ZnVuY3Rpb24oKXt0aGlzLmtoPSExO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5ZKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSwKYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLnJyPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5uYSgpfWVsc2UgdGhpcy5uYSgpfWVsc2UgdGhpcy5uYSgpfSxQdjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sUmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8KITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucnJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LE86ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYhdGhpcy5raCYmKHRoaXMua2g9ITAsdGhpcy5WJiZ0aGlzLlYoKSl9fSl9KShjKTt2YXIgTz1jLmRtfHxPOyhmdW5jdGlvbihjKXtjLmNtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LHhhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMua2UpaWYodGhpcy54Ynx8KHRoaXMueGI9MCksdGhpcy54YisrLDE1PHRoaXMueGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMucHQoKTp0aGlzLnMoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmtlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5jYXx8KHRoaXMubygiYWRlcnJvciIsdGhpcy5UKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5UPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt0aGlzLlQ9dGhpcy5UfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMueGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5JKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgUD1jLmNtfHxQOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKTt0aGlzLlFhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBQKGIsdGhpcy5LKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5OKGIpfHwodGhpcy5QKGIpLGI9bmV3IFAoYix0aGlzLkspLGIuZygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBQKGIsdGhpcy5LKSxiLmcoKSkpO3RoaXMuVmUoKTt0aGlzLlIoKX19KX0pKGMpO3ZhciBSYj1jLmVtfHxSYixTYj1uZXcgUmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGo9dGhpcy5hWzRdO3RoaXMuVnE9dGhpcy5hWzhdO3RoaXMua289dGhpcy5hWzddO3RoaXMuRnE9dGhpcy5hWzhdO3RoaXMuQm89dGhpcy5hWzddO3RoaXMuZHU9dGhpcy5hWzFdO3RoaXMuWGs9dGhpcy5hWzhdO3RoaXMuQW09dGhpcy5hWzZdO3RoaXMuenM9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMuR2o9YjtiLnByb3RvdHlwZT17c2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnRqOnRoaXMuVXEoYSl9LFVxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5WcTp0aGlzLmpvKGEpfSwKam86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtvOnRoaXMuRXEoYSl9LEVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5GcTp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQm86dGhpcy5jdShhKX0sY3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmR1OnRoaXMuV2soYSl9LFdrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Yazp0aGlzLnptKGEpfSx6bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQW06dGhpcy55cyhhKX0seXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgVGI9Yy5Hanx8VGIsTWM9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuc2ooNCk7KGZ1bmN0aW9uKGMpe2MuQ2s9CnIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sUzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuWShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5ZKGEucGFyZW50Tm9kZSl9LE86ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGFhPWMuQ2t8fGFhOyhmdW5jdGlvbihjKXtjLkJrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5tKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLkdnPTA7dGhpcy5UPXRoaXMuVHx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmNhPXRoaXMud2M9dGhpcy54YT0KdGhpcy5XYz0hMTt0aGlzLm9oPWUuQmIoMTApO3RoaXMuUGcoKX0sUGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubGE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLmpiKCksITA7dGhpcy5HZysrO2lmKDEwPHRoaXMuR2cpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMucyghMCk6dGhpcy5zKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5QZy5iaW5kKHRoaXMpLDEwMCksITF9LGpiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5sYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlQpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnJhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamIoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5UPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiYKYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTticmVha319LHRkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2F9LEFhOmZ1bmN0aW9uKCl7dGhpcy5jYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNhPyh0aGlzLncoKSx0aGlzLnFhKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkkoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJhPWMuQmt8fGJhOyhmdW5jdGlvbihjKXtjLkRrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sCmc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgYWEod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUChiKSxiPW5ldyBiYShiLHRoaXMuSyksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBhYSh3aW5kb3cucGxheWVyKSx0aGlzLk4oYil8fCh0aGlzLlAoYiksYj1uZXcgYmEoYix0aGlzLkspLGIuZygpKSk7dGhpcy5SKCl9fSl9KShjKTt2YXIgVWI9Yy5Ea3x8VWIsVmI9bmV3IFViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5scD10aGlzLmFbNl07dGhpcy5Laj10aGlzLmFbMV07dGhpcy5ybj10aGlzLmFbNV07dGhpcy5pcD10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVszXX1jLlFtPWI7Yi5wcm90b3R5cGU9e2twOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scDp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuS2o6dGhpcy5xbihhKX0scW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJuOnRoaXMuaHAoYSl9LGhwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5pcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIFdiPWMuUW18fFdiLE5jPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLmtwKDQpOyhmdW5jdGlvbihjKXtjLlJqPXIuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubShiKX0sClM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuWShiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5uYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBYYj1jLlJqfHxYYjsoZnVuY3Rpb24oYyl7Yy5Raj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5aZigpfSxaZjpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuSSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmYoITApfS5iaW5kKHRoaXMpLAoxMDApKX19KX0pKGMpO3ZhciBZYj1jLlFqfHxZYjsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm0oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgWGIod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuUigpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlAoYik7KG5ldyBZYihiLHRoaXMuSykpLmcoKTt0aGlzLlIoKTtyZXR1cm59fXRoaXMuUigpfX0pfSkoYyk7dmFyIFpiPWMuU2p8fFpiLCRiPW5ldyBaYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Obj10aGlzLmFbNF07dGhpcy5xcz10aGlzLmFbOV07dGhpcy5Ecj0KdGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbMTBdfWMuTXE9YjtiLnByb3RvdHlwZT17TW46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5uOnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXM6dGhpcy5DcihhKX0sQ3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkRyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgYWM9Yy5NcXx8YWMsT2M9bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuTW4oNCk7KGZ1bmN0aW9uKGMpe2MuYmk9ci5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5ZKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pPwp0aGlzLlooYik6dGhpcy5uYSgpKTp0aGlzLm5hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxPOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBiYz1jLmJpfHxiYzsoZnVuY3Rpb24oYyl7Yy5haT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubShiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTt0aGlzLmJlKCk7dGhpcy5WZigpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09CmF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlQ9YSxiLm8oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5BYSgpO2JyZWFrfX0sdGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYX0sQWE6ZnVuY3Rpb24oKXt0aGlzLmNhPSEwO3RoaXMudygiZW1wdHkgdmFzdCIpfSxWZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLApmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnFhKCkpOnRoaXMucygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVmYuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJlLmJpbmQodGhpcyksMTAwKX0sYmU6ZnVuY3Rpb24oKXtpZighdGhpcy5yYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT8KYi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5wYS5iaW5kKHRoaXMpLDEwKSx0aGlzLncoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLnMoKTp0aGlzLnMoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmUuYmluZCh0aGlzKSwxMDApfX0sczpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBhLmJpbmQodGhpcyksMUU0KTt0aGlzLkkoYil9fSl9KShjKTt2YXIgY2M9Yy5haXx8Y2M7KGZ1bmN0aW9uKGMpe2MuY2k9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tKGIpfSxTYTpmdW5jdGlvbihiKXtiPW5ldyBiYyhiKTtiLm9hP3RoaXMuUigpOnRoaXMuTihiKXx8KHRoaXMuUChiKSwobmV3IGNjKGIsdGhpcy5LKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLlNhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTsKZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5SKCl9fSl9KShjKTt2YXIgZGM9Yy5jaXx8ZGMsZWM9bmV3IGRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnV1PXRoaXMuYVs1XTt0aGlzLllxPXRoaXMuYVszXTt0aGlzLkhrPXRoaXMuYVs4XTt0aGlzLnZpPXRoaXMuYVs0XTt0aGlzLm9tPXRoaXMuYVs4XTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmV0PXRoaXMuYVs0XTt0aGlzLkxrPXRoaXMuYVsxMF07dGhpcy5EdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLklvPWI7Yi5wcm90b3R5cGU9e3R1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy51dTp0aGlzLlhxKGEpfSxYcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWXE6dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5Iazp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmk6dGhpcy5ubShhKX0sbm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9tOnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ObTp0aGlzLmR0KGEpfSxkdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXQ6dGhpcy5LayhhKX0sS2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxrOnRoaXMuQ3QoYSl9LEN0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EdDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIGZjPWMuSW98fGZjLFBjPW5ldyBmYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnR1KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlJnPQp0aGlzLlRnPXRoaXMuU2c9ITE7dGhpcy55ZD1bXTt0aGlzLlVlPXtHQU5WaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiAkYj9udWxsOiRiLGxhb2xhMVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQmE/bnVsbDpCYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBVP251bGw6VSxvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEdhP251bGw6R2EsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhiP251bGw6SGIsanc6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2E/bnVsbDp3YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PQp0eXBlb2Ygb2I/bnVsbDpvYixPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIENiP251bGw6Q2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIExhP251bGw6TGEsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yj9udWxsOnhiLEFWUGxheWVyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFg/bnVsbDpYfX1jLnlsPWI7Yi5wcm90b3R5cGU9e2c6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuR3AoYSk6W10sYjt0aGlzLlRnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLlNnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnRoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5VZSl7aWYodGhpcy5SZylicmVhaztiPXRoaXMuVWVbY107dGhpcy5uZihiKSYmKHRoaXMueWQucHVzaChiKSx0aGlzLnRoKGIpKX19LApuZjpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYSBpbnN0YW5jZW9mIHQ/ITA6ITF9LEdwOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm4gYjtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyljPWFbZV0sYz10aGlzLlVlW2NdLHRoaXMubmYoYykmJmIucHVzaChjKTtyZXR1cm4gYn0sdGg6ZnVuY3Rpb24oYSl7dGhpcy5uZihhKSYmYS5nKCl9LEh0OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiByJiYhdGhpcy5TZylmb3IodGhpcy5SZz0hMCxhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXS5GYiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnlkW2FdLkZiKX19fSkoYyk7dmFyIGdjPWMueWx8fGdjLE09bmV3IGdjO00uZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmttPXRoaXMuYVs0XTt0aGlzLlprPXRoaXMuYVsyXTsKdGhpcy56aT10aGlzLmFbNl07dGhpcy5pcT10aGlzLmFbMl07dGhpcy5wbD10aGlzLmFbMl07dGhpcy5MaT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVsxXX1jLkZpPWI7Yi5wcm90b3R5cGU9e2ptOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbTp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWms6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnppOnRoaXMuaHEoYSl9LGhxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pcTp0aGlzLm9sKGEpfSxvbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucGw6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5GaXx8aGMsUWM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmptKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLnNjKGsuenUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLnNjKGsudnIpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKRS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIFJjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksa2M9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEk9bmV3IFIsbT0hMTtJLnhjKCk7SS5MZygpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkueGMoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLkxnKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SS54YygpO3ZhciBTYz1SYyhmdW5jdGlvbigpe2Uub2cod2luZG93LEkucnEoKSx7aWQ6U2N9KX0sNTAwKSxqYT1lLmVhKDEwKTtmYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5yaT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsxXX1jLmpwPWI7Yi5wcm90b3R5cGU9e3BpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBpYz1jLmpwfHxpYyxUYz1uZXcgaWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy5waSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubGg9dGhpcy5jb25mPXRoaXMuZWI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLnVkPTA7dGhpcy5VYT0iIjt0aGlzLnpkPVtdO3RoaXMuQWQ9MDt0aGlzLm5oPSExO3RoaXMuUmU9W107ZS5nYigibmV3QWRkZWxpdmVyeSIpfWMuZGk9YjtiLnByb3RvdHlwZT17bXQ6ZnVuY3Rpb24oYSl7dGhpcy5saD0KYX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLlVhPXRoaXMucGxheWVyLk8oKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxodDpmdW5jdGlvbihhKXt0aGlzLmViPWF9LGd0OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxFYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuVWFdJiZ0aGlzLmNvbmZbdGhpcy5VYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlVhXVthXSk7cmV0dXJuIGJ9LEVjOmZ1bmN0aW9uKGEsYil7ZS55YSgid2VsdC5kZSIpJiZlLlRhKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsCiJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5lYik7dmFyIGM9ITEsZj0hMTtpZih0aGlzLnNxKCkpdGhpcy5lYi5sKHRoaXMuZWIucGQsdGhpcy5lYi5DYSx0aGlzLmViLlRlLGZ1bmN0aW9uKCl7dGhpcy5FYyhhLGIpfS5iaW5kKHRoaXMpLHRoaXMuZWIub2MpO2Vsc2UgaWYodGhpcy5RcCgpKXRoaXMuY3QoZnVuY3Rpb24oKXt0aGlzLkVjKGEsYil9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLnYoay5kZCx0aGlzLnBsYXllci51KCkpO3ZhciBnPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGcpO2ImJmwuTnQoKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5nYigibmV3SG9tYWREaXNwbGF5Iik7Uz1sPW5ldyBRYShsLHRoaXMuZWIsZyk7bC5mdCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7CmE9YShtKX0oYT10aGlzLmpyKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuQmUmJihjPXRoaXMucGxheWVyLkJlKCkpO2cuYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxnLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkRlKGEsYyxmKTt0aGlzLnBsYXllci52aChsKX19LHNxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMudWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy51ZC5nZXRUaW1lKCksdGhpcy51ZD1hLDNFNTxiPyEwOiExO3RoaXMudWQ9YTtyZXR1cm4hMX0senQ6ZnVuY3Rpb24oKXtlLmdiKCJwcmVyb2xsIik7ZS5ZZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRWEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLmtnKGEpKT90aGlzLkVjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUudihrLmVkLHRoaXMucGxheWVyLnUoKSkpfSx5dDpmdW5jdGlvbihhKXtpZighdGhpcy5saCl7ZS5ZZSgicG9zdHJvbGwiKTtlLmdiKCJwb3N0cm9sbCIpO3RoaXMubXQoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikpOyhjPXRoaXMua2coYykpP3RoaXMuRWMoYyxiLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuZWQsdGhpcy5wbGF5ZXIudSgpKSl9fSxrZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpOwphPWEoYil9cmV0dXJuIGF9LFVzOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucnQodGhpcy55dC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5LYSgpfSxGZDpmdW5jdGlvbihhKXtlLmdiKCJtaWRyb2xsIik7ZS5ZZSgibWlkcm9sbCIpO2lmKCF0aGlzLlpnKXt0aGlzLlpnPSEwO3ZhciBiPXRoaXMuRWEoImFkVGFnIik7dGhpcy5FYSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMuRWEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLkVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlpnPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUudihrLmVkLHRoaXMucGxheWVyLnUoKSkpfX0sVHM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5sdCh0aGlzLkZkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLkdlKCl9LGc6ZnVuY3Rpb24oKXt0aGlzLnp0KCk7dGhpcy5wbGF5ZXIuR2UmJnRoaXMuVHMoKTsKdGhpcy5VcygpfSxWczpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLnpkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ldihhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuQWQ9dGhpcy56ZC5sZW5ndGh9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkFkJiYoYT0hMCk7cmV0dXJuIGF9LGN0OmZ1bmN0aW9uKGEpe3RoaXMubmg9YTtmb3IoYT0wO2E8dGhpcy56ZC5sZW5ndGg7YSsrKXRoaXMuemRbYV1bImZ1bmN0aW9uIl0odGhpcy5Fcy5iaW5kKHRoaXMpKX0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5BZC0tO2EmJnRoaXMuUmUucHVzaChhKTsKMD49dGhpcy5BZCYmdGhpcy5uaCgpfSxqcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5SZS5sZW5ndGg7YysrKWI9dGhpcy5SZVtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZ2E9Yy5kaXx8Z2EsUz0hMSxuYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kbj10aGlzLmFbM107dGhpcy5Ebj10aGlzLmFbM107dGhpcy5CaT10aGlzLmFbMV07dGhpcy5tcj10aGlzLmFbNl07dGhpcy51bT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVszXX1jLlJrPWI7Yi5wcm90b3R5cGU9e0luOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Kbjp0aGlzLkNuKGEpfSxDbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRG46dGhpcy5BaShhKX0sQWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJpOnRoaXMubHIoYSl9LApscjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubXI6dGhpcy50bShhKX0sdG06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgamM9Yy5Sa3x8amMsVWM9bmV3IGpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuSW4oNCl9KS5jYWxsKE9ib29waGFleGVpRmlOZ2ksT2Jvb3BoYWV4ZWlGaU5naSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.35.253.56 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-35-253-56.fra6.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
1710178d2edd4ba651096bc60a9b71a7bbb240ab6c449bb8f3909a68828ad92f

Request headers

Sec-Fetch-Mode
cors
Referer
https://videos.giga.de/embed/176875?autoplay=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Date
Mon, 02 Sep 2019 07:35:45 GMT
Via
1.1 9810d82af8847b51b9c3048141069a65.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
59
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
650
Last-Modified
Thu, 22 Aug 2019 19:35:49 GMT
Server
AmazonS3
ETag
"5fc4deddff2532151bd956c4931604f7"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
X-Amz-Cf-Pop
FRA6-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
3Fj-UA54bOQ4Q_X9modASkkZGWeg_g0YUspxesyTod6mbpfz-psMlQ==
Expires
0
/
ssl.2.damoh.giga.de/a4bc059c27a771b9c847c6e4959b52353ff0dd7a/ Frame 3442
0
0

/
onetag-geo.s-onetag.com/
23 B
432 B
XHR
General
Full URL
https://onetag-geo.s-onetag.com/
Requested by
Host: beacon.s-onetag.com
URL: https://beacon.s-onetag.com/beacon.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2057:7c00:5:ae3a:ba00:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
/
Resource Hash
ad16e1b37490fca28df99d039d6373d2fee4d894fcd279d95b90ae872f4d860f

Request headers

Sec-Fetch-Mode
cors
Referer
https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
User-Agent
Mozilla/5.0 (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, 02 Sep 2019 07:27:14 GMT
via
1.1 c6702f5f3b6e77da6f394e67ef1a6aab.cloudfront.net (CloudFront), 1.1 78059242182c195ff7f26013772da09a.cloudfront.net (CloudFront)
age
512
x-amzn-requestid
bf652ccc-39d2-43c9-b301-ed5607786138
status
200
x-cache
Hit from cloudfront
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=3600
x-amz-cf-pop
FRA50-C1, FRA6-C1
x-amz-apigw-id
fYOc5ExWyK4FllQ=
content-length
23
x-amz-cf-id
GXSSD6acV0KpgHQ7MI1wpLsb3dxfYU1TPkMupq2Jk2eOwxW0Sl7L2w==
o.gif
go.giga-abs.de/
0
0

data
lb70.s400.meetrics.net/
0
0

utsync.ashx
ml314.com/ Frame 2A91
0
0

Failed requests

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

Domain
cdn-a.yieldlove.com
URL
https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?giga.de
Domain
www.dunkirkinception.com
URL
https://www.dunkirkinception.com/detect/ad-loading.gif?p=imagez/
Domain
securepubads.g.doubleclick.net
URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019082901.js
Domain
dkuim.de
URL
https://dkuim.de/api/js/2/dkuim.js
Domain
cdn.taboola.com
URL
https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Domain
go.giga-abs.de
URL
https://go.giga-abs.de/o.gif?__ir=&__is=1600_1200_24&__iu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&__id=1567409736942&__it=-120&__ic=727391&__iq=492d4b25de2fed7257733dea4a227709&__ig=1
Domain
vap2ams1.lijit.com
URL
https://vap2ams1.lijit.com/addelivery/impression?bannerid=214932&campaignid=232&cb=93449824&tid=m_600632_122ea9eea38649f098c99de19ac4e723&zoneid=600632&cids=232&bids=214932&tss=0
Domain
vap2ams1.lijit.com
URL
https://vap2ams1.lijit.com/data/fp?tid=m_600632_122ea9eea38649f098c99de19ac4e723&zoneid=600632&starttime=1567409744070&adcfg=5&adcfg_response=38&addelivery=41&addelivery_response=76&lgfired=113&beacon=118&container=121&EOL=123&ctstart=118&elapsed_ms=123
Domain
cdn.tynt.com
URL
https://cdn.tynt.com/ids.js
Domain
ps.eyeota.net
URL
https://ps.eyeota.net/pixel?pid=51md42u&t=ajs&uid=84e778c11533d0b734f292a1
Domain
ce.lijit.com
URL
https://ce.lijit.com/merge?pid=5176&3pid=1
Domain
bcp.crwdcntrl.net
URL
https://bcp.crwdcntrl.net/5/c=5436/tp=SVRN/tpid=84e778c11533d0b734f292a1/pv=y?https://ce.lijit.com/merge?pid=5001&3pid=${profile_id}
Domain
segments.company-target.com
URL
https://segments.company-target.com/log?vendor=sovrn&user_id=84e778c11533d0b734f292a1
Domain
p.adsymptotic.com
URL
https://p.adsymptotic.com/d/px/?_pid=15697&_psign=0a885fb568701ac53478d88866a10345&_pu&_puuid=84e778c11533d0b734f292a1&_redirect=https%3A%2F%2Fce.lijit.com%2Fmerge%3Fpid%3D5014%263pid%3D${UUID}&_rand=7013197
Domain
dx.bigsea.weborama.com
URL
https://dx.bigsea.weborama.com/collect?dsp_id=5&eid=84e778c11533d0b734f292a1
Domain
ap.lijit.com
URL
https://ap.lijit.com/data/ct?tid=m_600632_122ea9eea38649f098c99de19ac4e723&zoneid=600632&cid=18&geo=GB&all_tags=130%2C133%2C134%2C138%2C151%2C174%2C185%2C203%2C205%2C206%2C211%2C234%2C239%2C241%2C248%2C265%2C277%2C309%2C331%2C332%2C333%2C334%2C335%2C336%2C369%2C380%2C381%2C383%2C388%2C396%2C415%2C417%2C420%2C421%2C423%2C429%2C444%2C450%2C454%2C455%2C460%2C466%2C472&tss=42%2C42%2C43%2C44%2C45%2C46%2C47%2C48&fired_tags=138%2C151%2C234%2C265%2C309%2C369%2C388%2C421&count=8&status=8%2C8%2C8%2C1%2C1%2C8%2C12%2C8%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C1%2C8%2C1%2C8%2C8%2C8%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C8%2C1%2C8%2C8%2C8%2C8%2C8%2C8%2C8%2C8%2C8&elapsed_ms=49
Domain
lb70.s400.meetrics.net
URL
https://lb70.s400.meetrics.net/bb-mx/submit?/c/1ABLAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSFUBPAAAAAAAAAOAAAAGAAAAAAAZwSFUBBRksFAQtjFLOa9SA
Domain
lb70.s400.meetrics.net
URL
https://lb70.s400.meetrics.net/data?/c/1ACMAAATkzFARksFAQtjFXmJNSA
Domain
ssl.2.damoh.giga.de
URL
https://ssl.2.damoh.giga.de/a4bc059c27a771b9c847c6e4959b52353ff0dd7a/
Domain
go.giga-abs.de
URL
https://go.giga-abs.de/o.gif?__iz=0&__id=1567409746942&__it=-120&__ic=727391&__iq=492d4b25de2fed7257733dea4a227709&__ig=1
Domain
lb70.s400.meetrics.net
URL
https://lb70.s400.meetrics.net/data?/c/1ADJOBAKktFLkqFFlqwF23A52AwwATkzFARksFAQtjFY5XNSA
Domain
ml314.com
URL
https://ml314.com/utsync.ashx?pub=&adv=&et=13&eid=50282&ct=js&pi=&fp=&clid=&if=1&ps=&cl=&mlt=&data=&&cp=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pv=1567409747917_mey6zjeva&bl=en-us&cb=4820661&return=https%3A%2F%2Fce.lijit.com%2Fmerge%3Fpid%3D5031%263pid%3D%5BPersonID%5D&ht=&d=&dc=&si=1567409747917_mey6zjeva&cid=&s=1600x1200&rp=

Verdicts & Comments Add Verdict or Comment

128 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| smbContext object| LUX object| POST_META object| smbt function| b2serp object| smbadloader function| requirejs function| require function| define string| GoogleAnalyticsObject function| ga function| adLoader object| apstag boolean| smbt_only object| DKUIM_SETTINGS string| GIGA_AREA string| WP_SITEURL string| SHUTTLE_CORE_VIDEO_CDN_VIDEO_URL string| SHUTTLE_API_URL string| VIDEO_INLINE_MODE boolean| VIDEO_AUTOPLAY_DISABLED function| st_cookie object| is number| USER_PAGE_COUNT object| google_tag_data object| gaplugins object| gaGlobal object| gaData object| dataLayer object| google_tag_manager object| google_optimize string| szmvars object| iom object| smbVideoService object| iam_data object| pagespeed object| adsbygoogle object| google_js_reporting_queue object| google_ad_modifications object| google_logging_queue object| ggeac boolean| google_measure_js_timing object| googleToken object| googleIMState function| processGoogleToken object| google_reactive_ads_global_state object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad number| _gfp_ function| google_spfd number| google_lpabyc number| google_unique_id object| google_sv_map object| google_t12n_vars string| type function| sdibgclick object| _absconfig object| _ecoconf function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam object| fXm_Head object| SDM_head undefined| SDM_resource string| SDM_target function| setImmediate function| clearImmediate string| state object| __onetag object| __connect number| LUX_t_start number| LUX_t_end object| gaLog function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| __google_ad_urls number| google_global_correlator number| __google_ad_urls_id object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy boolean| google_osd_loaded boolean| google_onload_fired object| nativendo_588f272a3e49c_conf object| closure_memoize_cache_ object| google_ltobserver function| _ object| _taboola object| _econa function| send function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb function| dummy function| log function| debug function| info function| warn function| error object| nativendo_pc function| NativendoV2 object| NativendoV2Loader object| nativendo object| nativendo_588f272a3e49c string| preloadType object| gapi object| ___jsl function| $ function| jQuery function| isEmpty object| nativendo_588f272a3e49c_map object| stroeerCore function| stroeerCoreConnect string| sovrn_beacon_tid object| LJT_Ads object| Tynt object| de_meetrics

0 Cookies

2 Console Messages

Source Level URL
Text
console-api log URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
starting version 20181002
console-api log URL: https://js.stroeermediabrands.de/metaTag.min.b6cc6e3855a78319c5153b2d7d5116b5.js(Line 1)
Message:
SDG: ERROR: RESOURCES: NuggAd was not loaded. Skipping user segments for ad calls.

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.

aax-eu.amazon-adsystem.com
adscale.nuggad.net
adservice.google.com
adservice.google.de
ajax.googleapis.com
ap.lijit.com
apis.google.com
bcp.crwdcntrl.net
beacon.s-onetag.com
c.amazon-adsystem.com
c.nativendo.de
cdn-a.yieldlove.com
cdn.speedcurve.com
cdn.taboola.com
cdn.tynt.com
ce.lijit.com
crops.giga.de
cx.atdmt.com
d.nativendo.de
de.ioam.de
dkuim.de
dx.bigsea.weborama.com
files.giga-video.de
get.s-onetag.com
go.giga-abs.de
gocp.stroeermediabrands.de
googleads.g.doubleclick.net
gslbeacon.lijit.com
hgc-cf-cache-1.svonm.com
ih.adscale.de
imasdk.googleapis.com
irqs.ioam.de
js.adscale.de
js.stroeermediabrands.de
lb70.s400.meetrics.net
maxcdn.bootstrapcdn.com
ml314.com
native.adscale.de
onetag-geo.s-onetag.com
p.adsymptotic.com
pagead2.googlesyndication.com
pd.sharethis.com
ps.eyeota.net
s3.eu-central-1.amazonaws.com
s400.mxcdn.net
script.ioam.de
securepubads.g.doubleclick.net
segments.company-target.com
si.nuggad.net
ssl-econa.met.vgwort.de
ssl.2.damoh.giga.de
static.giga.de
t.nativendo.de
tracking.m6r.eu
vap2ams1.lijit.com
videos.giga.de
www.dunkirkinception.com
www.facebook.com
www.giga.de
www.google-analytics.com
www.googletagservices.com
ap.lijit.com
bcp.crwdcntrl.net
cdn-a.yieldlove.com
cdn.taboola.com
cdn.tynt.com
ce.lijit.com
dkuim.de
dx.bigsea.weborama.com
go.giga-abs.de
lb70.s400.meetrics.net
ml314.com
p.adsymptotic.com
ps.eyeota.net
securepubads.g.doubleclick.net
segments.company-target.com
ssl.2.damoh.giga.de
vap2ams1.lijit.com
www.dunkirkinception.com
104.109.82.87
107.178.241.34
109.71.25.30
13.35.253.56
151.101.14.217
161.156.66.178
178.19.70.100
178.19.72.10
178.19.72.20
18.196.83.183
184.30.220.71
188.40.16.106
193.46.63.75
2.18.233.67
2.18.234.72
2001:4de0:ac19::1:b:1b
216.52.2.19
2600:9000:2057:7c00:5:ae3a:ba00:93a1
2600:9000:2057:be00:1f:287:d20a:ce1
2600:9000:2057:c00:5:9a4c:9b00:93a1
2606:4700:20::6819:ac0d
2a00:1450:4001:809::2002
2a00:1450:4001:81a::200e
2a00:1450:4001:81b::2002
2a00:1450:4001:81d::2002
2a00:1450:4001:81e::200a
2a00:1450:4001:81f::200a
2a00:1450:4001:821::200e
2a03:2880:f0ff:2:face:b00c:0:8c
2a03:2880:f12d:83:face:b00c:0:25de
46.253.113.178
52.219.72.187
52.31.106.135
52.94.216.48
72.251.249.13
80.82.201.88
91.215.100.39
91.215.103.65
99.86.1.198
00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
0b9a08c335995135d79f8d1ff8e4e8770695b383123c3d55da3101486523eaad
0baa1b7da945fc3334d5683c8502c3da91529a8a35afaf0e591be34633adf609
0d52524070b2e4a2456997d37766b9462267226491f74f2b270157a419f86738
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
1539636041ff6ac5a6b2745ff90041198af7b68d46b4aaf5a4541a17f797106a
1710178d2edd4ba651096bc60a9b71a7bbb240ab6c449bb8f3909a68828ad92f
1a560979c35508f894818e1f68012f0a56d6a6001c5dfb73ffeda325fcbafbeb
1c4dab01b38d1d6bc2e6397078efb6c5b01536e0fec18f58091ff7abceca47ce
244a3d4cf47102101d747a3b3829bff737cbeda8a904eba6ec50d62f8b9b5ec4
265de6b562fdaf225b6713104b74342ffe97177ac67505d9e799e3acfa56352b
2d125794eb0e7f8125184a7538c893ca0591c28cc18eac4273b05482025ffcae
2f58ccf14355919dfa5815bebd82d775161bdf2707480201bd8b2334778c0412
31e175ee7e5e7ede77df71cf406ab46af0fed80b9c85ca5a0d27ad899159678a
35637b2df493cc121a7ffc815aa9fadf81ae3f0199e524af5ebe73c7f254e3b7
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c
40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
40f93961d6ae3bccb56837e2e05cae9533c0b07a4a69b2fc776e5f66833fe418
43a795a6f470126a6e79eca19330eab92301736e1d85d78d5e3db5956fd85630
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef
5aeb54f6727af87431148b611f64c2d9608b22f49b71cd313f5e023b0f6ee642
5f7c7709d592c7e19dc12152d7adce8a117f08af40a2facd69c19b495c9a1047
5fad70ffdf4b71962dfba1a6a2a47fa4bbe2501a19f916e71f20850336d99d7b
662fa6bcdf71d8f92e29010d3e2e270e0071e5d19b1d14ce205654a78aa0a7a9
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
694ac85b33d3a898437ea951f6c551029a24887e6fac5585b8a703eb4432b084
6c48963faea211afc0d69c597ad524ec3570ed946c61f94cbebd12fde80213de
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e
6d8ba81d1b60a18707722a1f2b62dad48a6acced95a1933f49a68b5016620b93
6f84c66aac41915f2aee979a975e75ab954663a9ece27924bfab7c8aa4f2fdb5
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
7d655e8cd62ba58d86b3bc9c8e1e04a76506a4dfc852c3b3813deb0aef284548
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
8b9a6de2a0eff9f5a406d140b5cb08df5eb78d96feb5050645521b05400fc283
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0
8f4b1fe543b807aaf259c71db310cbf08ce3df590fbdc9f5b991585faa59c964
914ce0bdc766d33c9529e819034ed85923ea0ad35c2b7a7df247795340df0ecc
94ac201f145004772aeeceb50ca6df57778c8f0974e977ace348a5abd98d539d
953ce6754421c9f924dff139a6540edfb50ff2bc3163443df8b7c95ee7663710
96c1a6c6c786bb22587abb1998d9aca075d75dcdde4aa6633a9997245bdb64b7
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a0611e486e87faf678d732cede5f2b94c26550f87a9e8baf6393ac3e8f96268b
aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
ad16e1b37490fca28df99d039d6373d2fee4d894fcd279d95b90ae872f4d860f
adfa6f7fe5d1ca5b093d2a0738e19be3ca750f0a7d49dbda508aa1e8ecd51842
b239d0824b8b7e496715c699a749b5932581a10e853fbabab377de729255915e
b6b279f748f4b7117df70a60bc27463ca80e5fd711905011b33374a1486127d3
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
ccb23473b8af00a446f5e47731b5b2d29d64ad83ab6c94e5320d81017ad4cf57
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d42e239e3d9534104885e7d6484151b6d9d47dfe2280593dbc2a2fb0a3b39147
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
d9ad3ca4b381bb164bb8176520d39a05becb7464f2c37920feb16994ddd3dc9f
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dd28ac8237e60211a798ccc9ecacec2accc1fd02ee06f6264a3624606cd38831
dd91c7ef6e655b11d7531f6a5e60b65e00004642b3de4c027152cdc5f2fea900
e0f610ff1a3d52e74a61372c942498977c33131a0f2e3f4eb3916eec567eacbd
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
ed12abebf74d61e8a6846dd87861bbe0c58355d207ef453eabd28a82e0519496
ef184624ec8084ef9f3e3a3159b37e847417d50de3aae2561d7335a5766d04d4
f0b10626c2294f4f12f5b76222ceca984f9ac881fc871de81331cc73d81a7a86
f11000893fc389cd3a3a271c39e67cdfeb5252db5368a610a0eec6105f010e62
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f6c88d72ddbc86769c79cd60c2fbffac3679934dca3c2173dc8f919bcbbbfd64
f94e032d892cd03ec8d2e87a139d5598ff586ffd4ddccd14d0cef518730c0821
fa761fced560b3ed22391d3824f89b997b1e9d6adb5c55cfd25de054523d81e9
fa97084fbdeb9baa97595c2384e52cae2b6d4470fdc5855c9422555da29db2d8